service-stubs.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { vi } from 'vitest';
  2. /**
  3. * 创建模拟的用户服务
  4. */
  5. export function createMockUserService() {
  6. return {
  7. getUserById: vi.fn().mockResolvedValue(null),
  8. getUserByUsername: vi.fn().mockResolvedValue(null),
  9. getUserByEmail: vi.fn().mockResolvedValue(null),
  10. createUser: vi.fn().mockResolvedValue({ id: 1, username: 'testuser' }),
  11. updateUser: vi.fn().mockResolvedValue({ affected: 1 }),
  12. deleteUser: vi.fn().mockResolvedValue({ affected: 1 }),
  13. changePassword: vi.fn().mockResolvedValue({ affected: 1 }),
  14. verifyPassword: vi.fn().mockResolvedValue(true),
  15. assignRole: vi.fn().mockResolvedValue({ affected: 1 }),
  16. removeRole: vi.fn().mockResolvedValue({ affected: 1 })
  17. };
  18. }
  19. /**
  20. * 创建模拟的认证服务
  21. */
  22. export function createMockAuthService() {
  23. return {
  24. login: vi.fn().mockResolvedValue({
  25. token: 'mock-jwt-token',
  26. user: { id: 1, username: 'testuser' }
  27. }),
  28. logout: vi.fn().mockResolvedValue(undefined),
  29. register: vi.fn().mockResolvedValue({ id: 1, username: 'newuser' }),
  30. verifyToken: vi.fn().mockResolvedValue({ id: 1, username: 'testuser' }),
  31. refreshToken: vi.fn().mockResolvedValue({ token: 'new-mock-jwt-token' }),
  32. forgotPassword: vi.fn().mockResolvedValue({ success: true }),
  33. resetPassword: vi.fn().mockResolvedValue({ success: true })
  34. };
  35. }
  36. /**
  37. * 创建模拟的角色服务
  38. */
  39. export function createMockRoleService() {
  40. return {
  41. getRoles: vi.fn().mockResolvedValue([]),
  42. getRoleById: vi.fn().mockResolvedValue(null),
  43. createRole: vi.fn().mockResolvedValue({ id: 1, name: 'admin' }),
  44. updateRole: vi.fn().mockResolvedValue({ affected: 1 }),
  45. deleteRole: vi.fn().mockResolvedValue({ affected: 1 }),
  46. assignPermission: vi.fn().mockResolvedValue({ affected: 1 }),
  47. removePermission: vi.fn().mockResolvedValue({ affected: 1 })
  48. };
  49. }
  50. /**
  51. * 创建模拟的通用CRUD服务
  52. */
  53. export function createMockCrudService() {
  54. return {
  55. findAll: vi.fn().mockResolvedValue([]),
  56. findOne: vi.fn().mockResolvedValue(null),
  57. create: vi.fn().mockResolvedValue({ id: 1 }),
  58. update: vi.fn().mockResolvedValue({ affected: 1 }),
  59. delete: vi.fn().mockResolvedValue({ affected: 1 }),
  60. count: vi.fn().mockResolvedValue(0),
  61. exists: vi.fn().mockResolvedValue(false)
  62. };
  63. }
  64. /**
  65. * 创建模拟的邮件服务
  66. */
  67. export function createMockEmailService() {
  68. return {
  69. sendWelcomeEmail: vi.fn().mockResolvedValue({ success: true }),
  70. sendPasswordResetEmail: vi.fn().mockResolvedValue({ success: true }),
  71. sendNotification: vi.fn().mockResolvedValue({ success: true }),
  72. verifyEmail: vi.fn().mockResolvedValue({ success: true })
  73. };
  74. }
  75. /**
  76. * 创建模拟的文件服务
  77. */
  78. export function createMockFileService() {
  79. return {
  80. upload: vi.fn().mockResolvedValue({ url: 'https://example.com/file.jpg' }),
  81. download: vi.fn().mockResolvedValue(Buffer.from('test content')),
  82. delete: vi.fn().mockResolvedValue({ success: true }),
  83. getSignedUrl: vi.fn().mockResolvedValue('https://example.com/signed-url')
  84. };
  85. }
  86. /**
  87. * 服务stub工具类
  88. */
  89. export class ServiceStubManager {
  90. private stubs = new Map<string, any>();
  91. /**
  92. * 创建服务stub
  93. */
  94. createStub<T>(serviceName: string, stubImplementation: Partial<T>): T {
  95. const stub = { ...stubImplementation } as T;
  96. this.stubs.set(serviceName, stub);
  97. return stub;
  98. }
  99. /**
  100. * 获取服务stub
  101. */
  102. getStub<T>(serviceName: string): T | undefined {
  103. return this.stubs.get(serviceName);
  104. }
  105. /**
  106. * 重置所有stub
  107. */
  108. resetAll(): void {
  109. this.stubs.clear();
  110. }
  111. /**
  112. * 重置特定stub
  113. */
  114. resetStub(serviceName: string): void {
  115. this.stubs.delete(serviceName);
  116. }
  117. }
  118. /**
  119. * 全局服务stub管理器
  120. */
  121. export const serviceStubs = new ServiceStubManager();
  122. /**
  123. * 设置服务mock
  124. */
  125. export function setupServiceMocks() {
  126. // 用户服务mock
  127. vi.mock('../../../src/server/modules/users/user.service', () => ({
  128. UserService: vi.fn().mockImplementation(() => serviceStubs.createStub('UserService', createMockUserService()))
  129. }));
  130. // 认证服务mock
  131. vi.mock('../../../src/server/modules/auth/auth.service', () => ({
  132. AuthService: vi.fn().mockImplementation(() => serviceStubs.createStub('AuthService', createMockAuthService()))
  133. }));
  134. // 角色服务mock
  135. vi.mock('../../../src/server/modules/roles/role.service', () => ({
  136. RoleService: vi.fn().mockImplementation(() => serviceStubs.createStub('RoleService', createMockRoleService()))
  137. }));
  138. // 通用CRUD服务mock
  139. vi.mock('../../../src/server/utils/generic-crud.service', () => ({
  140. GenericCRUDService: vi.fn().mockImplementation(() => serviceStubs.createStub('GenericCRUDService', createMockCrudService()))
  141. }));
  142. }