From 0e5529b4ca1273aa55574f790b97392234e9f728 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 1 Oct 2023 17:20:07 +0200 Subject: [PATCH 1/6] feat: Add global hooks for jest --- packages/backend/jest.config.js | 4 +++- packages/backend/test/setup/global-hooks.ts | 17 +++++++++++++++++ packages/backend/test/setup/global-teardown.ts | 5 +++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/backend/test/setup/global-hooks.ts create mode 100644 packages/backend/test/setup/global-teardown.ts diff --git a/packages/backend/jest.config.js b/packages/backend/jest.config.js index b413e106..0b261606 100644 --- a/packages/backend/jest.config.js +++ b/packages/backend/jest.config.js @@ -2,4 +2,6 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', -}; \ No newline at end of file + setupFilesAfterEnv: ['./test/setup/global-hooks.ts'], + globalTeardown: './test/setup/global-teardown.ts', +}; diff --git a/packages/backend/test/setup/global-hooks.ts b/packages/backend/test/setup/global-hooks.ts new file mode 100644 index 00000000..be1c2704 --- /dev/null +++ b/packages/backend/test/setup/global-hooks.ts @@ -0,0 +1,17 @@ +import { client as knex } from '../../src/config/database'; + +global.beforeAll(async () => { + global.knex = knex; +}); + +global.beforeEach(async function () { + this.transaction = await global.knex.transaction(); +}); + +global.afterEach(async function () { + await this.transaction.rollback(); +}); + +global.afterAll(async () => { + global.knex.destroy(); +}); diff --git a/packages/backend/test/setup/global-teardown.ts b/packages/backend/test/setup/global-teardown.ts new file mode 100644 index 00000000..0484a1a3 --- /dev/null +++ b/packages/backend/test/setup/global-teardown.ts @@ -0,0 +1,5 @@ +const exitProcess = (): void => { + process.exit(0); +}; + +export default exitProcess; From 92287221474e4c9bcb34dd43d17b46d25d03330b Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 1 Oct 2023 17:51:15 +0200 Subject: [PATCH 2/6] chore: Use ts migration files also for test env --- packages/backend/knexfile.ts | 2 +- packages/backend/src/config/app.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/knexfile.ts b/packages/backend/knexfile.ts index 440c8ca5..4847933e 100644 --- a/packages/backend/knexfile.ts +++ b/packages/backend/knexfile.ts @@ -1,6 +1,6 @@ import appConfig from './src/config/app'; -const fileExtension = appConfig.isDev ? 'ts' : 'js'; +const fileExtension = appConfig.isDev || appConfig.isTest ? 'ts' : 'js'; const knexConfig = { client: 'pg', diff --git a/packages/backend/src/config/app.ts b/packages/backend/src/config/app.ts index c9354060..01a6982b 100644 --- a/packages/backend/src/config/app.ts +++ b/packages/backend/src/config/app.ts @@ -17,6 +17,7 @@ type AppConfig = { appEnv: string; logLevel: string; isDev: boolean; + isTest: boolean; isProd: boolean; postgresDatabase: string; postgresSchema: string; @@ -89,6 +90,7 @@ const appConfig: AppConfig = { appEnv: appEnv, logLevel: process.env.LOG_LEVEL || 'info', isDev: appEnv === 'development', + isTest: appEnv === 'test', isProd: appEnv === 'production', version: process.env.npm_package_version, postgresDatabase: process.env.POSTGRES_DATABASE || 'automatisch_development', From 4ab6415f49a0e9067fd62483747f279c603f8a7b Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 1 Oct 2023 17:55:30 +0200 Subject: [PATCH 3/6] feat: Migrate test database within pretest script --- .../backend/test/setup/create-database.ts | 11 ---------- .../backend/test/setup/prepare-test-env.ts | 22 ++++++++++++++++++- 2 files changed, 21 insertions(+), 12 deletions(-) delete mode 100644 packages/backend/test/setup/create-database.ts diff --git a/packages/backend/test/setup/create-database.ts b/packages/backend/test/setup/create-database.ts deleted file mode 100644 index 47783db8..00000000 --- a/packages/backend/test/setup/create-database.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createDatabaseAndUser } from '../../bin/database/utils'; -import logger from '../../src/helpers/logger'; - -createDatabaseAndUser() - .then(() => { - process.exit(0); - }) - .catch((error) => { - logger.error(error); - process.exit(1); - }); diff --git a/packages/backend/test/setup/prepare-test-env.ts b/packages/backend/test/setup/prepare-test-env.ts index a46ac8f6..19bc85c9 100644 --- a/packages/backend/test/setup/prepare-test-env.ts +++ b/packages/backend/test/setup/prepare-test-env.ts @@ -1,2 +1,22 @@ import './check-env-file'; -import './create-database'; +import { createDatabaseAndUser } from '../../bin/database/utils'; +import { client as knex } from '../../src/config/database'; +import logger from '../../src/helpers/logger'; + +const createAndMigrateDatabase = async () => { + await createDatabaseAndUser(); + const migrator = knex.migrate; + + await migrator.latest(); + + logger.info(`Completed database migrations for the test database.`); +}; + +createAndMigrateDatabase() + .then(() => { + process.exit(0); + }) + .catch((error) => { + logger.error(error); + process.exit(1); + }); From 370339026872b9f4567af7cc1fa7df0f8dd1dcc9 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 1 Oct 2023 18:06:36 +0200 Subject: [PATCH 4/6] chore: Adjust global and knex types for global hooks --- packages/backend/test/setup/global-hooks.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/backend/test/setup/global-hooks.ts b/packages/backend/test/setup/global-hooks.ts index be1c2704..704e1c8c 100644 --- a/packages/backend/test/setup/global-hooks.ts +++ b/packages/backend/test/setup/global-hooks.ts @@ -1,11 +1,12 @@ import { client as knex } from '../../src/config/database'; +import { Knex } from 'knex'; global.beforeAll(async () => { - global.knex = knex; + (global as any).knex = knex as Knex; }); global.beforeEach(async function () { - this.transaction = await global.knex.transaction(); + this.transaction = await (global as any).knex.transaction(); }); global.afterEach(async function () { @@ -13,5 +14,5 @@ global.afterEach(async function () { }); global.afterAll(async () => { - global.knex.destroy(); + (global as any).knex.destroy(); }); From 04a78ee0baba7bf65c860aae30a7a924a1b0876c Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 1 Oct 2023 23:40:25 +0200 Subject: [PATCH 5/6] feat: Add types knex field of global --- packages/backend/src/types/global.d.ts | 7 +++++++ packages/backend/test/setup/global-hooks.ts | 7 +++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 packages/backend/src/types/global.d.ts diff --git a/packages/backend/src/types/global.d.ts b/packages/backend/src/types/global.d.ts new file mode 100644 index 00000000..13fd2f46 --- /dev/null +++ b/packages/backend/src/types/global.d.ts @@ -0,0 +1,7 @@ +import { Knex } from 'knex'; + +declare global { + declare namespace globalThis { + var knex: Knex; + } +} diff --git a/packages/backend/test/setup/global-hooks.ts b/packages/backend/test/setup/global-hooks.ts index 704e1c8c..be1c2704 100644 --- a/packages/backend/test/setup/global-hooks.ts +++ b/packages/backend/test/setup/global-hooks.ts @@ -1,12 +1,11 @@ import { client as knex } from '../../src/config/database'; -import { Knex } from 'knex'; global.beforeAll(async () => { - (global as any).knex = knex as Knex; + global.knex = knex; }); global.beforeEach(async function () { - this.transaction = await (global as any).knex.transaction(); + this.transaction = await global.knex.transaction(); }); global.afterEach(async function () { @@ -14,5 +13,5 @@ global.afterEach(async function () { }); global.afterAll(async () => { - (global as any).knex.destroy(); + global.knex.destroy(); }); From 9d925097961c2329984f3a70e84219d27321bb0b Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Mon, 2 Oct 2023 01:04:05 +0200 Subject: [PATCH 6/6] fix: Disable eslint no-var while overriding global --- packages/backend/src/types/global.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/types/global.d.ts b/packages/backend/src/types/global.d.ts index 13fd2f46..21bbd7cb 100644 --- a/packages/backend/src/types/global.d.ts +++ b/packages/backend/src/types/global.d.ts @@ -2,6 +2,7 @@ import { Knex } from 'knex'; declare global { declare namespace globalThis { + // eslint-disable-next-line no-var var knex: Knex; } }