test: add generic test suite implementation

This commit is contained in:
AB1908 2022-09-17 15:45:24 +05:30
parent 002f28a02b
commit 801991213d

View file

@ -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);
});
})