get.test.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { OpenAPIHono } from '@hono/zod-openapi';
  2. import { UserService } from '../../../modules/users/user.service';
  3. import { DataSource } from 'typeorm';
  4. import { createTestServer } from '../../../../test/test-utils';
  5. // Mock 用户服务
  6. jest.mock('../../../modules/users/user.service');
  7. // Mock 数据源
  8. jest.mock('../../../data-source', () => ({
  9. AppDataSource: {
  10. getRepository: jest.fn()
  11. }
  12. }));
  13. describe('GET /users API', () => {
  14. let app: OpenAPIHono;
  15. let mockUserService: jest.Mocked<UserService>;
  16. beforeEach(() => {
  17. jest.clearAllMocks();
  18. // 创建模拟的用户服务
  19. mockUserService = {
  20. getUsersWithPagination: jest.fn()
  21. } as any;
  22. // Mock UserService 构造函数
  23. (UserService as jest.MockedClass<typeof UserService>).mockImplementation(() => mockUserService);
  24. // 动态导入以避免缓存问题
  25. jest.isolateModules(async () => {
  26. const module = await import('../get');
  27. app = module.default;
  28. });
  29. });
  30. describe('参数验证', () => {
  31. it('应该验证页码必须为正整数', async () => {
  32. const server = createTestServer(app);
  33. const response = await server.get('/users?page=0');
  34. expect(response.status).toBe(400);
  35. expect(await response.json()).toMatchObject({
  36. code: 400,
  37. message: '参数错误'
  38. });
  39. });
  40. it('应该验证每页数量必须为正整数', async () => {
  41. const server = createTestServer(app);
  42. const response = await server.get('/users?pageSize=0');
  43. expect(response.status).toBe(400);
  44. expect(await response.json()).toMatchObject({
  45. code: 400,
  46. message: '参数错误'
  47. });
  48. });
  49. it('应该接受有效的分页参数', async () => {
  50. const mockUsers = [{ id: 1, username: 'testuser' }];
  51. const total = 1;
  52. mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
  53. const server = createTestServer(app);
  54. const response = await server.get('/users?page=1&pageSize=10');
  55. expect(response.status).toBe(200);
  56. expect(mockUserService.getUsersWithPagination).toHaveBeenCalledWith({
  57. page: 1,
  58. pageSize: 10,
  59. keyword: undefined
  60. });
  61. });
  62. });
  63. describe('成功响应', () => {
  64. it('应该返回用户列表和分页信息', async () => {
  65. const mockUsers = [
  66. { id: 1, username: 'user1', email: 'user1@example.com' },
  67. { id: 2, username: 'user2', email: 'user2@example.com' }
  68. ];
  69. const total = 2;
  70. mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
  71. const server = createTestServer(app);
  72. const response = await server.get('/users?page=1&pageSize=10');
  73. expect(response.status).toBe(200);
  74. expect(await response.json()).toEqual({
  75. data: mockUsers,
  76. pagination: {
  77. total: 2,
  78. current: 1,
  79. pageSize: 10
  80. }
  81. });
  82. });
  83. it('应该支持关键词搜索', async () => {
  84. const mockUsers = [{ id: 1, username: 'admin' }];
  85. const total = 1;
  86. mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
  87. const server = createTestServer(app);
  88. const response = await server.get('/users?page=1&pageSize=10&keyword=admin');
  89. expect(response.status).toBe(200);
  90. expect(mockUserService.getUsersWithPagination).toHaveBeenCalledWith({
  91. page: 1,
  92. pageSize: 10,
  93. keyword: 'admin'
  94. });
  95. });
  96. });
  97. describe('错误处理', () => {
  98. it('应该在服务抛出错误时返回500错误', async () => {
  99. mockUserService.getUsersWithPagination.mockRejectedValue(new Error('Database error'));
  100. const server = createTestServer(app);
  101. const response = await server.get('/users?page=1&pageSize=10');
  102. expect(response.status).toBe(500);
  103. expect(await response.json()).toMatchObject({
  104. code: 500,
  105. message: 'Database error'
  106. });
  107. });
  108. it('应该在未知错误时返回通用错误消息', async () => {
  109. mockUserService.getUsersWithPagination.mockRejectedValue('Unknown error');
  110. const server = createTestServer(app);
  111. const response = await server.get('/users?page=1&pageSize=10');
  112. expect(response.status).toBe(500);
  113. expect(await response.json()).toMatchObject({
  114. code: 500,
  115. message: '获取用户列表失败'
  116. });
  117. });
  118. });
  119. });