import { NestExpressApplication } from '@nestjs/platform-express'; import { Test, TestingModule, TestingModuleBuilder } from '@nestjs/testing'; import { AppModule } from 'src/app.module'; interface TestingModuleCreatePreHook { (moduleBuilder: TestingModuleBuilder): TestingModuleBuilder; } /** * Hook for adding items to nest application */ export type TestingAppCreatePreHook = ( app: NestExpressApplication, ) => Promise; /** * Sets basic integration testing module of app */ export const createApp = async ( config: { moduleBuilderHook?: TestingModuleCreatePreHook; appInitHook?: TestingAppCreatePreHook; } = {}, ): Promise => { let moduleBuilder: TestingModuleBuilder = Test.createTestingModule({ imports: [AppModule], }); if (config.moduleBuilderHook) { moduleBuilder = config.moduleBuilderHook(moduleBuilder); } const moduleFixture: TestingModule = await moduleBuilder.compile(); const app = moduleFixture.createNestApplication(); if (config.appInitHook) { await config.appInitHook(app); } await app.init(); return app; };