integration-test-db.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { DataSource } from 'typeorm';
  2. import { beforeEach, afterEach } from 'vitest';
  3. import { UserEntity } from '@/server/modules/users/user.entity';
  4. import { Role } from '@/server/modules/users/role.entity';
  5. import { ActivityEntity, ActivityType } from '@/server/modules/activities/activity.entity';
  6. import { RouteEntity } from '@/server/modules/routes/route.entity';
  7. import { AppDataSource } from '@/server/data-source';
  8. /**
  9. * 集成测试数据库工具类 - 使用真实PostgreSQL数据库
  10. */
  11. export class IntegrationTestDatabase {
  12. /**
  13. * 清理集成测试数据库
  14. */
  15. static async cleanup(): Promise<void> {
  16. if (AppDataSource.isInitialized) {
  17. await AppDataSource.destroy();
  18. }
  19. }
  20. /**
  21. * 获取当前数据源
  22. */
  23. static async getDataSource(): Promise<DataSource> {
  24. if(!AppDataSource.isInitialized) {
  25. await AppDataSource.initialize();
  26. }
  27. return AppDataSource
  28. }
  29. }
  30. /**
  31. * 测试数据工厂类
  32. */
  33. export class TestDataFactory {
  34. /**
  35. * 创建测试用户数据
  36. */
  37. static createUserData(overrides: Partial<UserEntity> = {}): Partial<UserEntity> {
  38. const timestamp = Date.now();
  39. return {
  40. username: `testuser_${timestamp}`,
  41. password: 'TestPassword123!',
  42. email: `test_${timestamp}@example.com`,
  43. phone: `138${timestamp.toString().slice(-8)}`,
  44. nickname: `Test User ${timestamp}`,
  45. name: `Test Name ${timestamp}`,
  46. isDisabled: 0,
  47. isDeleted: 0,
  48. ...overrides
  49. };
  50. }
  51. /**
  52. * 创建测试角色数据
  53. */
  54. static createRoleData(overrides: Partial<Role> = {}): Partial<Role> {
  55. const timestamp = Date.now();
  56. return {
  57. name: `test_role_${timestamp}`,
  58. description: `Test role description ${timestamp}`,
  59. ...overrides
  60. };
  61. }
  62. /**
  63. * 在数据库中创建测试用户
  64. */
  65. static async createTestUser(dataSource: DataSource, overrides: Partial<UserEntity> = {}): Promise<UserEntity> {
  66. const userData = this.createUserData(overrides);
  67. const userRepository = dataSource.getRepository(UserEntity);
  68. const user = userRepository.create(userData);
  69. return await userRepository.save(user);
  70. }
  71. /**
  72. * 在数据库中创建测试角色
  73. */
  74. static async createTestRole(dataSource: DataSource, overrides: Partial<Role> = {}): Promise<Role> {
  75. const roleData = this.createRoleData(overrides);
  76. const roleRepository = dataSource.getRepository(Role);
  77. const role = roleRepository.create(roleData);
  78. return await roleRepository.save(role);
  79. }
  80. /**
  81. * 创建测试活动数据
  82. */
  83. static createActivityData(overrides: Partial<ActivityEntity> = {}): Partial<ActivityEntity> {
  84. const timestamp = Date.now();
  85. const now = new Date();
  86. const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
  87. return {
  88. name: `测试活动_${timestamp}`,
  89. description: `测试活动描述_${timestamp}`,
  90. type: ActivityType.DEPARTURE,
  91. startDate: now,
  92. endDate: tomorrow,
  93. isDisabled: 0,
  94. isDeleted: 0,
  95. ...overrides
  96. };
  97. }
  98. /**
  99. * 创建测试路线数据
  100. */
  101. static createRouteData(overrides: Partial<RouteEntity> = {}): Partial<RouteEntity> {
  102. const timestamp = Date.now();
  103. const now = new Date();
  104. const departureTime = new Date(now.getTime() + 2 * 60 * 60 * 1000); // 2小时后
  105. return {
  106. name: `测试路线_${timestamp}`,
  107. startPoint: `出发地_${timestamp}`,
  108. endPoint: `目的地_${timestamp}`,
  109. departureTime: departureTime,
  110. vehicleType: 'bus',
  111. price: 100,
  112. seatCount: 40,
  113. isDisabled: 0,
  114. isDeleted: 0,
  115. ...overrides
  116. };
  117. }
  118. /**
  119. * 在数据库中创建测试活动
  120. */
  121. static async createTestActivity(dataSource: DataSource, overrides: Partial<ActivityEntity> = {}): Promise<ActivityEntity> {
  122. const activityData = this.createActivityData(overrides);
  123. const activityRepository = dataSource.getRepository(ActivityEntity);
  124. const activity = activityRepository.create(activityData);
  125. return await activityRepository.save(activity);
  126. }
  127. /**
  128. * 在数据库中创建测试路线
  129. */
  130. static async createTestRoute(dataSource: DataSource, overrides: Partial<RouteEntity> = {}): Promise<RouteEntity> {
  131. const routeData = this.createRouteData(overrides);
  132. const routeRepository = dataSource.getRepository(RouteEntity);
  133. const route = routeRepository.create(routeData);
  134. return await routeRepository.save(route);
  135. }
  136. }
  137. /**
  138. * 集成测试数据库生命周期钩子
  139. */
  140. export function setupIntegrationDatabaseHooks() {
  141. beforeEach(async () => {
  142. await IntegrationTestDatabase.getDataSource();
  143. });
  144. afterEach(async () => {
  145. await IntegrationTestDatabase.cleanup();
  146. });
  147. }