populate-for-testing.ts 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* tslint:disable:no-console */
  2. import { INestApplication, INestMicroservice } from '@nestjs/common';
  3. import { LanguageCode } from '@vendure/common/lib/generated-types';
  4. import fs from 'fs-extra';
  5. import { setConfig } from '../src/config/config-helpers';
  6. import { VendureConfig } from '../src/config/vendure-config';
  7. import { clearAllTables } from './clear-all-tables';
  8. import { populateCustomers } from './populate-customers';
  9. export interface PopulateOptions {
  10. logging?: boolean;
  11. customerCount: number;
  12. productsCsvPath: string;
  13. initialDataPath: string;
  14. }
  15. // tslint:disable:no-floating-promises
  16. /**
  17. * Clears all tables from the database and populates with (deterministic) random data.
  18. */
  19. export async function populateForTesting(
  20. config: VendureConfig,
  21. bootstrapFn: (config: VendureConfig) => Promise<[INestApplication, INestMicroservice | undefined]>,
  22. options: PopulateOptions,
  23. ): Promise<[INestApplication, INestMicroservice | undefined]> {
  24. (config.dbConnectionOptions as any).logging = false;
  25. const logging = options.logging === undefined ? true : options.logging;
  26. const originalRequireVerification = config.authOptions.requireVerification;
  27. config.authOptions.requireVerification = false;
  28. setConfig(config);
  29. await clearAllTables(config, logging);
  30. const [app, worker] = await bootstrapFn(config);
  31. await populateInitialData(app, options.initialDataPath, logging);
  32. await populateProducts(app, options.productsCsvPath, logging);
  33. await populateCollections(app, options.initialDataPath, logging);
  34. await populateCustomers(options.customerCount, config, logging);
  35. config.authOptions.requireVerification = originalRequireVerification;
  36. return [app, worker];
  37. }
  38. async function populateInitialData(app: INestApplication, initialDataPath: string, logging: boolean) {
  39. const { Populator } = await import('../src/data-import/providers/populator/populator');
  40. const { initialData } = await import(initialDataPath);
  41. const populator = app.get(Populator);
  42. try {
  43. await populator.populateInitialData(initialData);
  44. if (logging) {
  45. console.log(`\nPopulated initial data`);
  46. }
  47. } catch (err) {
  48. console.error(err.message);
  49. }
  50. }
  51. async function populateCollections(app: INestApplication, initialDataPath: string, logging: boolean) {
  52. const { Populator } = await import('../src/data-import/providers/populator/populator');
  53. const { initialData } = await import(initialDataPath);
  54. if (!initialData.collections.length) {
  55. return;
  56. }
  57. const populator = app.get(Populator);
  58. try {
  59. await populator.populateCollections(initialData);
  60. if (logging) {
  61. console.log(`\nCreated ${initialData.collections.length} Collections`);
  62. }
  63. } catch (err) {
  64. console.error(err);
  65. }
  66. }
  67. async function populateProducts(app: INestApplication, productsCsvPath: string, logging: boolean) {
  68. const { Importer } = await import('../src/data-import/providers/importer/importer');
  69. const importer = app.get(Importer);
  70. const productData = await fs.readFile(productsCsvPath, 'utf-8');
  71. const importResult = await importer.parseAndImport(productData, LanguageCode.en, false).toPromise();
  72. if (importResult.errors && importResult.errors.length) {
  73. console.log(`${importResult.errors.length} errors encountered when importing product data:`);
  74. await console.log(importResult.errors.join('\n'));
  75. }
  76. if (logging) {
  77. console.log(`\nImported ${importResult.imported} products`);
  78. }
  79. }