import http from 'node:http'; import assert from 'node:assert/strict'; import test from 'node:test'; import { createAlertNotifier } from '../src/core/alert-notifier.mjs'; test('alert notifier dedupes repeated deliveries and records clear transitions separately', async () => { const requests = []; const server = http.createServer(async (req, res) => { let body = ''; for await (const chunk of req) body += chunk; requests.push(JSON.parse(body)); res.statusCode = 200; res.end('{}'); }); await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); const address = server.address(); const notifier = createAlertNotifier({ webhookUrl: `http://127.0.0.1:${address.port}/alerts`, }); const raised = { alert_code: 'near_intents_quotes_stale', status: 'raised', severity: 'critical', service_scope: 'near-intents-ingest', reason: 'quote truth stale', pair: 'btc->eure', raised_at: '2026-04-08T10:00:00.000Z', cleared_at: null, last_evaluated_at: '2026-04-08T10:00:00.000Z', details: {}, }; const cleared = { ...raised, status: 'cleared', cleared_at: '2026-04-08T10:01:00.000Z', }; const first = await notifier.notify(raised); const second = await notifier.notify(raised); const third = await notifier.notify(cleared); assert.equal(first.ok, true); assert.equal(second.deduped, true); assert.equal(third.ok, true); assert.equal(requests.length, 2); assert.equal(requests[0].alert.status, 'raised'); assert.equal(requests[1].alert.status, 'cleared'); await new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve()))); });