test-config.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { mergeConfig } from '@vendure/core';
  2. import {
  3. MysqlInitializer,
  4. PostgresInitializer,
  5. registerInitializer,
  6. SqljsInitializer,
  7. testConfig as defaultTestConfig,
  8. } from '@vendure/testing';
  9. import fs from 'fs-extra';
  10. import path from 'path';
  11. import { DataSourceOptions } from 'typeorm';
  12. import { fileURLToPath } from 'url';
  13. import { getPackageDir } from './get-package-dir';
  14. declare global {
  15. namespace NodeJS {
  16. interface Global {
  17. e2eServerPortsUsed: number[];
  18. }
  19. }
  20. }
  21. /**
  22. * We use a relatively long timeout on the initial beforeAll() function of the
  23. * e2e tests because on the first run (and always in CI) the sqlite databases
  24. * need to be generated, which can take a while.
  25. */
  26. export const TEST_SETUP_TIMEOUT_MS = process.env.E2E_DEBUG ? 1800 * 1000 : 120000;
  27. const packageDir = getPackageDir();
  28. registerInitializer('sqljs', new SqljsInitializer(path.join(packageDir, '__data__')));
  29. registerInitializer('postgres', new PostgresInitializer());
  30. registerInitializer('mysql', new MysqlInitializer());
  31. registerInitializer('mariadb', new MysqlInitializer());
  32. export const testConfig = () => {
  33. // @ts-ignore
  34. const portsFile = fileURLToPath(new URL('ports.json', import.meta.url));
  35. fs.ensureFileSync(portsFile);
  36. let usedPorts: number[];
  37. try {
  38. usedPorts = fs.readJSONSync(portsFile) ?? [3010];
  39. } catch (e: any) {
  40. usedPorts = [3010];
  41. }
  42. const nextPort = Math.max(...usedPorts) + 1;
  43. usedPorts.push(nextPort);
  44. if (100 < usedPorts.length) {
  45. // reset the used ports after it gets 100 entries long
  46. usedPorts = [3010];
  47. }
  48. fs.writeJSONSync(portsFile, usedPorts);
  49. return mergeConfig(defaultTestConfig, {
  50. apiOptions: {
  51. port: nextPort,
  52. },
  53. importExportOptions: {
  54. importAssetsDir: path.join(packageDir, 'fixtures/assets'),
  55. },
  56. dbConnectionOptions: getDbConfig(),
  57. });
  58. };
  59. function getDbConfig(): DataSourceOptions {
  60. const dbType = process.env.DB || 'sqljs';
  61. switch (dbType) {
  62. case 'postgres':
  63. return {
  64. synchronize: true,
  65. type: 'postgres',
  66. host: '127.0.0.1',
  67. port: process.env.CI ? +(process.env.E2E_POSTGRES_PORT || 5432) : 5432,
  68. username: 'admin',
  69. password: 'secret',
  70. };
  71. case 'mariadb':
  72. return {
  73. synchronize: true,
  74. type: 'mariadb',
  75. host: '127.0.0.1',
  76. port: process.env.CI ? +(process.env.E2E_MARIADB_PORT || 3306) : 3306,
  77. username: 'root',
  78. password: '',
  79. };
  80. case 'mysql':
  81. return {
  82. synchronize: true,
  83. type: 'mysql',
  84. host: '127.0.0.1',
  85. port: process.env.CI ? +(process.env.E2E_MYSQL_PORT || 3306) : 3306,
  86. username: 'root',
  87. password: '',
  88. };
  89. case 'sqljs':
  90. default:
  91. return defaultTestConfig.dbConnectionOptions;
  92. }
  93. }