Skip to content

Commit 5bc8a1d

Browse files
author
Daniil Yankouski
committed
Cover axios adapters and utils by unit tests
1 parent 2612c3f commit 5bc8a1d

File tree

8 files changed

+271
-182
lines changed

8 files changed

+271
-182
lines changed

configs/jest/config.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type JestConfig = Partial<
1212
process.env.TZ = 'UTC'
1313

1414
const config: JestConfig = {
15-
collectCoverageFrom: ['<rootDir>/src/{domain,data,presentation,core}/**/*.ts'],
15+
collectCoverageFrom: ['<rootDir>/src/{domain,data,core}/**/*.ts'],
1616
coverageDirectory: 'coverage',
1717
coveragePathIgnorePatterns: [
1818
'<rootDir>/node_modules',
@@ -22,6 +22,7 @@ const config: JestConfig = {
2222
'<rootDir>/src/presentation/web/app.component.tsx',
2323
'.d.ts',
2424
'.mock.ts',
25+
'index.ts',
2526
],
2627
coverageThreshold: {
2728
global: {
@@ -35,12 +36,8 @@ const config: JestConfig = {
3536
'ts-jest': {
3637
tsconfig: '<rootDir>/tsconfig.json',
3738
},
38-
window: {
39-
document: {
40-
cookie: ''
41-
}
42-
},
4339
...BuildDefine,
40+
UI_VERSION: '0.0.123'
4441
},
4542
moduleDirectories: ['<rootDir>/node_modules', '<rootDir>/node_modules/@types', '<rootDir>/src'],
4643
moduleNameMapper: {

configs/jest/setup.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'reflect-metadata';
2-
// re-export everything
3-
export * from '@testing-library/react';
4-
2+
// @ts-ignore
3+
global.document = {}
4+
// @ts-ignore
5+
global.window = {document: {cookie: ''}}
56
// override another methods here
67
// render
8+
export * from '@testing-library/react';
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import axios, { AxiosRequestConfig } from 'axios';
2+
import { AbortPromise } from 'core/http';
3+
import { AxiosAbortAdapter } from '../axios-abort.adapter';
4+
5+
jest.mock('axios', () => {
6+
const mockAxios = {
7+
defaults: {
8+
adapter: jest.fn(config => {
9+
if (!config) {
10+
throw new Error('mockAdapterError');
11+
}
12+
13+
return Promise.resolve();
14+
}),
15+
},
16+
};
17+
18+
return {
19+
create: jest.fn(() => mockAxios),
20+
...mockAxios,
21+
};
22+
});
23+
24+
describe('AxiosAbortAdapters', () => {
25+
let axiosAbortAdapter: AxiosAbortAdapter;
26+
27+
beforeEach(() => {
28+
axiosAbortAdapter = new AxiosAbortAdapter();
29+
});
30+
31+
afterEach(() => {
32+
jest.restoreAllMocks();
33+
});
34+
35+
it('should execute adapter with default axios adapter', async () => {
36+
const spyAbortController = jest.spyOn(AbortController.prototype, 'abort');
37+
const config: AxiosRequestConfig = {
38+
data: { key: 'value' },
39+
method: 'GET',
40+
params: { pages: 2 },
41+
url: 'example.com',
42+
};
43+
const response: AbortPromise<any> = axiosAbortAdapter.execute(config);
44+
expect(response?.abort).toBeInstanceOf(Function);
45+
response.abort();
46+
expect(spyAbortController).toHaveBeenCalled();
47+
await response;
48+
expect(axios.defaults.adapter).toBeCalledWith(config);
49+
spyAbortController.mockReset();
50+
spyAbortController.mockRestore();
51+
});
52+
53+
it('should execute adapter and catch an error', async () => {
54+
try {
55+
const config: AxiosRequestConfig = null;
56+
await axiosAbortAdapter.execute(config);
57+
} catch (error) {
58+
expect(error).toBeInstanceOf(Error);
59+
expect(error.message).toBe('mockAdapterError');
60+
}
61+
});
62+
});
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { AxiosPromise, AxiosRequestConfig } from 'axios';
2+
import { AxiosAbortAdapter } from '../axios-abort.adapter';
3+
import { AxiosMemoAdapter } from '../axios-memo.adapter';
4+
5+
describe('AxiosMemoAdapter', () => {
6+
let axiosAbortAdapter: AxiosAbortAdapter;
7+
let axiosMemoAdapter: AxiosMemoAdapter;
8+
9+
let spyAxiosAbortExecute;
10+
11+
beforeEach(() => {
12+
axiosAbortAdapter = new AxiosAbortAdapter();
13+
axiosMemoAdapter = new AxiosMemoAdapter(axiosAbortAdapter);
14+
spyAxiosAbortExecute = jest.spyOn(axiosAbortAdapter, 'execute').mockImplementation(
15+
(): AxiosPromise<string> =>
16+
Promise.resolve({
17+
config: {},
18+
data: 'response',
19+
headers: {},
20+
status: 200,
21+
statusText: 'OK',
22+
}),
23+
);
24+
});
25+
26+
afterEach(() => {
27+
jest.restoreAllMocks();
28+
spyAxiosAbortExecute.mockReset();
29+
spyAxiosAbortExecute.mockRestore();
30+
});
31+
32+
it('shouldn`t put request into cache', async () => {
33+
const spyGetKey = jest.spyOn(AxiosMemoAdapter, 'getKey').mockImplementation(() => 'key');
34+
const config: AxiosRequestConfig = {
35+
data: { key: 'value' },
36+
method: 'GET',
37+
params: { pages: 2 },
38+
url: 'example.com',
39+
};
40+
await axiosMemoAdapter.execute(config);
41+
42+
expect(spyAxiosAbortExecute).toHaveBeenCalledWith(config);
43+
expect(spyGetKey).toHaveBeenLastCalledWith(config);
44+
45+
await axiosMemoAdapter.execute(config);
46+
47+
expect(spyAxiosAbortExecute).toHaveBeenCalledTimes(2);
48+
expect(spyGetKey).toHaveBeenCalledTimes(2);
49+
spyGetKey.mockReset();
50+
spyGetKey.mockRestore();
51+
});
52+
53+
it('should put request into cache', async () => {
54+
const config: AxiosRequestConfig = {
55+
data: { key: 'value' },
56+
headers: { cached: true },
57+
method: 'GET',
58+
params: { pages: 2 },
59+
url: 'example.com',
60+
};
61+
await axiosMemoAdapter.execute(config);
62+
63+
expect(spyAxiosAbortExecute).toHaveBeenCalledWith(config);
64+
65+
await axiosMemoAdapter.execute(config);
66+
67+
expect(spyAxiosAbortExecute).toHaveBeenCalledTimes(1);
68+
69+
await axiosMemoAdapter.execute({
70+
...config,
71+
headers: {},
72+
});
73+
74+
expect(spyAxiosAbortExecute).toHaveBeenCalledTimes(2);
75+
});
76+
77+
it('should catch an error', async () => {
78+
spyAxiosAbortExecute = jest
79+
.spyOn(axiosAbortAdapter, 'execute')
80+
.mockImplementation((): AxiosPromise<string> => {
81+
throw new Error('mockExecuteError');
82+
});
83+
const config: AxiosRequestConfig = {
84+
data: { key: 'value' },
85+
headers: { cached: true },
86+
method: 'GET',
87+
params: { pages: 2 },
88+
url: 'example.com',
89+
};
90+
try {
91+
await axiosMemoAdapter.execute(config);
92+
} catch (error) {
93+
expect(error).toBeInstanceOf(Error);
94+
expect(error.message).toBe('mockExecuteError');
95+
}
96+
});
97+
});

0 commit comments

Comments
 (0)