test-auth.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { vi } from 'vitest';
  2. /**
  3. * 创建模拟的认证上下文
  4. */
  5. export function createMockAuthContext(overrides: Partial<any> = {}) {
  6. const baseContext = {
  7. req: {
  8. header: (name: string) => {
  9. const headers: Record<string, string> = {
  10. 'authorization': 'Bearer test-token-123',
  11. 'content-type': 'application/json',
  12. 'user-agent': 'vitest/integration-test',
  13. 'x-request-id': `test_${Math.random().toString(36).substr(2, 9)}`
  14. };
  15. return headers[name.toLowerCase()] || null;
  16. }
  17. },
  18. set: vi.fn(),
  19. json: vi.fn().mockImplementation((data, status = 200) => ({
  20. status,
  21. body: data
  22. })),
  23. status: vi.fn().mockReturnThis(),
  24. body: vi.fn().mockReturnThis(),
  25. env: {
  26. NODE_ENV: 'test',
  27. DATABASE_URL: process.env.TEST_DATABASE_URL || 'mysql://root:test@localhost:3306/test_d8dai'
  28. },
  29. var: {},
  30. get: vi.fn()
  31. };
  32. return { ...baseContext, ...overrides };
  33. }
  34. /**
  35. * 创建模拟的JWT用户信息
  36. */
  37. export function createMockJwtPayload(overrides: Partial<any> = {}) {
  38. return {
  39. sub: '1',
  40. username: 'testuser',
  41. email: 'test@example.com',
  42. roles: ['user'],
  43. iat: Math.floor(Date.now() / 1000),
  44. exp: Math.floor(Date.now() / 1000) + 3600, // 1小时后过期
  45. ...overrides
  46. };
  47. }
  48. /**
  49. * 创建模拟的认证中间件
  50. */
  51. export function createMockAuthMiddleware() {
  52. return vi.fn().mockImplementation(async (c: any, next: () => Promise<void>) => {
  53. // 模拟认证用户信息
  54. c.set('user', {
  55. id: 1,
  56. username: 'testuser',
  57. email: 'test@example.com',
  58. roles: ['user']
  59. });
  60. await next();
  61. });
  62. }
  63. /**
  64. * 创建模拟的权限中间件
  65. */
  66. export function createMockPermissionMiddleware(requiredRoles: string[] = []) {
  67. return vi.fn().mockImplementation(async (c: any, next: () => Promise<void>) => {
  68. const user = c.get('user');
  69. if (!user) {
  70. return c.json({ error: 'Unauthorized' }, 401);
  71. }
  72. if (requiredRoles.length > 0) {
  73. const hasRole = requiredRoles.some(role => user.roles?.includes(role));
  74. if (!hasRole) {
  75. return c.json({ error: 'Forbidden' }, 403);
  76. }
  77. }
  78. await next();
  79. });
  80. }