| import { beforeEach, describe, expect, it, vi } from "vitest"; |
|
|
| vi.mock("../../open-sse/utils/proxyFetch.js", () => ({ |
| proxyAwareFetch: vi.fn(), |
| })); |
|
|
| import { proxyAwareFetch } from "../../open-sse/utils/proxyFetch.js"; |
| import { getUsageForProvider } from "../../open-sse/services/usage.js"; |
|
|
| function jsonResponse(body, status = 200) { |
| return new Response(JSON.stringify(body), { |
| status, |
| headers: { "Content-Type": "application/json" }, |
| }); |
| } |
|
|
| describe("Gemini CLI usage project id resolution", () => { |
| beforeEach(() => { |
| vi.clearAllMocks(); |
| }); |
|
|
| it("uses the projectId stored on the provider connection", async () => { |
| proxyAwareFetch.mockResolvedValueOnce(jsonResponse({ |
| buckets: [ |
| { |
| modelId: "gemini-3-flash-preview", |
| remainingFraction: 0.75, |
| resetTime: "2026-05-25T12:00:00Z", |
| }, |
| ], |
| })); |
|
|
| const usage = await getUsageForProvider({ |
| provider: "gemini-cli", |
| accessToken: "token", |
| projectId: "cloud-code-project", |
| }); |
|
|
| expect(proxyAwareFetch).toHaveBeenCalledTimes(1); |
| expect(proxyAwareFetch).toHaveBeenCalledWith( |
| "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota", |
| expect.objectContaining({ |
| body: JSON.stringify({ project: "cloud-code-project" }), |
| }), |
| null |
| ); |
| expect(usage.quotas["gemini-3-flash-preview"]).toMatchObject({ |
| used: 250, |
| total: 1000, |
| remainingPercentage: 75, |
| }); |
| }); |
|
|
| it("normalizes project objects returned by loadCodeAssist", async () => { |
| proxyAwareFetch |
| .mockResolvedValueOnce(jsonResponse({ |
| cloudaicompanionProject: { id: "project-from-load" }, |
| currentTier: { name: "Free" }, |
| })) |
| .mockResolvedValueOnce(jsonResponse({ buckets: [] })); |
|
|
| await getUsageForProvider({ |
| provider: "gemini-cli", |
| accessToken: "token", |
| }); |
|
|
| expect(proxyAwareFetch).toHaveBeenLastCalledWith( |
| "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota", |
| expect.objectContaining({ |
| body: JSON.stringify({ project: "project-from-load" }), |
| }), |
| null |
| ); |
| }); |
|
|
| it("returns actionable guidance when no project id is available", async () => { |
| proxyAwareFetch.mockResolvedValueOnce(jsonResponse({})); |
|
|
| const usage = await getUsageForProvider({ |
| provider: "gemini-cli", |
| accessToken: "token", |
| }); |
|
|
| expect(usage.message).toContain("Reconnect Gemini CLI"); |
| expect(usage.message).toContain("Gemini Code Assist"); |
| }); |
| }); |
|
|