import { compareAuditResults, summarizeAuditResults, type ScenarioAuditMetrics, } from "../e2e/fixtures/metrics"; const makeMetrics = ( overrides: Partial & Pick ): ScenarioAuditMetrics => ({ scenarioId: overrides.scenarioId, sessionMs: overrides.sessionMs ?? 1000, reconnectEvents: overrides.reconnectEvents ?? 0, reconnectedEvents: overrides.reconnectedEvents ?? 0, disconnectedEvents: overrides.disconnectedEvents ?? 0, connectionOpenCount: overrides.connectionOpenCount ?? 1, connectionCloseCount: overrides.connectionCloseCount ?? 1, binaryFramesReceived: overrides.binaryFramesReceived ?? 10, finishMessagesReceived: overrides.finishMessagesReceived ?? 1, finalsCount: overrides.finalsCount ?? 3, duplicateFinals: overrides.duplicateFinals ?? 0, maxBufferedAudioBytes: overrides.maxBufferedAudioBytes ?? 0, bufferedAudioObserved: overrides.bufferedAudioObserved ?? false, drainedAfterRecovery: overrides.drainedAfterRecovery ?? true, timeToBufferingMs: overrides.timeToBufferingMs ?? null, timeToRecoveryMs: overrides.timeToRecoveryMs ?? null, timeToDrainAfterRecoveryMs: overrides.timeToDrainAfterRecoveryMs ?? null, flags: overrides.flags ?? [], }); describe("resilience audit metrics", () => { it("compares current results against a committed baseline", () => { const baseline = [ makeMetrics({ scenarioId: "fault_case", reconnectedEvents: 1, finishMessagesReceived: 1, maxBufferedAudioBytes: 4000, timeToRecoveryMs: 500, bufferedAudioObserved: true, drainedAfterRecovery: true, }), ]; const current = [ makeMetrics({ scenarioId: "fault_case", disconnectedEvents: 1, reconnectedEvents: 0, finishMessagesReceived: 0, maxBufferedAudioBytes: 16000, timeToRecoveryMs: 1100, bufferedAudioObserved: true, drainedAfterRecovery: false, flags: ["terminal_disconnect_observed"], }), ]; const comparison = compareAuditResults(current, baseline); expect(comparison.baselineAvailable).toBeTruthy(); expect(comparison.regressions.map((regression) => regression.metric)).toEqual( expect.arrayContaining([ "disconnectedEvents", "finishMessagesReceived", "reconnectedEvents", "maxBufferedAudioBytes", "timeToRecoveryMs", "drainedAfterRecovery", "flags", ]) ); }); it("summarizes the audit run for reporting", () => { const summary = summarizeAuditResults([ makeMetrics({ scenarioId: "baseline", finishMessagesReceived: 1, }), makeMetrics({ scenarioId: "fault", bufferedAudioObserved: true, drainedAfterRecovery: false, timeToRecoveryMs: 250, }), ]); expect(summary.finishDeliveryRate).toBe(1); expect(summary.drainCompletionRate).toBe(0.5); expect(summary.medianRecoveryTimeMs).toBe(250); expect(summary.maxBufferedAudioBytes).toBe(0); }); });