populate-for-testing.ts 3.5 KB

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