request.test.ts 2.12 KB
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();
  });
});