import { INestApplication } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import { execFileSync } from 'node:child_process'; import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { resolve } from 'node:path'; import { AppModule } from '../src/app.module'; import { configureApp } from '../src/main'; import { createOpenApiDocument } from '../src/openapi'; describe('OpenAPI contract (integration)', () => { let app: INestApplication; beforeAll(async () => { const module = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = module.createNestApplication(); configureApp(app); await app.init(); }); afterAll(() => app.close()); it('generates the runtime contract without server startup or deployment configuration', async () => { const directory = await mkdtemp(resolve(tmpdir(), 'wealthledger-openapi-')); try { const networkGuard = resolve(directory, 'no-network.cjs'); await writeFile( networkGuard, ` const net = require('node:net'); const forbidden = () => { throw new Error('Schema generation must not use the network'); }; net.Server.prototype.listen = forbidden; net.Socket.prototype.connect = forbidden; `, ); execFileSync( process.execPath, [ '--require', networkGuard, resolve(__dirname, '../scripts/generate-openapi.cjs'), ], { cwd: directory, env: { PATH: process.env.PATH }, timeout: 30_000, }, ); const generated = JSON.parse( await readFile(resolve(directory, 'openapi.json'), 'utf8'), ) as unknown; expect(generated).toEqual(createOpenApiDocument(app)); } finally { await rm(directory, { recursive: true, force: true }); } }); });