import assert from 'node:assert/strict'; import test from 'node:test'; import { clearDataSourceTelemetry, getDataSourceTelemetry, observeDataSource, recordDataSourceOutcome, } from './source-telemetry.js'; test('reports unobserved sources without treating them as failures', () => { clearDataSourceTelemetry(); const report = getDataSourceTelemetry(new Date('2026-08-07T08:00:00Z')); assert.ok(report.sources.every(source => source.state === 'unobserved')); assert.ok(report.sources.every(source => source.failureRate === null)); }); test('publishes rolling outcomes and last success/failure timestamps', () => { clearDataSourceTelemetry(); recordDataSourceOutcome('oneOsMileage', true, 1_000); recordDataSourceOutcome('oneOsMileage', false, 2_000); const source = getDataSourceTelemetry().sources.find(item => item.source === 'oneOsMileage'); assert.deepEqual(source && { state: source.state, attempts: source.attempts, failures: source.failures, failureRate: source.failureRate, lastSuccessAt: source.lastSuccessAt, lastFailureAt: source.lastFailureAt, }, { state: 'failing', attempts: 2, failures: 1, failureRate: 0.5, lastSuccessAt: '1970-01-01T00:00:01.000Z', lastFailureAt: '1970-01-01T00:00:02.000Z', }); }); test('observes final operation outcomes without retaining error details', async () => { clearDataSourceTelemetry(); await assert.rejects(observeDataSource('hydrogenDatabase', async () => { throw new Error('sensitive connection detail'); })); const serialized = JSON.stringify(getDataSourceTelemetry()); assert.equal(serialized.includes('sensitive connection detail'), false); }); test('keeps only the latest 100 outcomes', () => { clearDataSourceTelemetry(); recordDataSourceOutcome('etcDatabase', false, 1); for (let index = 0; index < 100; index += 1) { recordDataSourceOutcome('etcDatabase', true, index + 2); } const source = getDataSourceTelemetry().sources.find(item => item.source === 'etcDatabase'); assert.equal(source?.attempts, 100); assert.equal(source?.failures, 0); assert.equal(source?.failureRate, 0); });