79 lines
1.9 KiB
TypeScript
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();
|
|
});
|