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