瀏覽代碼

chore: Run e2e tests in parallel

Michael Bromley 4 年之前
父節點
當前提交
26ca960d4a
共有 72 個文件被更改,包括 147 次插入135 次删除
  1. 1 0
      .gitignore
  2. 2 2
      e2e-common/get-package-dir.js
  3. 5 0
      e2e-common/jest-config.js
  4. 39 11
      e2e-common/test-config.ts
  5. 1 5
      packages/asset-server-plugin/e2e/asset-server-plugin.e2e-spec.ts
  6. 1 1
      packages/asset-server-plugin/package.json
  7. 1 1
      packages/core/e2e/administrator.e2e-spec.ts
  8. 1 1
      packages/core/e2e/apollo-server-plugin.e2e-spec.ts
  9. 1 1
      packages/core/e2e/asset-channel.e2e-spec.ts
  10. 1 1
      packages/core/e2e/asset.e2e-spec.ts
  11. 1 1
      packages/core/e2e/auth.e2e-spec.ts
  12. 1 1
      packages/core/e2e/authentication-strategy.e2e-spec.ts
  13. 1 1
      packages/core/e2e/channel.e2e-spec.ts
  14. 3 18
      packages/core/e2e/collection.e2e-spec.ts
  15. 1 1
      packages/core/e2e/configurable-operation.e2e-spec.ts
  16. 1 1
      packages/core/e2e/country.e2e-spec.ts
  17. 5 2
      packages/core/e2e/custom-field-relations.e2e-spec.ts
  18. 2 2
      packages/core/e2e/custom-fields.e2e-spec.ts
  19. 1 1
      packages/core/e2e/custom-permissions.e2e-spec.ts
  20. 1 1
      packages/core/e2e/customer-channel.e2e-spec.ts
  21. 2 2
      packages/core/e2e/customer-group.e2e-spec.ts
  22. 1 1
      packages/core/e2e/customer.e2e-spec.ts
  23. 1 1
      packages/core/e2e/database-transactions.e2e-spec.ts
  24. 2 2
      packages/core/e2e/default-search-plugin.e2e-spec.ts
  25. 1 1
      packages/core/e2e/entity-hydrator.e2e-spec.ts
  26. 1 1
      packages/core/e2e/entity-id-strategy.e2e-spec.ts
  27. 1 1
      packages/core/e2e/entity-uuid-strategy.e2e-spec.ts
  28. 4 3
      packages/core/e2e/facet.e2e-spec.ts
  29. 2 2
      packages/core/e2e/fulfillment-process.e2e-spec.ts
  30. 1 1
      packages/core/e2e/global-settings.e2e-spec.ts
  31. 1 1
      packages/core/e2e/import.e2e-spec.ts
  32. 6 5
      packages/core/e2e/job-queue.e2e-spec.ts
  33. 1 1
      packages/core/e2e/lifecycle.e2e-spec.ts
  34. 1 1
      packages/core/e2e/list-query-builder.e2e-spec.ts
  35. 1 1
      packages/core/e2e/localization.e2e-spec.ts
  36. 1 1
      packages/core/e2e/order-changed-price-handling.e2e-spec.ts
  37. 1 1
      packages/core/e2e/order-channel.e2e-spec.ts
  38. 1 1
      packages/core/e2e/order-fulfillment.e2e-spec.ts
  39. 1 1
      packages/core/e2e/order-item-price-calculation-strategy.e2e-spec.ts
  40. 1 1
      packages/core/e2e/order-merge.e2e-spec.ts
  41. 1 1
      packages/core/e2e/order-modification.e2e-spec.ts
  42. 3 4
      packages/core/e2e/order-process.e2e-spec.ts
  43. 1 1
      packages/core/e2e/order-promotion.e2e-spec.ts
  44. 1 1
      packages/core/e2e/order-taxes.e2e-spec.ts
  45. 1 1
      packages/core/e2e/order.e2e-spec.ts
  46. 1 1
      packages/core/e2e/parallel-transactions.e2e-spec.ts
  47. 1 1
      packages/core/e2e/payment-method.e2e-spec.ts
  48. 1 1
      packages/core/e2e/payment-process.e2e-spec.ts
  49. 3 2
      packages/core/e2e/plugin.e2e-spec.ts
  50. 1 1
      packages/core/e2e/product-channel.e2e-spec.ts
  51. 1 1
      packages/core/e2e/product-option.e2e-spec.ts
  52. 1 1
      packages/core/e2e/product.e2e-spec.ts
  53. 1 1
      packages/core/e2e/promotion.e2e-spec.ts
  54. 1 1
      packages/core/e2e/role.e2e-spec.ts
  55. 3 3
      packages/core/e2e/session-management.e2e-spec.ts
  56. 3 4
      packages/core/e2e/shipping-method-eligibility.e2e-spec.ts
  57. 1 1
      packages/core/e2e/shipping-method.e2e-spec.ts
  58. 4 4
      packages/core/e2e/shop-auth.e2e-spec.ts
  59. 1 1
      packages/core/e2e/shop-catalog.e2e-spec.ts
  60. 1 1
      packages/core/e2e/shop-customer.e2e-spec.ts
  61. 2 3
      packages/core/e2e/shop-order.e2e-spec.ts
  62. 1 1
      packages/core/e2e/stock-control.e2e-spec.ts
  63. 1 1
      packages/core/e2e/tag.e2e-spec.ts
  64. 1 1
      packages/core/e2e/tax-category.e2e-spec.ts
  65. 2 2
      packages/core/e2e/tax-rate.e2e-spec.ts
  66. 1 1
      packages/core/e2e/translations.e2e-spec.ts
  67. 2 2
      packages/core/e2e/zone.e2e-spec.ts
  68. 1 1
      packages/core/package.json
  69. 1 4
      packages/elasticsearch-plugin/e2e/elasticsearch-plugin-uuid.e2e-spec.ts
  70. 1 4
      packages/elasticsearch-plugin/e2e/elasticsearch-plugin.e2e-spec.ts
  71. 1 1
      packages/elasticsearch-plugin/package.json
  72. 1 1
      packages/job-queue-plugin/e2e/bullmq-job-queue-plugin.e2e-spec.ts

+ 1 - 0
.gitignore

@@ -26,6 +26,7 @@ docs/content/graphql-api/*
 !docs/content/graphql-api/admin/_index.md
 .vscode/
 yarn-error.log
+e2e-common/ports.json
 
 # Sensitive or high-churn files:
 .idea/**/dataSources/

+ 2 - 2
e2e-common/get-package-dir.js

@@ -4,14 +4,14 @@ const path = require('path');
  * @return {string}
  */
 function getPackageDir() {
-    const packageArg = process.argv.find(arg => arg.startsWith('--package='));
+    const packageArg = process.env.packageArg || process.argv.find(arg => arg.startsWith('--package='));
 
     if (!packageArg) {
         console.error('No package specified! Please pass --package=<packageDirName>');
         process.exit(1);
     }
     const packageDirname = packageArg.split('=')[1];
-    return path.join(__dirname, '../packages', packageDirname, 'e2e')
+    return path.join(__dirname, '../packages', packageDirname, 'e2e');
 }
 
 module.exports = { getPackageDir };

+ 5 - 0
e2e-common/jest-config.js

@@ -1,6 +1,11 @@
 const path = require('path');
 const { getPackageDir } = require('./get-package-dir');
 
+const packageArg = process.argv.find(arg => arg.startsWith('--package='));
+// We transfer the CLI argument to the env vars because when Jest runs concurrently,
+// it spawns child processes and the argv array data gets lost, but env vars will persist
+// between the processes.
+process.env.packageArg = packageArg;
 const packageDirname = getPackageDir();
 
 module.exports = {

+ 39 - 11
e2e-common/test-config.ts

@@ -6,11 +6,20 @@ import {
     SqljsInitializer,
     testConfig as defaultTestConfig,
 } from '@vendure/testing';
+import fs from 'fs-extra';
 import path from 'path';
 import { ConnectionOptions } from 'typeorm';
 
 import { getPackageDir } from './get-package-dir';
 
+declare global {
+    namespace NodeJS {
+        interface Global {
+            e2eServerPortsUsed: number[];
+        }
+    }
+}
+
 /**
  * We use a relatively long timeout on the initial beforeAll() function of the
  * e2e tests because on the first run (and always in CI) the sqlite databases
@@ -35,22 +44,41 @@ if (process.env.E2E_DEBUG) {
     jest.setTimeout(1800 * 1000);
 }
 /**
- * Increase default timeout in CI to 10 seconds because occasionally valid tests fail due to
+ * Increase default timeout in CI because occasionally valid tests fail due to
  * timeouts.
  */
 if (process.env.CI) {
-    jest.setTimeout(10 * 1000);
+    jest.setTimeout(30 * 1000);
+} else {
+    jest.setTimeout(15 * 1000);
 }
 
-export const testConfig = mergeConfig(defaultTestConfig, {
-    importExportOptions: {
-        importAssetsDir: path.join(packageDir, 'fixtures/assets'),
-    },
-    jobQueueOptions: {
-        pollInterval: 100,
-    },
-    dbConnectionOptions: getDbConfig(),
-});
+export const testConfig = () => {
+    const portsFile = path.join(__dirname, 'ports.json');
+    fs.ensureFileSync(portsFile);
+    let usedPorts: number[];
+    try {
+        usedPorts = fs.readJSONSync(portsFile) ?? [3010];
+    } catch (e) {
+        usedPorts = [3010];
+    }
+    const nextPort = Math.max(...usedPorts) + 1;
+    usedPorts.push(nextPort);
+    if (100 < usedPorts.length) {
+        // reset the used ports after it gets 100 entries long
+        usedPorts = [3010];
+    }
+    fs.writeJSONSync(portsFile, usedPorts);
+    return mergeConfig(defaultTestConfig, {
+        apiOptions: {
+            port: nextPort,
+        },
+        importExportOptions: {
+            importAssetsDir: path.join(packageDir, 'fixtures/assets'),
+        },
+        dbConnectionOptions: getDbConfig(),
+    });
+};
 
 function getDbConfig(): ConnectionOptions {
     const dbType = process.env.DB || 'sqljs';

+ 1 - 5
packages/asset-server-plugin/e2e/asset-server-plugin.e2e-spec.ts

@@ -21,14 +21,10 @@ describe('AssetServerPlugin', () => {
     const previewFilePath = path.join(__dirname, TEST_ASSET_DIR, `preview/71/${IMAGE_BASENAME}__preview.jpg`);
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
-            apiOptions: {
-                port: 5050,
-            },
+        mergeConfig(testConfig(), {
             logger: new DefaultLogger({ level: LogLevel.Info }),
             plugins: [
                 AssetServerPlugin.init({
-                    port: 3060,
                     assetUploadDir: path.join(__dirname, TEST_ASSET_DIR),
                     route: 'assets',
                 }),

+ 1 - 1
packages/asset-server-plugin/package.json

@@ -12,7 +12,7 @@
     "build": "rimraf lib && tsc -p ./tsconfig.build.json && node build.js",
     "lint": "tslint --fix --project ./",
     "test": "jest --config ./jest.config.js",
-    "e2e": "jest --config ../../e2e-common/jest-config.js --runInBand --package=asset-server-plugin"
+    "e2e": "jest --config ../../e2e-common/jest-config.js --package=asset-server-plugin"
   },
   "homepage": "https://www.vendure.io/",
   "funding": "https://github.com/sponsors/michaelbromley",

+ 1 - 1
packages/core/e2e/administrator.e2e-spec.ts

@@ -22,7 +22,7 @@ import { CREATE_ADMINISTRATOR } from './graphql/shared-definitions';
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Administrator resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
     let createdAdmin: Administrator.Fragment;
 
     beforeAll(async () => {

+ 1 - 1
packages/core/e2e/apollo-server-plugin.e2e-spec.ts

@@ -40,7 +40,7 @@ class MyApolloServerPlugin implements ApolloServerPlugin {
 
 describe('custom apolloServerPlugins', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             apiOptions: {
                 apolloServerPlugins: [new MyApolloServerPlugin()],
             },

+ 1 - 1
packages/core/e2e/asset-channel.e2e-spec.ts

@@ -32,7 +32,7 @@ import {
 } from './graphql/shared-definitions';
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
-const { server, adminClient } = createTestEnvironment(testConfig);
+const { server, adminClient } = createTestEnvironment(testConfig());
 const SECOND_CHANNEL_TOKEN = 'second_channel_token';
 let createdAssetId: string;
 let channel2Id: string;

+ 1 - 1
packages/core/e2e/asset.e2e-spec.ts

@@ -34,7 +34,7 @@ import {
 
 describe('Asset resolver', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             assetOptions: {
                 permittedFileTypes: ['image/*', '.pdf', '.zip'],
             },

+ 1 - 1
packages/core/e2e/auth.e2e-spec.ts

@@ -40,7 +40,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Authorization & permissions', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         plugins: [ProtectedFieldsPlugin],
     });
 

+ 1 - 1
packages/core/e2e/authentication-strategy.e2e-spec.ts

@@ -35,7 +35,7 @@ import { REGISTER_ACCOUNT } from './graphql/shop-definitions';
 
 describe('AuthenticationStrategy', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             authOptions: {
                 shopAuthenticationStrategy: [
                     new NativeAuthenticationStrategy(),

+ 1 - 1
packages/core/e2e/channel.e2e-spec.ts

@@ -45,7 +45,7 @@ import { GET_ACTIVE_ORDER } from './graphql/shop-definitions';
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Channels', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
     const SECOND_CHANNEL_TOKEN = 'second_channel_token';
     let secondChannelAdminRole: CreateRole.CreateRole;
     let customerUser: GetCustomerList.Items;

+ 3 - 18
packages/core/e2e/collection.e2e-spec.ts

@@ -56,7 +56,7 @@ import { sortById } from './utils/test-order-utils';
 
 describe('Collection resolver', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         plugins: [DefaultJobQueuePlugin],
     });
 
@@ -678,23 +678,8 @@ describe('Collection resolver', () => {
                 },
             );
             expect(collection!.productVariants.items.map(i => i.price)).toEqual([
-                3799,
-                5374,
-                6900,
-                7489,
-                7896,
-                9299,
-                13435,
-                14374,
-                16994,
-                93120,
-                94920,
-                108720,
-                109995,
-                129900,
-                139900,
-                219900,
-                229900,
+                3799, 5374, 6900, 7489, 7896, 9299, 13435, 14374, 16994, 93120, 94920, 108720, 109995, 129900,
+                139900, 219900, 229900,
             ]);
         });
     });

+ 1 - 1
packages/core/e2e/configurable-operation.e2e-spec.ts

@@ -43,7 +43,7 @@ const testShippingEligibilityChecker = new ShippingEligibilityChecker({
 
 describe('Configurable operations', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             shippingOptions: {
                 shippingEligibilityCheckers: [
                     defaultShippingEligibilityChecker,

+ 1 - 1
packages/core/e2e/country.e2e-spec.ts

@@ -20,7 +20,7 @@ import { GET_COUNTRY_LIST, UPDATE_COUNTRY } from './graphql/shared-definitions';
 // tslint:disable:no-non-null-assertion
 
 describe('Country resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
     let countries: GetCountryList.Items[];
     let GB: GetCountryList.Items;
     let AT: GetCountryList.Items;

+ 5 - 2
packages/core/e2e/custom-field-relations.e2e-spec.ts

@@ -31,7 +31,10 @@ import { sortById } from './utils/test-order-utils';
 type ValueOf<T> = T[keyof T];
 type NonEmptyArray<T> = [T, ...T[]];
 type MustInclude<T, U extends T[]> = [T] extends [ValueOf<U>] ? U : never;
-const enumerate = <T>() => <U extends NonEmptyArray<T>>(...elements: MustInclude<T, U>) => elements;
+const enumerate =
+    <T>() =>
+    <U extends NonEmptyArray<T>>(...elements: MustInclude<T, U>) =>
+        elements;
 
 const entitiesWithCustomFields = enumerate<keyof CustomFields>()(
     'Address',
@@ -73,7 +76,7 @@ customFieldConfig.Product?.push(
     { name: 'cfShippingMethod', type: 'relation', entity: ShippingMethod, list: false },
 );
 
-const customConfig = mergeConfig(testConfig, {
+const customConfig = mergeConfig(testConfig(), {
     dbConnectionOptions: {
         timezone: 'Z',
     },

+ 2 - 2
packages/core/e2e/custom-fields.e2e-spec.ts

@@ -16,7 +16,7 @@ fixPostgresTimezone();
 
 const validateInjectorSpy = jest.fn();
 
-const customConfig = mergeConfig(testConfig, {
+const customConfig = mergeConfig(testConfig(), {
     dbConnectionOptions: {
         timezone: 'Z',
     },
@@ -322,7 +322,7 @@ describe('Custom fields', () => {
             dateTimeWithDefault: '2019-04-30T12:59:16.415Z',
             // MySQL does not support defaults on TEXT fields, which is what "simple-json" uses
             // internally. See https://stackoverflow.com/q/3466872/772859
-            stringListWithDefault: testConfig.dbConnectionOptions.type === 'mysql' ? null : ['cat'],
+            stringListWithDefault: customConfig.dbConnectionOptions.type === 'mysql' ? null : ['cat'],
         };
 
         expect(product).toEqual({

+ 1 - 1
packages/core/e2e/custom-permissions.e2e-spec.ts

@@ -23,7 +23,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Custom permissions', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TestPluginWithCustomPermissions],
         }),
     );

+ 1 - 1
packages/core/e2e/customer-channel.e2e-spec.ts

@@ -41,7 +41,7 @@ import { DELETE_ADDRESS, REGISTER_ACCOUNT } from './graphql/shop-definitions';
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('ChannelAware Customers', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
     const SECOND_CHANNEL_TOKEN = 'second_channel_token';
     let firstCustomer: GetCustomerList.Items;
     let secondCustomer: GetCustomerList.Items;

+ 2 - 2
packages/core/e2e/customer-group.e2e-spec.ts

@@ -3,7 +3,7 @@ import { createTestEnvironment } from '@vendure/testing';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 
 import {
     AddCustomersToGroup,
@@ -35,7 +35,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 import { sortById } from './utils/test-order-utils';
 
 describe('CustomerGroup resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     let customers: GetCustomerList.Items[];
 

+ 1 - 1
packages/core/e2e/customer.e2e-spec.ts

@@ -76,7 +76,7 @@ class TestEmailPlugin implements OnModuleInit {
 
 describe('Customer resolver', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, { plugins: [TestEmailPlugin] }),
+        mergeConfig(testConfig(), { plugins: [TestEmailPlugin] }),
     );
 
     let firstCustomer: GetCustomerList.Items;

+ 1 - 1
packages/core/e2e/database-transactions.e2e-spec.ts

@@ -15,7 +15,7 @@ import {
 
 describe('Transaction infrastructure', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TransactionTestPlugin],
         }),
     );

+ 2 - 2
packages/core/e2e/default-search-plugin.e2e-spec.ts

@@ -82,7 +82,7 @@ interface SearchProductShopVariables extends SearchProductsShop.Variables {
 
 describe('Default search plugin', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             logger: new DefaultLogger(),
             plugins: [DefaultSearchPlugin.init({ indexStockStatus: true }), DefaultJobQueuePlugin],
         }),
@@ -95,7 +95,7 @@ describe('Default search plugin', () => {
             customerCount: 1,
         });
         await adminClient.asSuperAdmin();
-        if (testConfig.dbConnectionOptions.type === 'mysql') {
+        if (testConfig().dbConnectionOptions.type === 'mysql') {
             // Mysql seems to occasionally run into some kind of race condition
             // relating to the populating of data, so we add a pause here.
             await new Promise(resolve => setTimeout(resolve, 10000));

+ 1 - 1
packages/core/e2e/entity-hydrator.e2e-spec.ts

@@ -17,7 +17,7 @@ const orderResultGuard: ErrorResultGuard<UpdatedOrderFragment> = createErrorResu
 
 describe('Entity hydration', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [HydrationTestPlugin],
         }),
     );

+ 1 - 1
packages/core/e2e/entity-id-strategy.e2e-spec.ts

@@ -20,7 +20,7 @@ import {
 import { sortById } from './utils/test-order-utils';
 
 describe('EntityIdStrategy', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 1 - 1
packages/core/e2e/entity-uuid-strategy.e2e-spec.ts

@@ -18,7 +18,7 @@ import { GET_PRODUCT_LIST } from './graphql/shared-definitions';
 
 describe('UuidIdStrategy', () => {
     const { server, adminClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         entityOptions: { entityIdStrategy: new UuidIdStrategy() },
     });
 

+ 4 - 3
packages/core/e2e/facet.e2e-spec.ts

@@ -32,7 +32,8 @@ import {
     ASSIGN_PRODUCT_TO_CHANNEL,
     CREATE_CHANNEL,
     CREATE_FACET,
-    GET_FACET_LIST, GET_FACET_LIST_SIMPLE,
+    GET_FACET_LIST,
+    GET_FACET_LIST_SIMPLE,
     GET_PRODUCT_WITH_VARIANTS,
     UPDATE_FACET,
     UPDATE_PRODUCT,
@@ -43,7 +44,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 // tslint:disable:no-non-null-assertion
 
 describe('Facet resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     let brandFacet: FacetWithValues.Fragment;
     let speakerTypeFacet: FacetWithValues.Fragment;
@@ -85,7 +86,7 @@ describe('Facet resolver', () => {
             input: {
                 id: speakerTypeFacet.id,
                 translations: [{ languageCode: LanguageCode.en, name: 'Speaker Category' }],
-                isPrivate: true
+                isPrivate: true,
             },
         });
 

+ 2 - 2
packages/core/e2e/fulfillment-process.e2e-spec.ts

@@ -82,9 +82,9 @@ describe('Fulfillment process', () => {
     };
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             shippingOptions: {
-                ...testConfig.shippingOptions,
+                ...testConfig().shippingOptions,
                 customFulfillmentProcess: [customOrderProcess as any, customOrderProcess2 as any],
             },
             paymentOptions: {

+ 1 - 1
packages/core/e2e/global-settings.e2e-spec.ts

@@ -16,7 +16,7 @@ import { UPDATE_GLOBAL_SETTINGS } from './graphql/shared-definitions';
 
 describe('GlobalSettings resolver', () => {
     const { server, adminClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         ...{
             customFields: {
                 Customer: [{ name: 'age', type: 'int' }],

+ 1 - 1
packages/core/e2e/import.e2e-spec.ts

@@ -9,7 +9,7 @@ import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-conf
 
 describe('Import resolver', () => {
     const { server, adminClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         customFields: {
             Product: [
                 { type: 'string', name: 'pageType' },

+ 6 - 5
packages/core/e2e/job-queue.e2e-spec.ts

@@ -11,7 +11,8 @@ import { CancelJob, GetRunningJobs, JobState } from './graphql/generated-e2e-adm
 import { GET_RUNNING_JOBS } from './graphql/shared-definitions';
 
 describe('JobQueue', () => {
-    if (testConfig.dbConnectionOptions.type === 'sqljs') {
+    const activeConfig = testConfig();
+    if (activeConfig.dbConnectionOptions.type === 'sqljs') {
         it.only('skip JobQueue tests for sqljs', () => {
             // The tests in this suite will fail when running on sqljs because
             // the DB state is not persisted after shutdown. In this case it is
@@ -22,7 +23,7 @@ describe('JobQueue', () => {
     }
 
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(activeConfig, {
             plugins: [DefaultJobQueuePlugin, PluginWithJobQueue],
         }),
     );
@@ -64,7 +65,7 @@ describe('JobQueue', () => {
     let testJobId: string;
 
     it('creates and starts running a job', async () => {
-        const restControllerUrl = `http://localhost:${testConfig.apiOptions.port}/run-job`;
+        const restControllerUrl = `http://localhost:${activeConfig.apiOptions.port}/run-job`;
         await adminClient.fetch(restControllerUrl);
 
         await sleep(300);
@@ -108,7 +109,7 @@ describe('JobQueue', () => {
 
     it('cancels a running job', async () => {
         PluginWithJobQueue.jobHasDoneWork = false;
-        const restControllerUrl = `http://localhost:${testConfig.apiOptions.port}/run-job`;
+        const restControllerUrl = `http://localhost:${activeConfig.apiOptions.port}/run-job`;
         await adminClient.fetch(restControllerUrl);
 
         await sleep(300);
@@ -133,7 +134,7 @@ describe('JobQueue', () => {
     });
 
     it('subscribe to result of job', async () => {
-        const restControllerUrl = `http://localhost:${testConfig.apiOptions.port}/run-job/subscribe`;
+        const restControllerUrl = `http://localhost:${activeConfig.apiOptions.port}/run-job/subscribe`;
         const result = await adminClient.fetch(restControllerUrl);
 
         expect(await result.text()).toBe('42!');

+ 1 - 1
packages/core/e2e/lifecycle.e2e-spec.ts

@@ -52,7 +52,7 @@ const testShippingEligChecker = new ShippingEligibilityChecker({
 
 describe('lifecycle hooks for configurable objects', () => {
     const { server, adminClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         entityOptions: { entityIdStrategy: new TestIdStrategy() },
         shippingOptions: {
             shippingEligibilityCheckers: [defaultShippingEligibilityChecker, testShippingEligChecker],

+ 1 - 1
packages/core/e2e/list-query-builder.e2e-spec.ts

@@ -16,7 +16,7 @@ fixPostgresTimezone();
 
 describe('ListQueryBuilder', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             apiOptions: {
                 shopListQueryLimit: 10,
                 adminListQueryLimit: 30,

+ 1 - 1
packages/core/e2e/localization.e2e-spec.ts

@@ -16,7 +16,7 @@ import { GET_PRODUCT_WITH_VARIANTS, UPDATE_PRODUCT } from './graphql/shared-defi
 
 /* tslint:disable:no-non-null-assertion */
 describe('Localization', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 1 - 1
packages/core/e2e/order-changed-price-handling.e2e-spec.ts

@@ -40,7 +40,7 @@ class TestChangedPriceStrategy implements ChangedPriceHandlingStrategy {
 
 describe('ChangedPriceHandlingStrategy', () => {
     const { server, shopClient, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             orderOptions: {
                 changedPriceHandlingStrategy: new TestChangedPriceStrategy(),
             },

+ 1 - 1
packages/core/e2e/order-channel.e2e-spec.ts

@@ -35,7 +35,7 @@ import {
 import { ADD_ITEM_TO_ORDER, GET_ACTIVE_ORDER, GET_ORDER_SHOP } from './graphql/shop-definitions';
 
 describe('Channelaware orders', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
     const SECOND_CHANNEL_TOKEN = 'second_channel_token';
     const THIRD_CHANNEL_TOKEN = 'third_channel_token';
     let customerUser: GetCustomerList.Items;

+ 1 - 1
packages/core/e2e/order-fulfillment.e2e-spec.ts

@@ -71,7 +71,7 @@ describe('Order fulfillments', () => {
     let f1Id: string;
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             paymentOptions: {
                 paymentMethodHandlers: [testSuccessfulPaymentMethod],
             },

+ 1 - 1
packages/core/e2e/order-item-price-calculation-strategy.e2e-spec.ts

@@ -13,7 +13,7 @@ import { ADD_ITEM_TO_ORDER, SEARCH_PRODUCTS_SHOP } from './graphql/shop-definiti
 describe('custom OrderItemPriceCalculationStrategy', () => {
     let variants: SearchProductsShop.Items[];
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             customFields: {
                 OrderLine: [{ name: 'giftWrap', type: 'boolean' }],
             },

+ 1 - 1
packages/core/e2e/order-merge.e2e-spec.ts

@@ -51,7 +51,7 @@ describe('Order merging', () => {
     let customers: GetCustomerList.Items[];
 
     const { server, shopClient, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             orderOptions: {
                 mergeStrategy: new DelegateMergeStrategy(),
             },

+ 1 - 1
packages/core/e2e/order-modification.e2e-spec.ts

@@ -97,7 +97,7 @@ const testCalculator = new ShippingCalculator({
 
 describe('Order modification', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             paymentOptions: {
                 paymentMethodHandlers: [
                     testSuccessfulPaymentMethod,

+ 3 - 4
packages/core/e2e/order-process.e2e-spec.ts

@@ -83,12 +83,11 @@ describe('Order process', () => {
         },
     };
 
-    const orderErrorGuard: ErrorResultGuard<
-        TestOrderFragmentFragment | OrderFragment
-    > = createErrorResultGuard(input => !!input.total);
+    const orderErrorGuard: ErrorResultGuard<TestOrderFragmentFragment | OrderFragment> =
+        createErrorResultGuard(input => !!input.total);
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             orderOptions: { process: [customOrderProcess as any, customOrderProcess2 as any] },
             paymentOptions: {
                 paymentMethodHandlers: [testSuccessfulPaymentMethod],

+ 1 - 1
packages/core/e2e/order-promotion.e2e-spec.ts

@@ -87,7 +87,7 @@ import { addPaymentToOrder, proceedToArrangingPayment } from './utils/test-order
 
 describe('Promotions applied to Orders', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         paymentOptions: {
             paymentMethodHandlers: [testSuccessfulPaymentMethod],
         },

+ 1 - 1
packages/core/e2e/order-taxes.e2e-spec.ts

@@ -20,7 +20,7 @@ import { sortById } from './utils/test-order-utils';
 
 describe('Order taxes', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         paymentOptions: {
             paymentMethodHandlers: [testSuccessfulPaymentMethod],
         },

+ 1 - 1
packages/core/e2e/order.e2e-spec.ts

@@ -111,7 +111,7 @@ import { addPaymentToOrder, proceedToArrangingPayment, sortById } from './utils/
 
 describe('Orders resolver', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             paymentOptions: {
                 paymentMethodHandlers: [
                     twoStagePaymentMethod,

+ 1 - 1
packages/core/e2e/parallel-transactions.e2e-spec.ts

@@ -22,7 +22,7 @@ import {
 
 describe('Parallel transactions', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         plugins: [SlowMutationPlugin],
     });
 

+ 1 - 1
packages/core/e2e/payment-method.e2e-spec.ts

@@ -65,7 +65,7 @@ describe('PaymentMethod resolver', () => {
     );
 
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         logger: new DefaultLogger(),
         paymentOptions: {
             paymentMethodEligibilityCheckers: [minPriceChecker],

+ 1 - 1
packages/core/e2e/payment-process.e2e-spec.ts

@@ -128,7 +128,7 @@ describe('Payment process', () => {
     const paymentGuard: ErrorResultGuard<PaymentFragment> = createErrorResultGuard(input => !!input.id);
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             logger: new DefaultLogger(),
             orderOptions: {
                 process: [customOrderProcess as any],

+ 3 - 2
packages/core/e2e/plugin.e2e-spec.ts

@@ -17,8 +17,9 @@ import { TestRestPlugin } from './fixtures/test-plugins/with-rest-controller';
 
 describe('Plugins', () => {
     const onConstructorFn = jest.fn();
+    const activeConfig = testConfig();
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...activeConfig,
         plugins: [
             TestPluginWithAllLifecycleHooks.init(onConstructorFn),
             TestPluginWithConfig.setup(),
@@ -104,7 +105,7 @@ describe('Plugins', () => {
     });
 
     describe('REST plugins', () => {
-        const restControllerUrl = `http://localhost:${testConfig.apiOptions.port}/test`;
+        const restControllerUrl = `http://localhost:${activeConfig.apiOptions.port}/test`;
 
         it('public route', async () => {
             const response = await shopClient.fetch(restControllerUrl + '/public');

+ 1 - 1
packages/core/e2e/product-channel.e2e-spec.ts

@@ -38,7 +38,7 @@ import {
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('ChannelAware Products and ProductVariants', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
     const SECOND_CHANNEL_TOKEN = 'second_channel_token';
     const THIRD_CHANNEL_TOKEN = 'third_channel_token';
     let secondChannelAdminRole: CreateRole.CreateRole;

+ 1 - 1
packages/core/e2e/product-option.e2e-spec.ts

@@ -21,7 +21,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 // tslint:disable:no-non-null-assertion
 
 describe('ProductOption resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
     let sizeGroup: ProductOptionGroupFragment;
     let mediumOption: CreateProductOption.CreateProductOption;
 

+ 1 - 1
packages/core/e2e/product.e2e-spec.ts

@@ -52,7 +52,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 // tslint:disable:no-non-null-assertion
 
 describe('Product resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     const removeOptionGuard: ErrorResultGuard<ProductWithOptionsFragment> = createErrorResultGuard(
         input => !!input.optionGroups,

+ 1 - 1
packages/core/e2e/promotion.e2e-spec.ts

@@ -47,7 +47,7 @@ describe('Promotion resolver', () => {
     const promoAction = generateTestAction('promo_action');
 
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         promotionOptions: {
             promotionConditions: [promoCondition, promoCondition2],
             promotionActions: [promoAction],

+ 1 - 1
packages/core/e2e/role.e2e-spec.ts

@@ -31,7 +31,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 import { sortById } from './utils/test-order-utils';
 
 describe('Role resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
     let createdRole: Role.Fragment;
     let defaultRoles: Role.Fragment[];
 

+ 3 - 3
packages/core/e2e/session-management.e2e-spec.ts

@@ -5,7 +5,7 @@ import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 import { SUPER_ADMIN_USER_IDENTIFIER, SUPER_ADMIN_USER_PASSWORD } from '../../common/src/shared-constants';
 
 import { AttemptLogin, Me } from './graphql/generated-e2e-admin-types';
@@ -41,7 +41,7 @@ class TestingSessionCacheStrategy implements SessionCacheStrategy {
 
 describe('Session caching', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             authOptions: {
                 sessionCacheStrategy: new TestingSessionCacheStrategy(),
                 sessionCacheTTL: 2,
@@ -118,7 +118,7 @@ describe('Session caching', () => {
 
 describe('Session expiry', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             authOptions: {
                 sessionDuration: '3s',
                 sessionCacheTTL: 1,

+ 3 - 4
packages/core/e2e/shipping-method-eligibility.e2e-spec.ts

@@ -90,16 +90,15 @@ const calculator = new ShippingCalculator({
 
 describe('ShippingMethod eligibility', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         shippingOptions: {
             shippingEligibilityCheckers: [defaultShippingEligibilityChecker, checker1, checker2, checker3],
             shippingCalculators: [defaultShippingCalculator, calculator],
         },
     });
 
-    const orderGuard: ErrorResultGuard<
-        UpdatedOrderFragment | TestOrderFragmentFragment
-    > = createErrorResultGuard(input => !!input.lines);
+    const orderGuard: ErrorResultGuard<UpdatedOrderFragment | TestOrderFragmentFragment> =
+        createErrorResultGuard(input => !!input.lines);
 
     let singleLineShippingMethod: ShippingMethodFragment;
     let multiLineShippingMethod: ShippingMethodFragment;

+ 1 - 1
packages/core/e2e/shipping-method.e2e-spec.ts

@@ -53,7 +53,7 @@ const calculatorWithMetadata = new ShippingCalculator({
 
 describe('ShippingMethod resolver', () => {
     const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
+        ...testConfig(),
         shippingOptions: {
             shippingEligibilityCheckers: [defaultShippingEligibilityChecker],
             shippingCalculators: [defaultShippingCalculator, calculatorWithMetadata],

+ 4 - 4
packages/core/e2e/shop-auth.e2e-spec.ts

@@ -96,7 +96,7 @@ const currentUserErrorGuard: ErrorResultGuard<CurrentUserShopFragment> = createE
 
 describe('Shop auth & accounts', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TestEmailPlugin as any],
         }),
     );
@@ -774,7 +774,7 @@ describe('Shop auth & accounts', () => {
 
 describe('Expiring tokens', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TestEmailPlugin as any],
             authOptions: {
                 verificationTokenDuration: '1ms',
@@ -876,7 +876,7 @@ describe('Expiring tokens', () => {
 
 describe('Registration without email verification', () => {
     const { server, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TestEmailPlugin as any],
             authOptions: {
                 requireVerification: false,
@@ -956,7 +956,7 @@ describe('Registration without email verification', () => {
 
 describe('Updating email address without email verification', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TestEmailPlugin as any],
             authOptions: {
                 requireVerification: false,

+ 1 - 1
packages/core/e2e/shop-catalog.e2e-spec.ts

@@ -43,7 +43,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 import { awaitRunningJobs } from './utils/await-running-jobs';
 
 describe('Shop catalog', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 1 - 1
packages/core/e2e/shop-customer.e2e-spec.ts

@@ -37,7 +37,7 @@ import {
 import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Shop customers', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
     let customer: GetCustomer.Customer;
 
     const successErrorGuard: ErrorResultGuard<{ success: boolean }> = createErrorResultGuard(

+ 2 - 3
packages/core/e2e/shop-order.e2e-spec.ts

@@ -64,7 +64,6 @@ import {
 } from './graphql/shared-definitions';
 import {
     ADD_ITEM_TO_ORDER,
-    ADD_ITEM_TO_ORDER_WITH_CUSTOM_FIELDS,
     ADD_PAYMENT,
     ADJUST_ITEM_QUANTITY,
     GET_ACTIVE_ORDER,
@@ -89,7 +88,7 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 
 describe('Shop orders', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             paymentOptions: {
                 paymentMethodHandlers: [
                     testSuccessfulPaymentMethod,
@@ -422,7 +421,7 @@ describe('Shop orders', () => {
                 const { activeOrder } = await shopClient.query(GET_ORDER_WITH_ORDER_LINE_CUSTOM_FIELDS);
 
                 const ADJUST_ORDER_LINE_WITH_CUSTOM_FIELDS = gql`
-                    mutation($orderLineId: ID!, $quantity: Int!, $customFields: OrderLineCustomFieldsInput) {
+                    mutation ($orderLineId: ID!, $quantity: Int!, $customFields: OrderLineCustomFieldsInput) {
                         adjustOrderLine(
                             orderLineId: $orderLineId
                             quantity: $quantity

+ 1 - 1
packages/core/e2e/stock-control.e2e-spec.ts

@@ -61,7 +61,7 @@ import { addPaymentToOrder, proceedToArrangingPayment } from './utils/test-order
 
 describe('Stock control', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             paymentOptions: {
                 paymentMethodHandlers: [testSuccessfulPaymentMethod, twoStagePaymentMethod],
             },

+ 1 - 1
packages/core/e2e/tag.e2e-spec.ts

@@ -8,7 +8,7 @@ import { createTestEnvironment } from '../../testing/lib/create-test-environment
 import { CreateTag, GetTag, GetTagList, UpdateTag } from './graphql/generated-e2e-admin-types';
 
 describe('Tag resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 1 - 1
packages/core/e2e/tax-category.e2e-spec.ts

@@ -16,7 +16,7 @@ import {
 import { sortById } from './utils/test-order-utils';
 
 describe('TaxCategory resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 2 - 2
packages/core/e2e/tax-rate.e2e-spec.ts

@@ -5,7 +5,7 @@ import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 
 import { TAX_RATE_FRAGMENT } from './graphql/fragments';
 import {
@@ -19,7 +19,7 @@ import {
 import { GET_TAX_RATES_LIST, UPDATE_TAX_RATE } from './graphql/shared-definitions';
 
 describe('TaxRate resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
+    const { server, adminClient, shopClient } = createTestEnvironment(testConfig());
 
     beforeAll(async () => {
         await server.init({

+ 1 - 1
packages/core/e2e/translations.e2e-spec.ts

@@ -15,7 +15,7 @@ import {
 
 describe('Translation', () => {
     const { server, adminClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             plugins: [TranslationTestPlugin],
         }),
     );

+ 2 - 2
packages/core/e2e/zone.e2e-spec.ts

@@ -3,7 +3,7 @@ import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 
 import { ZONE_FRAGMENT } from './graphql/fragments';
 import {
@@ -23,7 +23,7 @@ import { GET_COUNTRY_LIST, UPDATE_CHANNEL } from './graphql/shared-definitions';
 // tslint:disable:no-non-null-assertion
 
 describe('Zone resolver', () => {
-    const { server, adminClient } = createTestEnvironment(testConfig);
+    const { server, adminClient } = createTestEnvironment(testConfig());
     let countries: GetCountryList.Items[];
     let zones: Array<{ id: string; name: string }>;
     let oceania: { id: string; name: string };

+ 1 - 1
packages/core/package.json

@@ -24,7 +24,7 @@
     "watch": "concurrently yarn:tsc:watch yarn:gulp:watch",
     "lint": "tslint --fix --project ./",
     "test": "jest --config ./jest.config.js",
-    "e2e": "jest --config ../../e2e-common/jest-config.js --runInBand --package=core",
+    "e2e": "jest --config ../../e2e-common/jest-config.js --package=core",
     "ci": "yarn build"
   },
   "publishConfig": {

+ 1 - 4
packages/elasticsearch-plugin/e2e/elasticsearch-plugin-uuid.e2e-spec.ts

@@ -25,10 +25,7 @@ if (process.env.CI) {
 // https://github.com/vendure-ecommerce/vendure/issues/494
 describe('Elasticsearch plugin with UuidIdStrategy', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
-            apiOptions: {
-                port: 4050,
-            },
+        mergeConfig(testConfig(), {
             entityOptions: { entityIdStrategy: new UuidIdStrategy() },
             logger: new DefaultLogger({ level: LogLevel.Info }),
             plugins: [

+ 1 - 4
packages/elasticsearch-plugin/e2e/elasticsearch-plugin.e2e-spec.ts

@@ -113,10 +113,7 @@ const INDEX_PREFIX = 'e2e-tests';
 
 describe('Elasticsearch plugin', () => {
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
-            apiOptions: {
-                port: 4050,
-            },
+        mergeConfig(testConfig(), {
             logger: new DefaultLogger({ level: LogLevel.Info }),
             plugins: [
                 ElasticsearchPlugin.init({

+ 1 - 1
packages/elasticsearch-plugin/package.json

@@ -12,7 +12,7 @@
     "build": "rimraf lib && tsc -p ./tsconfig.build.json",
     "lint": "tslint --fix --project ./",
     "test": "jest --config ./jest.config.js",
-    "e2e": "node e2e/check-connection.js || jest --config ../../e2e-common/jest-config.js --runInBand --package=elasticsearch-plugin"
+    "e2e": "node e2e/check-connection.js || jest --config ../../e2e-common/jest-config.js --package=elasticsearch-plugin"
   },
   "homepage": "https://www.vendure.io/",
   "funding": "https://github.com/sponsors/michaelbromley",

+ 1 - 1
packages/job-queue-plugin/e2e/bullmq-job-queue-plugin.e2e-spec.ts

@@ -24,7 +24,7 @@ describe('BullMQJobQueuePlugin', () => {
     });
 
     const { server, adminClient, shopClient } = createTestEnvironment(
-        mergeConfig(testConfig, {
+        mergeConfig(testConfig(), {
             apiOptions: {
                 port: 4050,
             },