refactor: dedupe provider usage fetch logic and tests
This commit is contained in:
57
src/infra/provider-usage.fetch.codex.test.ts
Normal file
57
src/infra/provider-usage.fetch.codex.test.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { createProviderUsageFetch, makeResponse } from "../test-utils/provider-usage-fetch.js";
|
||||
import { fetchCodexUsage } from "./provider-usage.fetch.codex.js";
|
||||
|
||||
describe("fetchCodexUsage", () => {
|
||||
it("returns token expired for auth failures", async () => {
|
||||
const mockFetch = createProviderUsageFetch(async () =>
|
||||
makeResponse(401, { error: "unauthorized" }),
|
||||
);
|
||||
|
||||
const result = await fetchCodexUsage("token", undefined, 5000, mockFetch);
|
||||
expect(result.error).toBe("Token expired");
|
||||
expect(result.windows).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("returns HTTP status errors for non-auth failures", async () => {
|
||||
const mockFetch = createProviderUsageFetch(async () =>
|
||||
makeResponse(429, { error: "throttled" }),
|
||||
);
|
||||
|
||||
const result = await fetchCodexUsage("token", undefined, 5000, mockFetch);
|
||||
expect(result.error).toBe("HTTP 429");
|
||||
expect(result.windows).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("parses windows, reset times, and plan balance", async () => {
|
||||
const mockFetch = createProviderUsageFetch(async (_url, init) => {
|
||||
const headers = (init?.headers as Record<string, string> | undefined) ?? {};
|
||||
expect(headers["ChatGPT-Account-Id"]).toBe("acct-1");
|
||||
return makeResponse(200, {
|
||||
rate_limit: {
|
||||
primary_window: {
|
||||
limit_window_seconds: 10_800,
|
||||
used_percent: 35.5,
|
||||
reset_at: 1_700_000_000,
|
||||
},
|
||||
secondary_window: {
|
||||
limit_window_seconds: 86_400,
|
||||
used_percent: 75,
|
||||
reset_at: 1_700_050_000,
|
||||
},
|
||||
},
|
||||
plan_type: "Plus",
|
||||
credits: { balance: "12.5" },
|
||||
});
|
||||
});
|
||||
|
||||
const result = await fetchCodexUsage("token", "acct-1", 5000, mockFetch);
|
||||
|
||||
expect(result.provider).toBe("openai-codex");
|
||||
expect(result.plan).toBe("Plus ($12.50)");
|
||||
expect(result.windows).toEqual([
|
||||
{ label: "3h", usedPercent: 35.5, resetAt: 1_700_000_000_000 },
|
||||
{ label: "Day", usedPercent: 75, resetAt: 1_700_050_000_000 },
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user