2021-03-28 23:17:47 +02:00
|
|
|
import { createTestClient } from "apollo-server-testing";
|
|
|
|
|
import { ApolloServer } from "apollo-server-micro";
|
|
|
|
|
import faker from "faker";
|
2021-06-12 22:44:56 +02:00
|
|
|
import { htmlRes, resolveFetchWith } from "@tests/commonUtils";
|
|
|
|
|
import { typeDefs, resolvers } from "@pages/api/graphql";
|
2021-03-28 23:17:47 +02:00
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
fetchMock.resetMocks();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { query } = createTestClient(new ApolloServer({ typeDefs, resolvers }));
|
|
|
|
|
|
|
|
|
|
it("doesn't trigger fetch if neither target nor audio are specified", async () => {
|
|
|
|
|
const text = faker.random.words();
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($text: String!) {
|
|
|
|
|
translation(query: $text) {
|
|
|
|
|
source {
|
|
|
|
|
text
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { text }
|
|
|
|
|
});
|
|
|
|
|
expect(data).toMatchObject({ translation: { source: { text } } });
|
|
|
|
|
expect(fetch).not.toHaveBeenCalled();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("returns translation triggering fetch", async () => {
|
|
|
|
|
const text = faker.random.words();
|
|
|
|
|
const translation = faker.random.words();
|
|
|
|
|
resolveFetchWith(htmlRes(translation));
|
|
|
|
|
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($text: String!) {
|
|
|
|
|
translation(query: $text) {
|
|
|
|
|
target {
|
|
|
|
|
text
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { text }
|
|
|
|
|
});
|
|
|
|
|
expect(data).toMatchObject({ translation: { target: { text: translation } } });
|
|
|
|
|
expect(fetch).toHaveBeenCalledTimes(1);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("returns audio triggering fetch", async () => {
|
|
|
|
|
const lang = faker.random.locale();
|
|
|
|
|
const text = faker.random.words();
|
|
|
|
|
resolveFetchWith({ status: 200 });
|
|
|
|
|
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($lang: String! $text: String!) {
|
|
|
|
|
audio(lang: $lang query: $text) {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
text
|
|
|
|
|
audio
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { lang, text }
|
|
|
|
|
});
|
2021-08-30 21:35:22 +02:00
|
|
|
expect(data).toMatchObject({ audio: { lang: { code: lang }, text, audio: expect.any(Array) } });
|
2021-03-28 23:17:47 +02:00
|
|
|
expect(fetch).toHaveBeenCalledTimes(1);
|
|
|
|
|
});
|
|
|
|
|
|
2021-08-30 21:35:22 +02:00
|
|
|
it("returns null and throws on translation error", async () => {
|
2021-03-28 23:17:47 +02:00
|
|
|
const text = faker.random.words();
|
|
|
|
|
fetchMock.mockRejectOnce();
|
|
|
|
|
|
2021-08-30 21:35:22 +02:00
|
|
|
const { data, errors } = await query({
|
2021-03-28 23:17:47 +02:00
|
|
|
query: `
|
|
|
|
|
query($text: String!) {
|
|
|
|
|
translation(query: $text) {
|
|
|
|
|
target {
|
|
|
|
|
text
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { text }
|
|
|
|
|
});
|
2021-08-30 21:35:22 +02:00
|
|
|
expect(data).toBeNull();
|
|
|
|
|
expect(errors).toBeTruthy();
|
2021-03-28 23:17:47 +02:00
|
|
|
});
|
|
|
|
|
|
2021-08-30 21:35:22 +02:00
|
|
|
it("returns null and throws on audio error", async () => {
|
2021-03-28 23:17:47 +02:00
|
|
|
const lang = faker.random.locale();
|
|
|
|
|
const text = faker.random.words();
|
|
|
|
|
fetchMock.mockRejectOnce();
|
|
|
|
|
|
2021-08-30 21:35:22 +02:00
|
|
|
const { data, errors } = await query({
|
2021-03-28 23:17:47 +02:00
|
|
|
query: `
|
|
|
|
|
query($lang: String! $text: String!) {
|
|
|
|
|
audio(lang: $lang query: $text) {
|
|
|
|
|
audio
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { lang, text }
|
|
|
|
|
});
|
2021-08-30 21:35:22 +02:00
|
|
|
expect(data).toBeNull();
|
|
|
|
|
expect(errors).toBeTruthy();
|
2021-03-28 23:17:47 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("keeps a default value for both source and target languages", async () => {
|
|
|
|
|
const text = faker.random.words();
|
2021-08-30 21:35:22 +02:00
|
|
|
const translation = faker.random.words();
|
|
|
|
|
resolveFetchWith(htmlRes(translation));
|
2021-03-28 23:17:47 +02:00
|
|
|
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($text: String!) {
|
|
|
|
|
translation(query: $text) {
|
|
|
|
|
source {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
name
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
}
|
|
|
|
|
target {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
name
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { text }
|
|
|
|
|
});
|
2021-08-30 21:35:22 +02:00
|
|
|
expect(data).toMatchObject({
|
|
|
|
|
translation: {
|
|
|
|
|
source: {
|
|
|
|
|
lang: {
|
|
|
|
|
code: "auto",
|
|
|
|
|
name: "Detect"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
target: {
|
|
|
|
|
lang: {
|
|
|
|
|
code: "en",
|
|
|
|
|
name: "English"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2021-03-28 23:17:47 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("throws error on empty query in translation", async () => {
|
|
|
|
|
const { errors } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query {
|
|
|
|
|
translation {
|
|
|
|
|
source {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
}
|
|
|
|
|
target {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
});
|
|
|
|
|
expect(errors).toBeTruthy();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("throws error on empty lang or query in audio", async () => {
|
|
|
|
|
const lang = faker.random.locale();
|
|
|
|
|
const text = faker.random.words();
|
|
|
|
|
|
|
|
|
|
const { errors: queryErrors } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($lang: String!) {
|
|
|
|
|
audio(lang: $lang) {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
text
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { lang }
|
|
|
|
|
});
|
|
|
|
|
expect(queryErrors).toBeTruthy();
|
|
|
|
|
|
|
|
|
|
const { errors: langErrors } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($text: String!) {
|
|
|
|
|
audio(query: $text) {
|
2021-08-30 21:35:22 +02:00
|
|
|
lang {
|
|
|
|
|
code
|
|
|
|
|
}
|
2021-03-28 23:17:47 +02:00
|
|
|
text
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { text }
|
|
|
|
|
});
|
|
|
|
|
expect(langErrors).toBeTruthy();
|
|
|
|
|
});
|
2021-08-30 21:35:22 +02:00
|
|
|
|
|
|
|
|
it("returns languages on empty type", async () => {
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query {
|
|
|
|
|
languages {
|
|
|
|
|
code
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
});
|
|
|
|
|
expect(data).toMatchObject({ languages: expect.any(Array) });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("returns languages on 'source' type", async () => {
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($type: LangType!) {
|
|
|
|
|
languages(type: $type) {
|
|
|
|
|
code
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { type: "SOURCE" }
|
|
|
|
|
});
|
|
|
|
|
expect(data).toMatchObject({ languages: expect.any(Array) });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("returns languages on 'target' type", async () => {
|
|
|
|
|
const { data } = await query({
|
|
|
|
|
query: `
|
|
|
|
|
query($type: LangType!) {
|
|
|
|
|
languages(type: $type) {
|
|
|
|
|
code
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`,
|
|
|
|
|
variables: { type: "TARGET" }
|
|
|
|
|
});
|
|
|
|
|
expect(data).toMatchObject({ languages: expect.any(Array) });
|
|
|
|
|
});
|