Files
domain-driven-hexagon/tests/setup/jestSetupAfterEnv.ts
2022-10-10 17:24:43 +02:00

79 lines
1.9 KiB
TypeScript

import { Test, TestingModuleBuilder, TestingModule } from '@nestjs/testing';
import { AppModule } from '@src/app.module';
import { NestExpressApplication } from '@nestjs/platform-express';
import { createPool, DatabasePool } from 'slonik';
import * as request from 'supertest';
import { postgresConnectionUri } from '@src/configs/database.config';
import { ValidationPipe } from '@nestjs/common';
// Setting up test server and utilities
export class TestServer {
constructor(
public readonly serverApplication: NestExpressApplication,
public readonly testingModule: TestingModule,
) {}
public static async new(
testingModuleBuilder: TestingModuleBuilder,
): Promise<TestServer> {
const testingModule: TestingModule = await testingModuleBuilder.compile();
const app: NestExpressApplication = testingModule.createNestApplication();
app.useGlobalPipes(
new ValidationPipe({ transform: true, whitelist: true }),
);
app.enableShutdownHooks();
await app.init();
return new TestServer(app, testingModule);
}
}
let testServer: TestServer;
let pool: DatabasePool;
export async function generateTestingApplication(): Promise<{
testServer: TestServer;
}> {
const testServer = await TestServer.new(
Test.createTestingModule({
imports: [AppModule],
}),
);
return {
testServer,
};
}
export function getTestServer(): TestServer {
return testServer;
}
export function getConnectionPool(): DatabasePool {
return pool;
}
export function getHttpServer(): request.SuperTest<request.Test> {
const testServer = getTestServer();
const httpServer = request(testServer.serverApplication.getHttpServer());
return httpServer;
}
// setup
beforeAll(async (): Promise<void> => {
({ testServer } = await generateTestingApplication());
pool = await createPool(postgresConnectionUri);
});
// cleanup
afterAll(async (): Promise<void> => {
await pool.end();
testServer.serverApplication.close();
});