59 lines
2.1 KiB
TypeScript
59 lines
2.1 KiB
TypeScript
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);
|
|
});
|