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/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', diff --git a/packages/backend/src/types/global.d.ts b/packages/backend/src/types/global.d.ts new file mode 100644 index 00000000..21bbd7cb --- /dev/null +++ b/packages/backend/src/types/global.d.ts @@ -0,0 +1,8 @@ +import { Knex } from 'knex'; + +declare global { + declare namespace globalThis { + // eslint-disable-next-line no-var + var knex: Knex; + } +} 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/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; 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); + });