From 801991213d417ea902cfe21b46ac85979d7b458c Mon Sep 17 00:00:00 2001 From: AB1908 <14124383+AB1908@users.noreply.github.com> Date: Sat, 17 Sep 2022 15:45:24 +0530 Subject: [PATCH] test: add generic test suite implementation --- src/tests/ParameterizedAPI.test.ts | 91 ++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git a/src/tests/ParameterizedAPI.test.ts b/src/tests/ParameterizedAPI.test.ts index 0e5e7d1..bf1703e 100644 --- a/src/tests/ParameterizedAPI.test.ts +++ b/src/tests/ParameterizedAPI.test.ts @@ -1,17 +1,21 @@ -import { enableFetchMocks } from 'jest-fetch-mock'; -import fetchMock from 'jest-fetch-mock'; -import { OMDbAPI } from '../api/apis/OMDbAPI'; -import MediaDbPlugin from '../main'; +import fetchMock, { enableFetchMocks } from 'jest-fetch-mock'; import { MediaDbPluginSettings } from 'src/settings/Settings'; -import { MALAPI } from '../api/apis/MALAPI'; import { LocGovAPI } from '../api/apis/LocGovAPI'; +import { MALAPI } from '../api/apis/MALAPI'; import { MusicBrainzAPI } from '../api/apis/MusicBrainzAPI'; +import { OMDbAPI } from '../api/apis/OMDbAPI'; import { SteamAPI } from '../api/apis/SteamAPI'; import { WikipediaAPI } from '../api/apis/WikipediaAPI'; +import MediaDbPlugin from '../main'; +import { setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock } from "./mockHelpers"; +import MALMockMovie from "./ResponseMocks/MALMockMovie.json"; +import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json"; +import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json"; +import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json"; +import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json"; -enableFetchMocks() -let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI; -let api: typeof OMDbAPI | typeof MALAPI | typeof LocGovAPI | typeof MusicBrainzAPI | typeof SteamAPI | typeof WikipediaAPI; +enableFetchMocks(); +export let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI; describe.each( [ @@ -24,12 +28,10 @@ describe.each( ] )('$name.name', ({ name: parameterizedApi }) => { beforeAll(() => { - api = parameterizedApi; - let settingsMock: MediaDbPluginSettings = { - } as MediaDbPluginSettings; + let settingsMock: MediaDbPluginSettings = {} as MediaDbPluginSettings; let pluginMock = {} as MediaDbPlugin; pluginMock.settings = settingsMock; - // TODO: add fake API key + // TODO: add fake API key? apiMock = new parameterizedApi(pluginMock); }) @@ -37,31 +39,72 @@ describe.each( fetchMock.resetMocks(); }) - test("searchByTitle behavior when given garbage data", async () => { + test("searchByTitle behavior when API returns garbage data", async () => { const garbageResponse = JSON.stringify({ data: "string" }); fetchMock.mockResponseOnce(garbageResponse) - let res; - // LocGovAPI throws an error because not implemented - if (parameterizedApi.name === "LocGovAPI") { - await expect(apiMock.searchByTitle("sample")).rejects.toThrow(); - - } else { - res = await apiMock.searchByTitle("sample"); - expect(res).toEqual([]); - } + await expect(apiMock.searchByTitle("sample")).resolves.toEqual([]); + // } expect(fetch).toHaveBeenCalledTimes(1); }); - test("searchByTitle when fetch returns 401", async () => { + test("searchByTitle behavior when requestUrl/fetch returns 401", async () => { let sampleResponse = { data: "string" }; fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 401 }); // TODO: Check API name and fix message // TODO: Externalize string - await expect(async () => await apiMock.searchByTitle("sample")).rejects.toThrow(); + await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${401} from an API.`); + expect(fetchMock).toHaveBeenCalledTimes(1); + }); + + test("searchByTitle behavior when requestUrl/fetch returns 403", async () => { + let sampleResponse = { + data: "string" + }; + fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 403 }); + // TODO: Check API name and fix message + // TODO: Externalize string/import? + await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${403} from an API.`); + expect(fetchMock).toHaveBeenCalledTimes(1); + }); + + test("searchByTitle behavior when requestUrl/fetch returns 200", async () => { + let sampleResponse; + let ret; + switch (parameterizedApi) { + case OMDbAPI: + ret = setOMDbResponseMock(); + sampleResponse = OMDBMockMovie; + break; + case WikipediaAPI: + ret = setWikipediaResponseMock(); + sampleResponse = WikipediaMockResponse; + break; + case MALAPI: + // TODO: MAL needs more tests for different types of content + ret = setMALResponseMock(); + sampleResponse = MALMockMovie; + case LocGovAPI: + // TODO: Add soon + break; + case SteamAPI: + sampleResponse = SteamAPIResponseMock; + ret = setSteamResponseMock(); + break; + case MusicBrainzAPI: + sampleResponse = MusicBrainzResponseMock; + ret = setMusicBrainzResponseMock(); + break; + default: + throw Error(); + } + fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 200 }); + // TODO: Check API name and fix message + // TODO: Externalize string + await expect(apiMock.searchByTitle("Hooking Season Playtest")).resolves.toEqual(ret); expect(fetchMock).toHaveBeenCalledTimes(1); }); }) \ No newline at end of file