From aac9028f896bc2aa64cff5ee4be2964ce6121edf Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 12 May 2026 04:16:12 +0100 Subject: [PATCH] test: guard fetch timeout mock calls --- src/utils/fetch-timeout.test.ts | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/utils/fetch-timeout.test.ts b/src/utils/fetch-timeout.test.ts index d6e04c31258..a870a05ce8f 100644 --- a/src/utils/fetch-timeout.test.ts +++ b/src/utils/fetch-timeout.test.ts @@ -11,11 +11,25 @@ vi.mock("../logging/subsystem.js", () => ({ import { buildTimeoutAbortSignal } from "./fetch-timeout.js"; -function requireWarnRecord(callIndex: number): Record { - const record = warn.mock.calls[callIndex]?.[1] as Record | undefined; - if (!record) { - throw new Error(`missing warning record ${callIndex}`); +function requireWarnCall(callIndex: number): [string, Record] { + const call = warn.mock.calls.at(callIndex); + if (!call) { + throw new Error(`missing warning call ${callIndex}`); } + const [message, record] = call; + if (typeof message !== "string" || !record || typeof record !== "object") { + throw new Error(`invalid warning call ${callIndex}`); + } + return [message, record as Record]; +} + +function requireWarnMessage(callIndex: number): string { + const [message] = requireWarnCall(callIndex); + return message; +} + +function requireWarnRecord(callIndex: number): Record { + const [, record] = requireWarnCall(callIndex); return record; } @@ -42,7 +56,7 @@ describe("buildTimeoutAbortSignal", () => { expect((signal?.reason as Error | undefined)?.name).toBe("TimeoutError"); expect((signal?.reason as Error | undefined)?.message).toBe("request timed out"); expect(warn).toHaveBeenCalledTimes(1); - expect(warn.mock.calls[0]?.[0]).toBe("fetch timeout reached; aborting operation"); + expect(requireWarnMessage(0)).toBe("fetch timeout reached; aborting operation"); const record = requireWarnRecord(0); expect(record.timeoutMs).toBe(25); expect(record.operation).toBe("unit-test"); @@ -102,7 +116,7 @@ describe("buildTimeoutAbortSignal", () => { vi.setSystemTime(2_000); await vi.advanceTimersByTimeAsync(25); - expect(warn.mock.calls[0]?.[0]).toBe("fetch timeout reached; aborting operation"); + expect(requireWarnMessage(0)).toBe("fetch timeout reached; aborting operation"); const record = requireWarnRecord(0); expect(record.timerDelayMs).toBe(2000); expect(record.eventLoopDelayHint).toBe("timer delayed 2000ms, likely event-loop starvation"); @@ -122,7 +136,7 @@ describe("buildTimeoutAbortSignal", () => { await vi.advanceTimersByTimeAsync(25); - expect(warn.mock.calls[0]?.[0]).toBe("fetch timeout reached; aborting operation"); + expect(requireWarnMessage(0)).toBe("fetch timeout reached; aborting operation"); expect(requireWarnRecord(0).url).toBe("/api/responses"); cleanup(); @@ -154,7 +168,7 @@ describe("buildTimeoutAbortSignal", () => { expect(signal?.aborted).toBe(true); expect(warn).toHaveBeenCalledTimes(1); - const [, record] = warn.mock.calls[0] as [string, Record]; + const record = requireWarnRecord(0); expect(record).not.toHaveProperty("operation"); expect(record).not.toHaveProperty("url"); expect(record.consoleMessage).toBe("fetch timeout after 25ms (elapsed 25ms)");