前段

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