| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- import { OpenAPIHono } from '@hono/zod-openapi';
- import { UserService } from '../../../modules/users/user.service';
- import { DataSource } from 'typeorm';
- import { createTestServer } from '../../../../test/test-utils';
- import { describe, it, expect, beforeEach, vi } from 'vitest';
- // Mock 用户服务
- vi.mock('../../../modules/users/user.service');
- // Mock 数据源
- vi.mock('../../../data-source', () => ({
- AppDataSource: {
- getRepository: vi.fn()
- }
- }));
- // Mock 认证中间件
- vi.mock('../../../middleware/auth.middleware', () => ({
- authMiddleware: vi.fn().mockImplementation((c, next) => next())
- }));
- describe('GET /users API', () => {
- let app: OpenAPIHono;
- let mockUserService: any;
- beforeEach(async () => {
- vi.clearAllMocks();
- // 创建模拟的用户服务
- mockUserService = {
- getUsersWithPagination: vi.fn()
- } as any;
- // Mock UserService 构造函数
- vi.mocked(UserService).mockImplementation(() => mockUserService);
- // 动态导入以避免缓存问题
- const module = await import('../get');
- app = module.default;
- });
- describe('参数验证', () => {
- it('应该验证页码必须为正整数', async () => {
- const server = createTestServer(app);
- const response = await server.get('/?page=0');
- expect(response.status).toBe(400);
- const responseBody = await response.json();
- expect(responseBody.success).toBe(false);
- expect(responseBody.error).toBeDefined();
- expect(responseBody.error.name).toBe('ZodError');
- });
- it('应该验证每页数量必须为正整数', async () => {
- const server = createTestServer(app);
- const response = await server.get('/?pageSize=0');
- expect(response.status).toBe(400);
- const responseBody = await response.json();
- expect(responseBody.success).toBe(false);
- expect(responseBody.error).toBeDefined();
- expect(responseBody.error.name).toBe('ZodError');
- });
- it('应该接受有效的分页参数', async () => {
- const mockUsers = [{ id: 1, username: 'testuser' }];
- const total = 1;
- mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
- const server = createTestServer(app);
- const response = await server.get('/?page=1&pageSize=10');
- expect(response.status).toBe(200);
- expect(mockUserService.getUsersWithPagination).toHaveBeenCalledWith({
- page: 1,
- pageSize: 10,
- keyword: undefined
- });
- });
- });
- describe('成功响应', () => {
- it('应该返回用户列表和分页信息', async () => {
- const mockUsers = [
- { id: 1, username: 'user1', email: 'user1@example.com' },
- { id: 2, username: 'user2', email: 'user2@example.com' }
- ];
- const total = 2;
- mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
- const server = createTestServer(app);
- const response = await server.get('/?page=1&pageSize=10');
- expect(response.status).toBe(200);
- expect(await response.json()).toEqual({
- data: mockUsers,
- pagination: {
- total: 2,
- current: 1,
- pageSize: 10
- }
- });
- });
- it('应该支持关键词搜索', async () => {
- const mockUsers = [{ id: 1, username: 'admin' }];
- const total = 1;
- mockUserService.getUsersWithPagination.mockResolvedValue([mockUsers as any, total]);
- const server = createTestServer(app);
- const response = await server.get('/?page=1&pageSize=10&keyword=admin');
- expect(response.status).toBe(200);
- expect(mockUserService.getUsersWithPagination).toHaveBeenCalledWith({
- page: 1,
- pageSize: 10,
- keyword: 'admin'
- });
- });
- });
- describe('错误处理', () => {
- it('应该在服务抛出错误时返回500错误', async () => {
- mockUserService.getUsersWithPagination.mockRejectedValue(new Error('Database error'));
- const server = createTestServer(app);
- const response = await server.get('/?page=1&pageSize=10');
- expect(response.status).toBe(500);
- expect(await response.json()).toMatchObject({
- code: 500,
- message: 'Database error'
- });
- });
- it('应该在未知错误时返回通用错误消息', async () => {
- mockUserService.getUsersWithPagination.mockRejectedValue('Unknown error');
- const server = createTestServer(app);
- const response = await server.get('/?page=1&pageSize=10');
- expect(response.status).toBe(500);
- expect(await response.json()).toMatchObject({
- code: 500,
- message: '获取用户列表失败'
- });
- });
- });
- });
|