54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
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<string>;
|
|
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 }),
|
|
);
|
|
});
|
|
});
|