import { afterEach, describe, expect, it, vi } from "vitest"; import { clampPercent, resolveUsageProviderId, withTimeout } from "./provider-usage.shared.js"; describe("provider-usage.shared", () => { afterEach(() => { vi.useRealTimers(); vi.restoreAllMocks(); }); it.each([ { value: "z-ai", expected: "zai" }, { value: " GOOGLE-GEMINI-CLI ", expected: "google-gemini-cli" }, { value: "unknown-provider", expected: undefined }, { value: undefined, expected: undefined }, { value: null, expected: undefined }, ])("normalizes provider ids for %j", ({ value, expected }) => { expect(resolveUsageProviderId(value)).toBe(expected); }); it.each([ { value: -5, expected: 0 }, { value: 42, expected: 42 }, { value: 120, expected: 100 }, { value: Number.NaN, expected: 0 }, { value: Number.POSITIVE_INFINITY, expected: 0 }, ])("clamps usage percents for %j", ({ value, expected }) => { expect(clampPercent(value)).toBe(expected); }); it("returns work result when it resolves before timeout", async () => { await expect(withTimeout(Promise.resolve("ok"), 100, "fallback")).resolves.toBe("ok"); }); it("propagates work errors before timeout", async () => { await expect(withTimeout(Promise.reject(new Error("boom")), 100, "fallback")).rejects.toThrow( "boom", ); }); it("returns fallback when timeout wins", async () => { vi.useFakeTimers(); const late = new Promise((resolve) => setTimeout(() => resolve("late"), 50)); const result = withTimeout(late, 1, "fallback"); await vi.advanceTimersByTimeAsync(1); await expect(result).resolves.toBe("fallback"); }); it("clears the timeout after successful work", async () => { const clearTimeoutSpy = vi.spyOn(globalThis, "clearTimeout"); await expect(withTimeout(Promise.resolve("ok"), 100, "fallback")).resolves.toBe("ok"); expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); }); });