// @vitest-environment node import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("server-only", () => ({})); import { getGateQuota, parseGateQuota, QuotaError, } from "@/lib/chat/quota"; const finiteQuota = { object: "aegida.quota", model: "qwen", available_tokens: 42_000, unlimited: false, exhausted: false, resets_at: "2026-08-05T00:00:00Z", as_of: "2026-08-04T12:00:00Z", }; beforeEach(() => { vi.stubEnv("AEGIDA_GATE_URL", "https://gate.example.test"); }); afterEach(() => { vi.unstubAllEnvs(); vi.unstubAllGlobals(); }); describe("Aegida effective quota", () => { it("strictly parses finite, exhausted, and unlimited snapshots", () => { expect(parseGateQuota(finiteQuota, "qwen")).toEqual({ object: "aegida.quota", model: "qwen", availableTokens: 42_000, unlimited: false, exhausted: false, resetsAt: "2026-08-05T00:00:00Z", asOf: "2026-08-04T12:00:00Z", }); expect( parseGateQuota( { ...finiteQuota, available_tokens: 0, exhausted: true, resets_at: null }, "qwen", ), ).toMatchObject({ availableTokens: 0, exhausted: true, unlimited: false }); expect( parseGateQuota( { ...finiteQuota, model: "auto", available_tokens: null, unlimited: true, exhausted: false, resets_at: null, }, "auto", ), ).toMatchObject({ availableTokens: null, unlimited: true, exhausted: false }); }); it.each([ ["unknown field", { ...finiteQuota, private_policy: "sentinel" }], ["wrong object", { ...finiteQuota, object: "quota" }], ["wrong model", finiteQuota, "auto"], ["negative tokens", { ...finiteQuota, available_tokens: -1 }], ["zero not exhausted", { ...finiteQuota, available_tokens: 0 }], ["positive exhausted", { ...finiteQuota, exhausted: true }], ["finite null tokens", { ...finiteQuota, available_tokens: null }], ["unlimited tokens", { ...finiteQuota, unlimited: true }], [ "unlimited reset", { ...finiteQuota, available_tokens: null, unlimited: true, resets_at: "2026-08-05T00:00:00Z" }, ], ["bad reset", { ...finiteQuota, resets_at: "tomorrow" }], ["bad as-of", { ...finiteQuota, as_of: "today" }], ])("rejects %s", (_name, value, model = "qwen") => { expect(() => parseGateQuota(value, model)).toThrow(QuotaError); }); it("relays the exact user token with model and no-store semantics", async () => { const fetchMock = vi.fn().mockResolvedValue(Response.json(finiteQuota)); vi.stubGlobal("fetch", fetchMock); const signal = new AbortController().signal; await expect(getGateQuota("qwen", "Bearer exact-user-jwt", signal)).resolves.toMatchObject({ model: "qwen", availableTokens: 42_000, }); expect(fetchMock).toHaveBeenCalledWith( "https://gate.example.test/v1/aegida/quota?model=qwen", { method: "GET", headers: { Accept: "application/json", Authorization: "Bearer exact-user-jwt" }, cache: "no-store", redirect: "error", signal, }, ); }); it("classifies upstream authentication and sanitizes every other failure", async () => { vi.stubGlobal( "fetch", vi .fn() .mockResolvedValueOnce(new Response("private-auth-sentinel", { status: 401 })) .mockResolvedValueOnce(new Response("private-dependency-sentinel", { status: 500 })), ); await expect( getGateQuota("qwen", "Bearer user", new AbortController().signal), ).rejects.toMatchObject({ reason: "unauthorized" }); let error: unknown; try { await getGateQuota("qwen", "Bearer user", new AbortController().signal); } catch (caught) { error = caught; } expect(error).toMatchObject({ reason: "unavailable" }); expect(String(error)).not.toContain("private-dependency-sentinel"); }); });