前段
Change-Id: I718d4d07ea03c6d2b6bcbd4d426c5d1af2201bf4
diff --git a/src/api/auth.test.js b/src/api/auth.test.js
new file mode 100644
index 0000000..c9ace4d
--- /dev/null
+++ b/src/api/auth.test.js
@@ -0,0 +1,114 @@
+import MockAdapter from 'axios-mock-adapter';
+import { api, login, register, getUserInfo } from './auth';
+
+describe('auth API', () => {
+ let mockAxios;
+
+ beforeEach(() => {
+ // 确保使用我们导出的 api 实例
+ mockAxios = new MockAdapter(api);
+ localStorage.clear();
+ });
+
+ afterEach(() => {
+ mockAxios.restore();
+ });
+
+ describe('login', () => {
+ it('should send login request with username and password', async () => {
+ const mockResponse = {
+ code: 200,
+ data: {
+ token: 'mock-token',
+ // 确保响应结构与实际API一致
+ userInfo: { username: 'testuser' }
+ },
+ message: '登录成功'
+ };
+
+ mockAxios.onPost('/user/login').reply(200, mockResponse);
+
+ const response = await login('testuser', 'testpass');
+
+ expect(response.data).toEqual(mockResponse);
+ // 检查token是否存入localStorage
+ expect(localStorage.getItem('token')).toBe('mock-token');
+ });
+
+
+ it('should handle login failure', async () => {
+ mockAxios.onPost('/user/login').reply(401);
+
+ await expect(login('wronguser', 'wrongpass')).rejects.toThrow();
+ });
+ });
+
+ describe('register', () => {
+ it('should send register request with username, password and code', async () => {
+ const mockResponse = {
+ code: 200,
+ message: '注册成功'
+ };
+
+ mockAxios.onPost('/user/regist').reply(200, mockResponse);
+
+ const response = await register('newuser', 'newpass', 'invite123');
+
+ expect(response.data).toEqual(mockResponse);
+ });
+
+ it('should handle registration failure', async () => {
+ mockAxios.onPost('/user/regist').reply(400);
+
+ await expect(register('newuser', 'newpass', 'wrongcode')).rejects.toThrow();
+ });
+ });
+
+ describe('getUserInfo', () => {
+ it('should send request with token to get user info', async () => {
+ const mockResponse = {
+ code: 200,
+ data: { username: 'testuser', role: 'user' }
+ };
+
+ mockAxios.onGet('/user/info').reply(200, mockResponse);
+
+ const response = await getUserInfo('test-token');
+
+ expect(response.data).toEqual(mockResponse);
+ });
+
+ it('should handle unauthorized request', async () => {
+ mockAxios.onGet('/user/info').reply(401);
+
+ await expect(getUserInfo('invalid-token')).rejects.toThrow();
+ });
+ });
+
+ describe('request interceptor', () => {
+ it('should add Authorization header when token exists', async () => {
+ localStorage.setItem('token', 'test-token');
+ const mockResponse = { data: 'success' };
+
+ mockAxios.onGet('/test').reply((config) => {
+ expect(config.headers.Authorization).toBe('Bearer test-token');
+ return [200, mockResponse];
+ });
+
+ const response = await api.get('/test');
+ expect(response.data).toEqual(mockResponse);
+ });
+
+ it('should not add Authorization header when token does not exist', async () => {
+ const mockResponse = { data: 'success' };
+
+ mockAxios.onGet('/test').reply((config) => {
+ expect(config.headers.Authorization).toBeUndefined();
+ return [200, mockResponse];
+ });
+
+ const response = await api.get('/test');
+ expect(response.data).toEqual(mockResponse);
+ });
+ });
+});
\ No newline at end of file