request.test.ts
2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { describe, it, expect, beforeEach } from 'vitest';
import MockAdapter from 'axios-mock-adapter';
import request, { ApiError, TOKEN_STORAGE_KEY, NETWORK_ERROR_CODE } from '../../src/api/request';
describe('request (Axios 实例)', () => {
let mock: MockAdapter;
beforeEach(() => {
mock = new MockAdapter(request);
localStorage.clear();
});
it('baseURL is /api', () => {
expect(request.defaults.baseURL).toBe('/api');
});
it('unwraps data when code is 0', async () => {
mock.onGet('/ping').reply(200, { code: 0, message: 'success', data: { foo: 1 } });
const data = await request.get('/ping');
expect(data).toEqual({ foo: 1 });
});
it('throws ApiError carrying business code when code is non-zero', async () => {
mock.onPost('/usr/login').reply(200, { code: 40101, message: '认证失败', data: null });
await expect(request.post('/usr/login', {})).rejects.toMatchObject({
name: 'ApiError',
code: 40101,
});
await expect(request.post('/usr/login', {})).rejects.toBeInstanceOf(ApiError);
});
it('throws network ApiError on no-response error', async () => {
mock.onGet('/usr/companies').networkError();
await expect(request.get('/usr/companies')).rejects.toMatchObject({
name: 'ApiError',
code: NETWORK_ERROR_CODE,
});
});
it('injects Authorization header when token present', async () => {
localStorage.setItem(TOKEN_STORAGE_KEY, 'tk-123');
let seenAuth: string | undefined;
mock.onGet('/usr/users').reply((config) => {
seenAuth = config.headers?.Authorization as string | undefined;
return [200, { code: 0, message: 'success', data: [] }];
});
await request.get('/usr/users');
expect(seenAuth).toBe('Bearer tk-123');
});
it('does not inject Authorization header when no token', async () => {
let seenAuth: string | undefined;
mock.onGet('/usr/companies').reply((config) => {
seenAuth = config.headers?.Authorization as string | undefined;
return [200, { code: 0, message: 'success', data: [] }];
});
await request.get('/usr/companies');
expect(seenAuth).toBeUndefined();
});
});