pediatric-ai-scribe-v3/test/metrics.test.js
2026-05-08 20:22:14 +02:00

77 lines
2.3 KiB
JavaScript

const { test } = require('node:test');
const assert = require('node:assert/strict');
const EventEmitter = require('node:events');
const { metricsHandler, metricsMiddleware, register } = require('../src/utils/metrics');
test('metrics middleware records HTTP request counters and durations', async () => {
const req = {
method: 'GET',
path: '/api/encounters/123',
url: '/api/encounters/123',
baseUrl: '',
route: null
};
const res = new EventEmitter();
res.statusCode = 200;
await new Promise((resolve) => metricsMiddleware(req, res, resolve));
res.emit('finish');
const metrics = await register.metrics();
assert.match(metrics, /ped_ai_http_requests_total/);
assert.match(metrics, /route="\/api\/encounters\/:id"/);
assert.match(metrics, /ped_ai_http_request_duration_seconds_count/);
});
test('metrics middleware uses the first path for Express array routes', async () => {
const req = {
method: 'GET',
path: '/',
url: '/',
baseUrl: '',
route: { path: ['/', '/index.html'] }
};
const res = new EventEmitter();
res.statusCode = 200;
await new Promise((resolve) => metricsMiddleware(req, res, resolve));
res.emit('finish');
const metrics = await register.metrics();
assert.match(metrics, /route="\/"/);
assert.doesNotMatch(metrics, /route="\/,\/index\.html"/);
});
test('metrics middleware collapses unmatched 404 routes', async () => {
const req = {
method: 'GET',
path: '/wp-content/plugins/example.php',
url: '/wp-content/plugins/example.php?probe=1',
baseUrl: '',
route: null
};
const res = new EventEmitter();
res.statusCode = 404;
await new Promise((resolve) => metricsMiddleware(req, res, resolve));
res.emit('finish');
const metrics = await register.metrics();
assert.match(metrics, /route="unmatched"/);
assert.doesNotMatch(metrics, /wp-content\/plugins\/example\.php/);
});
test('metrics handler exposes prometheus content type', async () => {
const headers = {};
const res = {
body: '',
setHeader: function(name, value) { headers[name] = value; },
end: function(body) { this.body = body; }
};
await metricsHandler({}, res);
assert.equal(headers['Content-Type'], register.contentType);
assert.match(res.body, /ped_ai_process_cpu_user_seconds_total/);
});