test-data-factory.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { IntegrationTestDatabase } from '@d8d/shared-test-util';
  2. import { UnifiedAdvertisement } from '../../src/entities/unified-advertisement.entity';
  3. import { UnifiedAdvertisementType } from '../../src/entities/unified-advertisement-type.entity';
  4. import type { EntityTarget, ObjectLiteral } from 'typeorm';
  5. /**
  6. * 统一广告模块测试数据工厂
  7. */
  8. export class UnifiedAdvertisementTestDataFactory {
  9. /**
  10. * 创建测试广告类型
  11. */
  12. static async createTestAdvertisementType(overrides: Partial<UnifiedAdvertisementType> = {}): Promise<UnifiedAdvertisementType> {
  13. const dataSource = await IntegrationTestDatabase.getDataSource();
  14. const repository = dataSource.getRepository(UnifiedAdvertisementType);
  15. const timestamp = Date.now();
  16. const defaultData: Partial<UnifiedAdvertisementType> = {
  17. name: `测试广告类型_${timestamp}`,
  18. code: `test_type_${timestamp}`,
  19. remark: '测试用广告类型',
  20. status: 1,
  21. createdAt: new Date(),
  22. updatedAt: new Date()
  23. };
  24. const typeData = { ...defaultData, ...overrides };
  25. const entity = repository.create(typeData);
  26. return await repository.save(entity);
  27. }
  28. /**
  29. * 创建测试广告
  30. */
  31. static async createTestAdvertisement(overrides: Partial<UnifiedAdvertisement> = {}): Promise<UnifiedAdvertisement> {
  32. const dataSource = await IntegrationTestDatabase.getDataSource();
  33. const repository = dataSource.getRepository(UnifiedAdvertisement);
  34. const timestamp = Date.now();
  35. // 如果没有提供typeId,先创建一个广告类型
  36. let typeId = overrides.typeId;
  37. if (!typeId) {
  38. const adType = await this.createTestAdvertisementType();
  39. typeId = adType.id;
  40. }
  41. const defaultData: Partial<UnifiedAdvertisement> = {
  42. title: `测试广告_${timestamp}`,
  43. typeId,
  44. code: `test_ad_${timestamp}`,
  45. url: 'https://example.com',
  46. imageFileId: null,
  47. sort: 0,
  48. status: 1,
  49. actionType: 1,
  50. createdAt: new Date(),
  51. updatedAt: new Date(),
  52. createdBy: 1,
  53. updatedBy: 1
  54. };
  55. const adData = { ...defaultData, ...overrides };
  56. const entity = repository.create(adData);
  57. return await repository.save(entity);
  58. }
  59. /**
  60. * 创建完整的测试数据集合
  61. */
  62. static async createTestDataSet(): Promise<{
  63. advertisementType: UnifiedAdvertisementType;
  64. advertisement: UnifiedAdvertisement;
  65. }> {
  66. const advertisementType = await this.createTestAdvertisementType();
  67. const advertisement = await this.createTestAdvertisement({ typeId: advertisementType.id });
  68. return {
  69. advertisementType,
  70. advertisement
  71. };
  72. }
  73. /**
  74. * 通用实体创建方法
  75. */
  76. static async createEntity<T extends ObjectLiteral>(
  77. entity: EntityTarget<T>,
  78. data: Partial<T>
  79. ): Promise<T> {
  80. const dataSource = await IntegrationTestDatabase.getDataSource();
  81. const repository = dataSource.getRepository(entity);
  82. const entityInstance = repository.create(data as T);
  83. return await repository.save(entityInstance);
  84. }
  85. /**
  86. * 批量创建实体
  87. */
  88. static async createEntities<T extends ObjectLiteral>(
  89. entity: EntityTarget<T>,
  90. dataArray: Partial<T>[]
  91. ): Promise<T[]> {
  92. const dataSource = await IntegrationTestDatabase.getDataSource();
  93. const repository = dataSource.getRepository(entity);
  94. const entities = dataArray.map(data => repository.create(data as T));
  95. return await repository.save(entities);
  96. }
  97. /**
  98. * 清理测试数据
  99. */
  100. static async cleanupTestData(): Promise<void> {
  101. const dataSource = await IntegrationTestDatabase.getDataSource();
  102. await dataSource.getRepository(UnifiedAdvertisement).clear();
  103. await dataSource.getRepository(UnifiedAdvertisementType).clear();
  104. }
  105. }