ソースを参照

✅ test(users): 完善用户API集成测试

- 启用并更新关键词搜索测试,验证getList调用参数
- 启用并完善GET /users/:id测试组,包括:
  - 验证特定用户信息返回
  - 用户不存在时404状态码返回
  - 用户ID格式验证
- 启用错误处理测试组,验证服务错误和未知错误处理
- 启用认证和授权测试组,验证令牌缺失和无效令牌场景
- 更新认证中间件模拟方式,使用vi.mocked替代旧有模拟方法
yourname 2 ヶ月 前
コミット
bdbc013664
1 ファイル変更104 行追加106 行削除
  1. 104 106
      src/server/api/__integration_tests__/users.integration.test.ts

+ 104 - 106
src/server/api/__integration_tests__/users.integration.test.ts

@@ -144,112 +144,110 @@ describe('Users API Integration Tests', () => {
       });
     });
 
-    // it('应该支持关键词搜索', async () => {
-    //   const mockCrudService = require('../../../utils/generic-crud.service').GenericCrudService();
-    //   mockCrudService.getList.mockResolvedValue([[], 0]);
-
-    //   const response = await apiClient.get('/?page=1&pageSize=10&keyword=admin');
-
-    //   expect(response.status).toBe(200);
-    //   expect(mockCrudService.getList).toHaveBeenCalledWith(
-    //     expect.objectContaining({
-    //       page: 1,
-    //       pageSize: 10,
-    //       keyword: 'admin'
-    //     })
-    //   );
-    // });
+    it('应该支持关键词搜索', async () => {
+      mockCrudService.getList.mockResolvedValue([[], 0]);
+
+      const response = await apiClient.get('/?page=1&pageSize=10&keyword=admin');
+
+      expect(response.status).toBe(200);
+      expect(mockCrudService.getList).toHaveBeenCalledWith(
+        1,
+        10,
+        'admin',
+        ['username', 'nickname', 'phone', 'email'],
+        undefined,
+        ['roles'],
+        expect.any(Object),
+        undefined
+      );
+    });
+  });
+
+  describe('GET /users/:id', () => {
+    it('应该返回特定用户信息', async () => {
+      const mockUser = { id: 1, username: 'testuser', email: 'test@example.com' };
+      mockCrudService.getById.mockResolvedValue(mockUser);
+
+      const response = await apiClient.get('/1');
+
+      expect(response.status).toBe(200);
+      expect(response.data).toEqual(mockUser);
+      expect(mockCrudService.getById).toHaveBeenCalledWith(1, ['roles']);
+    });
+
+    it('应该在用户不存在时返回404', async () => {
+      mockCrudService.getById.mockResolvedValue(null);
+
+      const response = await apiClient.get('/999');
+
+      expect(response.status).toBe(404);
+      expect(response.data).toMatchObject({
+        code: 404,
+        message: expect.any(String)
+      });
+    });
+
+    it('应该验证用户ID格式', async () => {
+      const response = await apiClient.get('/invalid');
+
+      expect(response.status).toBe(400);
+      expect(response.data).toMatchObject({
+        success: false,
+        error: expect.any(Object)
+      });
+    });
   });
 
-  // describe('GET /users/:id', () => {
-  //   it('应该返回特定用户信息', async () => {
-  //     const mockUser = { id: 1, username: 'testuser', email: 'test@example.com' };
-  //     const mockCrudService = require('../../../utils/generic-crud.service').GenericCrudService();
-  //     mockCrudService.getById.mockResolvedValue(mockUser);
-
-  //     const response = await apiClient.get('/1');
-
-  //     expect(response.status).toBe(200);
-  //     expect(response.data).toEqual(mockUser);
-  //     expect(mockCrudService.getById).toHaveBeenCalledWith(1);
-  //   });
-
-  //   it('应该在用户不存在时返回404', async () => {
-  //     const mockCrudService = require('../../../utils/generic-crud.service').GenericCrudService();
-  //     mockCrudService.getById.mockResolvedValue(null);
-
-  //     const response = await apiClient.get('/999');
-
-  //     expect(response.status).toBe(404);
-  //     expect(response.data).toMatchObject({
-  //       code: 404,
-  //       message: expect.any(String)
-  //     });
-  //   });
-
-  //   it('应该验证用户ID格式', async () => {
-  //     const response = await apiClient.get('/invalid');
-
-  //     expect(response.status).toBe(400);
-  //     expect(response.data).toMatchObject({
-  //       success: false,
-  //       error: expect.any(Object)
-  //     });
-  //   });
-  // });
-
-  // describe('错误处理', () => {
-  //   it('应该在服务错误时返回500状态码', async () => {
-  //     const mockCrudService = require('../../../utils/generic-crud.service').GenericCrudService();
-  //     mockCrudService.getList.mockRejectedValue(new Error('Database error'));
-
-  //     const response = await apiClient.get('/?page=1&pageSize=10');
-
-  //     expect(response.status).toBe(500);
-  //     expect(response.data).toMatchObject({
-  //       code: 500,
-  //       message: 'Database error'
-  //     });
-  //   });
-
-  //   it('应该在未知错误时返回通用错误消息', async () => {
-  //     const mockCrudService = require('../../../utils/generic-crud.service').GenericCrudService();
-  //     mockCrudService.getList.mockRejectedValue('Unknown error');
-
-  //     const response = await apiClient.get('/?page=1&pageSize=10');
-
-  //     expect(response.status).toBe(500);
-  //     expect(response.data).toMatchObject({
-  //       code: 500,
-  //       message: '获取用户列表失败'
-  //     });
-  //   });
-  // });
-
-  // describe('认证和授权', () => {
-  //   it('应该在缺少认证令牌时返回401', async () => {
-  //     apiClient.clearAuthToken();
-
-  //     const response = await apiClient.get('/');
-
-  //     expect(response.status).toBe(401);
-  //     expect(response.data).toMatchObject({
-  //       code: 401,
-  //       message: expect.any(String)
-  //     });
-  //   });
-
-  //   it('应该在无效令牌时返回401', async () => {
-  //     // 模拟认证中间件验证失败
-  //     const authMiddleware = require('../../middleware/auth.middleware').authMiddleware;
-  //     authMiddleware.mockImplementation((c: any) => {
-  //       return c.json({ error: 'Invalid token' }, 401);
-  //     });
-
-  //     const response = await apiClient.get('/');
-
-  //     expect(response.status).toBe(401);
-  //     expect(response.data).toEqual({ error: 'Invalid token' });
-  //   });
-  // });
+  describe('错误处理', () => {
+    it('应该在服务错误时返回500状态码', async () => {
+      mockCrudService.getList.mockRejectedValue(new Error('Database error'));
+
+      const response = await apiClient.get('/?page=1&pageSize=10');
+
+      expect(response.status).toBe(500);
+      expect(response.data).toMatchObject({
+        code: 500,
+        message: 'Database error'
+      });
+    });
+
+    it('应该在未知错误时返回通用错误消息', async () => {
+      mockCrudService.getList.mockRejectedValue('Unknown error');
+
+      const response = await apiClient.get('/?page=1&pageSize=10');
+
+      expect(response.status).toBe(500);
+      expect(response.data).toMatchObject({
+        code: 500,
+        message: '获取用户列表失败'
+      });
+    });
+  });
+
+  describe('认证和授权', () => {
+    it('应该在缺少认证令牌时返回401', async () => {
+      apiClient.clearAuthToken();
+
+      const response = await apiClient.get('/');
+
+      expect(response.status).toBe(401);
+      expect(response.data).toMatchObject({
+        code: 401,
+        message: expect.any(String)
+      });
+    });
+
+    it('应该在无效令牌时返回401', async () => {
+      // 模拟认证中间件验证失败
+      const { authMiddleware } = await import('../../middleware/auth.middleware');
+      vi.mocked(authMiddleware).mockImplementation((c: any) => {
+        return c.json({ error: 'Invalid token' }, 401);
+      });
+
+      const response = await apiClient.get('/');
+
+      expect(response.status).toBe(401);
+      expect(response.data).toEqual({ error: 'Invalid token' });
+    });
+  });
 });