import { EventEmitter } from 'node:events'; import { RequestLoggingMiddleware } from './request-logging.middleware'; describe('RequestLoggingMiddleware', () => { it('returns a server ID and emits one safe completion event', () => { const requestContext = { run: jest.fn((_: unknown, next: () => void) => next()), }; const logger = { event: jest.fn() }; const middleware = new RequestLoggingMiddleware( requestContext as never, logger as never, ); const response = Object.assign(new EventEmitter(), { statusCode: 200, locals: {}, setHeader: jest.fn(), }); const next = jest.fn(); const request: { method: string; baseUrl: string; route: { path: string }; header: jest.Mock; id?: string; } = { method: 'GET', baseUrl: '/api/v1', route: { path: '/accounts/:id' }, header: jest.fn(() => 'a2dc6fbb-5a48-4c3c-9e3e-4fbf4d638a43'), }; middleware.use(request as never, response as never, next); response.emit('finish'); expect(response.setHeader).toHaveBeenCalledWith( 'X-Request-ID', expect.stringMatching(/^[0-9a-f-]{36}$/i), ); expect(request.id).toMatch(/^[0-9a-f-]{36}$/i); expect(requestContext.run).toHaveBeenCalledWith( expect.objectContaining({ clientRequestId: 'a2dc6fbb-5a48-4c3c-9e3e-4fbf4d638a43', }), next, ); expect(logger.event).toHaveBeenCalledWith( 'info', 'http.request.completed', expect.objectContaining({ route: '/api/v1/accounts/:id', status: 200 }), ); }); });