import { INestApplication, ValidationPipe } from '@nestjs/common'; import { ModuleMetadata } from '@nestjs/common/interfaces'; import { Test, TestingModuleBuilder } from '@nestjs/testing'; import { AllExceptionsFilter } from '../../src/common/filters/all-exceptions.filter'; import { AppException } from '../../src/common/exceptions/app-exception'; import { buildValidationErrorResponse } from '../../src/common/helpers/validation-error.helper'; export async function createHttpTestApp( metadata: ModuleMetadata, configure: (builder: TestingModuleBuilder) => TestingModuleBuilder = (builder) => builder, ): Promise { const moduleRef = await configure(Test.createTestingModule(metadata)).compile(); const app = moduleRef.createNestApplication(); app.use((req: { requestId?: string }, _res: unknown, next: () => void) => { req.requestId = 'test-request-id'; next(); }); app.useGlobalFilters(new AllExceptionsFilter()); app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, transformOptions: { enableImplicitConversion: true }, exceptionFactory: (errors) => { const { normalizedError } = buildValidationErrorResponse(errors); return new AppException('VALIDATION_ERROR', { message: normalizedError.message, messageFa: normalizedError.messageFa, details: normalizedError.details, }); }, }), ); await app.init(); return app; }