import { afterEach, describe, expect, it, vi } from "vitest"; import { AnalysisCancelledError } from "../domain/analysisErrorCore.js"; import { delayWithCancellation } from "./CdpCaptureValues.js"; describe("cancellable browser observation delays", () => { afterEach(() => vi.useRealTimers()); it("schedules durations beyond the native timer range in consecutive waits", async () => { vi.useFakeTimers(); let completed = false; const waiting = delayWithCancellation( 2_147_483_648, "observe_javascript_runtime", ).then(() => { completed = true; }); expect(vi.getTimerCount()).toBe(1); await vi.advanceTimersByTimeAsync(2_147_483_647); expect(completed).toBe(false); expect(vi.getTimerCount()).toBe(1); await vi.advanceTimersByTimeAsync(1); await waiting; expect(completed).toBe(true); }); it("preserves exact cancellation reasons before and during a capture wait", async () => { const preAbortedReason = { _tag: "pre-aborted" }; const preAborted = new AbortController(); preAborted.abort(preAbortedReason); const beforeStart = await delayWithCancellation( 1, "observe_web_execution", preAborted.signal, ).catch((error: unknown) => error); expect(beforeStart).toBeInstanceOf(AnalysisCancelledError); expect( beforeStart instanceof AnalysisCancelledError && beforeStart.cause, ).toBe(preAbortedReason); vi.useFakeTimers(); const reason = new Error("capture wait cancelled"); const active = new AbortController(); const waiting = delayWithCancellation( 10_000, "observe_web_execution", active.signal, ).catch((error: unknown) => error); active.abort(reason); const duringWait = await waiting; expect(duringWait).toBeInstanceOf(AnalysisCancelledError); expect( duringWait instanceof AnalysisCancelledError && duringWait.cause, ).toBe(reason); expect(vi.getTimerCount()).toBe(0); }); });