Skip to content

Commit 8019912

Browse files
committed
test: add generic test suite implementation
1 parent 002f28a commit 8019912

File tree

1 file changed

+67
-24
lines changed

1 file changed

+67
-24
lines changed

src/tests/ParameterizedAPI.test.ts

Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
import { enableFetchMocks } from 'jest-fetch-mock';
2-
import fetchMock from 'jest-fetch-mock';
3-
import { OMDbAPI } from '../api/apis/OMDbAPI';
4-
import MediaDbPlugin from '../main';
1+
import fetchMock, { enableFetchMocks } from 'jest-fetch-mock';
52
import { MediaDbPluginSettings } from 'src/settings/Settings';
6-
import { MALAPI } from '../api/apis/MALAPI';
73
import { LocGovAPI } from '../api/apis/LocGovAPI';
4+
import { MALAPI } from '../api/apis/MALAPI';
85
import { MusicBrainzAPI } from '../api/apis/MusicBrainzAPI';
6+
import { OMDbAPI } from '../api/apis/OMDbAPI';
97
import { SteamAPI } from '../api/apis/SteamAPI';
108
import { WikipediaAPI } from '../api/apis/WikipediaAPI';
9+
import MediaDbPlugin from '../main';
10+
import { setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock } from "./mockHelpers";
11+
import MALMockMovie from "./ResponseMocks/MALMockMovie.json";
12+
import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json";
13+
import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json";
14+
import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json";
15+
import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json";
1116

12-
enableFetchMocks()
13-
let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI;
14-
let api: typeof OMDbAPI | typeof MALAPI | typeof LocGovAPI | typeof MusicBrainzAPI | typeof SteamAPI | typeof WikipediaAPI;
17+
enableFetchMocks();
18+
export let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI;
1519

1620
describe.each(
1721
[
@@ -24,44 +28,83 @@ describe.each(
2428
]
2529
)('$name.name', ({ name: parameterizedApi }) => {
2630
beforeAll(() => {
27-
api = parameterizedApi;
28-
let settingsMock: MediaDbPluginSettings = {
29-
} as MediaDbPluginSettings;
31+
let settingsMock: MediaDbPluginSettings = {} as MediaDbPluginSettings;
3032
let pluginMock = {} as MediaDbPlugin;
3133
pluginMock.settings = settingsMock;
32-
// TODO: add fake API key
34+
// TODO: add fake API key?
3335
apiMock = new parameterizedApi(pluginMock);
3436
})
3537

3638
beforeEach(() => {
3739
fetchMock.resetMocks();
3840
})
3941

40-
test("searchByTitle behavior when given garbage data", async () => {
42+
test("searchByTitle behavior when API returns garbage data", async () => {
4143
const garbageResponse = JSON.stringify({
4244
data: "string"
4345
});
4446
fetchMock.mockResponseOnce(garbageResponse)
45-
let res;
46-
// LocGovAPI throws an error because not implemented
47-
if (parameterizedApi.name === "LocGovAPI") {
48-
await expect(apiMock.searchByTitle("sample")).rejects.toThrow();
49-
50-
} else {
51-
res = await apiMock.searchByTitle("sample");
52-
expect(res).toEqual([]);
53-
}
47+
await expect(apiMock.searchByTitle("sample")).resolves.toEqual([]);
48+
// }
5449
expect(fetch).toHaveBeenCalledTimes(1);
5550
});
5651

57-
test("searchByTitle when fetch returns 401", async () => {
52+
test("searchByTitle behavior when requestUrl/fetch returns 401", async () => {
5853
let sampleResponse = {
5954
data: "string"
6055
};
6156
fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 401 });
6257
// TODO: Check API name and fix message
6358
// TODO: Externalize string
64-
await expect(async () => await apiMock.searchByTitle("sample")).rejects.toThrow();
59+
await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${401} from an API.`);
60+
expect(fetchMock).toHaveBeenCalledTimes(1);
61+
});
62+
63+
test("searchByTitle behavior when requestUrl/fetch returns 403", async () => {
64+
let sampleResponse = {
65+
data: "string"
66+
};
67+
fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 403 });
68+
// TODO: Check API name and fix message
69+
// TODO: Externalize string/import?
70+
await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${403} from an API.`);
71+
expect(fetchMock).toHaveBeenCalledTimes(1);
72+
});
73+
74+
test("searchByTitle behavior when requestUrl/fetch returns 200", async () => {
75+
let sampleResponse;
76+
let ret;
77+
switch (parameterizedApi) {
78+
case OMDbAPI:
79+
ret = setOMDbResponseMock();
80+
sampleResponse = OMDBMockMovie;
81+
break;
82+
case WikipediaAPI:
83+
ret = setWikipediaResponseMock();
84+
sampleResponse = WikipediaMockResponse;
85+
break;
86+
case MALAPI:
87+
// TODO: MAL needs more tests for different types of content
88+
ret = setMALResponseMock();
89+
sampleResponse = MALMockMovie;
90+
case LocGovAPI:
91+
// TODO: Add soon
92+
break;
93+
case SteamAPI:
94+
sampleResponse = SteamAPIResponseMock;
95+
ret = setSteamResponseMock();
96+
break;
97+
case MusicBrainzAPI:
98+
sampleResponse = MusicBrainzResponseMock;
99+
ret = setMusicBrainzResponseMock();
100+
break;
101+
default:
102+
throw Error();
103+
}
104+
fetchMock.mockResponse(JSON.stringify(sampleResponse), { status: 200 });
105+
// TODO: Check API name and fix message
106+
// TODO: Externalize string
107+
await expect(apiMock.searchByTitle("Hooking Season Playtest")).resolves.toEqual(ret);
65108
expect(fetchMock).toHaveBeenCalledTimes(1);
66109
});
67110
})

0 commit comments

Comments
 (0)