import { afterEach, describe, expect, it, vi } from "vitest"; import { buildAuthHealthSummary, DEFAULT_OAUTH_WARN_MS } from "./auth-health.js"; describe("buildAuthHealthSummary", () => { const now = 1_700_000_000_000; afterEach(() => { vi.restoreAllMocks(); }); it("classifies OAuth and API key profiles", () => { vi.spyOn(Date, "now").mockReturnValue(now); const store = { version: 1, profiles: { "anthropic:ok": { type: "oauth" as const, provider: "anthropic", access: "access", refresh: "refresh", expires: now + DEFAULT_OAUTH_WARN_MS + 60_000, }, "anthropic:expiring": { type: "oauth" as const, provider: "anthropic", access: "access", refresh: "refresh", expires: now + 10_000, }, "anthropic:expired": { type: "oauth" as const, provider: "anthropic", access: "access", refresh: "refresh", expires: now - 10_000, }, "anthropic:api": { type: "api_key" as const, provider: "anthropic", key: "sk-ant-api", }, }, }; const summary = buildAuthHealthSummary({ store, warnAfterMs: DEFAULT_OAUTH_WARN_MS, }); const statuses = Object.fromEntries( summary.profiles.map((profile) => [profile.profileId, profile.status]), ); expect(statuses["anthropic:ok"]).toBe("ok"); // OAuth credentials with refresh tokens are auto-renewable, so they report "ok" expect(statuses["anthropic:expiring"]).toBe("ok"); expect(statuses["anthropic:expired"]).toBe("ok"); expect(statuses["anthropic:api"]).toBe("static"); const provider = summary.providers.find((entry) => entry.provider === "anthropic"); expect(provider?.status).toBe("ok"); }); it("reports expired for OAuth without a refresh token", () => { vi.spyOn(Date, "now").mockReturnValue(now); const store = { version: 1, profiles: { "google:no-refresh": { type: "oauth" as const, provider: "google-antigravity", access: "access", refresh: "", expires: now - 10_000, }, }, }; const summary = buildAuthHealthSummary({ store, warnAfterMs: DEFAULT_OAUTH_WARN_MS, }); const statuses = Object.fromEntries( summary.profiles.map((profile) => [profile.profileId, profile.status]), ); expect(statuses["google:no-refresh"]).toBe("expired"); }); });