test-data-factory.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import { IntegrationTestDatabase } from './integration-test-db';
  2. import { EntityTarget, ObjectLiteral } from 'typeorm';
  3. /**
  4. * 测试数据工厂
  5. * 用于创建多租户测试数据,减少重复代码
  6. */
  7. export class TestDataFactory {
  8. /**
  9. * 创建测试用户
  10. */
  11. static async createTestUser(overrides: Partial<any> = {}): Promise<any> {
  12. const dataSource = await IntegrationTestDatabase.getDataSource();
  13. const userRepository = dataSource.getRepository('UserEntityMt');
  14. const defaultUser = {
  15. username: `test_user_${Date.now()}`,
  16. password: 'test_password',
  17. nickname: '测试用户',
  18. registrationSource: 'web',
  19. tenantId: 1
  20. };
  21. const userData = { ...defaultUser, ...overrides };
  22. const user = userRepository.create(userData);
  23. return await userRepository.save(user);
  24. }
  25. /**
  26. * 创建测试地区数据
  27. */
  28. static async createTestArea(overrides: Partial<any> = {}): Promise<any> {
  29. const dataSource = await IntegrationTestDatabase.getDataSource();
  30. const areaRepository = dataSource.getRepository('AreaEntityMt');
  31. const defaultArea = {
  32. name: '测试地区',
  33. code: '110000',
  34. level: 1,
  35. parentId: null,
  36. tenantId: 1
  37. };
  38. const areaData = { ...defaultArea, ...overrides };
  39. const area = areaRepository.create(areaData);
  40. return await areaRepository.save(area);
  41. }
  42. /**
  43. * 创建测试省份数据
  44. */
  45. static async createTestProvince(overrides: Partial<any> = {}): Promise<any> {
  46. return await this.createTestArea({
  47. name: '北京市',
  48. code: '110000',
  49. level: 1, // PROVINCE
  50. parentId: null,
  51. ...overrides
  52. });
  53. }
  54. /**
  55. * 创建测试城市数据
  56. */
  57. static async createTestCity(provinceId: number, overrides: Partial<any> = {}): Promise<any> {
  58. return await this.createTestArea({
  59. name: '北京市',
  60. code: '110100',
  61. level: 2, // CITY
  62. parentId: provinceId,
  63. ...overrides
  64. });
  65. }
  66. /**
  67. * 创建测试区县数据
  68. */
  69. static async createTestDistrict(cityId: number, overrides: Partial<any> = {}): Promise<any> {
  70. return await this.createTestArea({
  71. name: '朝阳区',
  72. code: '110105',
  73. level: 3, // DISTRICT
  74. parentId: cityId,
  75. ...overrides
  76. });
  77. }
  78. /**
  79. * 创建测试配送地址数据
  80. */
  81. static async createTestDeliveryAddress(
  82. userId: number,
  83. provinceId: number,
  84. cityId: number,
  85. districtId: number,
  86. overrides: Partial<any> = {}
  87. ): Promise<any> {
  88. const dataSource = await IntegrationTestDatabase.getDataSource();
  89. const deliveryAddressRepository = dataSource.getRepository('DeliveryAddressMt');
  90. const defaultAddress = {
  91. userId,
  92. name: '测试收货人',
  93. phone: '13800138000',
  94. address: '测试详细地址',
  95. receiverProvince: provinceId,
  96. receiverCity: cityId,
  97. receiverDistrict: districtId,
  98. receiverTown: 1,
  99. state: 1,
  100. isDefault: 0,
  101. createdBy: userId,
  102. tenantId: 1
  103. };
  104. const addressData = { ...defaultAddress, ...overrides };
  105. const address = deliveryAddressRepository.create(addressData);
  106. return await deliveryAddressRepository.save(address);
  107. }
  108. /**
  109. * 创建完整的测试数据集合
  110. */
  111. static async createTestDataSet(tenantId: number = 1): Promise<{
  112. user: any;
  113. otherUser: any;
  114. province: any;
  115. city: any;
  116. district: any;
  117. }> {
  118. // 创建测试用户
  119. const user = await this.createTestUser({ tenantId });
  120. const otherUser = await this.createTestUser({
  121. username: `other_user_${Date.now()}`,
  122. nickname: '其他用户',
  123. tenantId
  124. });
  125. // 创建测试地区数据
  126. const province = await this.createTestProvince({ tenantId });
  127. const city = await this.createTestCity(province.id, { tenantId });
  128. const district = await this.createTestDistrict(city.id, { tenantId });
  129. return {
  130. user,
  131. otherUser,
  132. province,
  133. city,
  134. district
  135. };
  136. }
  137. /**
  138. * 通用实体创建方法
  139. */
  140. static async createEntity<T extends ObjectLiteral>(
  141. entity: EntityTarget<T>,
  142. data: Partial<T>
  143. ): Promise<T> {
  144. const dataSource = await IntegrationTestDatabase.getDataSource();
  145. const repository = dataSource.getRepository(entity);
  146. const entityInstance = repository.create(data as T);
  147. return await repository.save(entityInstance);
  148. }
  149. /**
  150. * 批量创建实体
  151. */
  152. static async createEntities<T extends ObjectLiteral>(
  153. entity: EntityTarget<T>,
  154. dataArray: Partial<T>[]
  155. ): Promise<T[]> {
  156. const dataSource = await IntegrationTestDatabase.getDataSource();
  157. const repository = dataSource.getRepository(entity);
  158. const entities = dataArray.map(data => repository.create(data as T));
  159. return await repository.save(entities);
  160. }
  161. /**
  162. * 清理测试数据
  163. */
  164. static async cleanupTestData(entities: EntityTarget<any>[]): Promise<void> {
  165. const dataSource = await IntegrationTestDatabase.getDataSource();
  166. for (const entity of entities) {
  167. const repository = dataSource.getRepository(entity);
  168. await repository.clear();
  169. }
  170. }
  171. }