mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
feat: implement the feature for checking quota of orbit provider
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
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";
|
||||
import { parseOrbitUsage } from "../../open-sse/services/usage/orbit.js";
|
||||
import { PROVIDERS } from "../../open-sse/providers/index.js";
|
||||
import { USAGE_APIKEY_PROVIDERS, USAGE_SUPPORTED_PROVIDERS } from "../../src/shared/constants/providers.js";
|
||||
import { parseQuotaData } from "../../src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js";
|
||||
|
||||
const ORBIT_USAGE_RESPONSE = {
|
||||
success: true,
|
||||
data: {
|
||||
plan: "starter",
|
||||
usagePercent: 100,
|
||||
isExhausted: true,
|
||||
resetPeriod: "monthly",
|
||||
periodEnd: null,
|
||||
tokensUsed: 57288213,
|
||||
tokenLimit: 50000000,
|
||||
tokensRemaining: 0,
|
||||
daily: null,
|
||||
credit: {
|
||||
balanceMicroUsd: 397891136,
|
||||
balanceUsd: 397.891136,
|
||||
balanceUsdFormatted: "$397.89",
|
||||
grantedMicroUsd: 500000000,
|
||||
grantedUsd: 500,
|
||||
spentMicroUsd: 102108864,
|
||||
spentUsd: 102.108864,
|
||||
currency: "USD",
|
||||
source: "ledger",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
function jsonResponse(body, status = 200) {
|
||||
return new Response(JSON.stringify(body), {
|
||||
status,
|
||||
headers: { "Content-Type": "application/json" },
|
||||
});
|
||||
}
|
||||
|
||||
describe("Orbit Provider usage registry", () => {
|
||||
it("exposes its usage endpoint and API-key eligibility", () => {
|
||||
expect(PROVIDERS["orbit-provider"].usage?.url).toBe(
|
||||
"https://api.orbit-provider.com/v1/usage",
|
||||
);
|
||||
expect(USAGE_SUPPORTED_PROVIDERS).toContain("orbit-provider");
|
||||
expect(USAGE_APIKEY_PROVIDERS).toContain("orbit-provider");
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseOrbitUsage", () => {
|
||||
it("normalizes exhausted monthly tokens and USD credit", () => {
|
||||
const usage = parseOrbitUsage(ORBIT_USAGE_RESPONSE);
|
||||
|
||||
expect(usage).toMatchObject({
|
||||
plan: "starter",
|
||||
isExhausted: true,
|
||||
resetPeriod: "monthly",
|
||||
});
|
||||
expect(usage.quotas["Tokens (monthly)"]).toMatchObject({
|
||||
used: 57288213,
|
||||
total: 50000000,
|
||||
remaining: 0,
|
||||
remainingPercentage: 0,
|
||||
resetAt: null,
|
||||
});
|
||||
expect(usage.quotas["Credit (USD)"]).toMatchObject({
|
||||
used: 102.108864,
|
||||
total: 500,
|
||||
remaining: 397.891136,
|
||||
});
|
||||
expect(usage.quotas["Credit (USD)"].remainingPercentage).toBeCloseTo(79.5782272);
|
||||
});
|
||||
|
||||
it("rejects an unsuccessful or malformed payload", () => {
|
||||
expect(parseOrbitUsage({ success: false })).toEqual({
|
||||
message: "Orbit Provider usage response was invalid.",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("getUsageForProvider(orbit-provider)", () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it("fetches Orbit usage with the connection API key", async () => {
|
||||
proxyAwareFetch.mockResolvedValueOnce(jsonResponse(ORBIT_USAGE_RESPONSE));
|
||||
const proxyOptions = { connectionProxyEnabled: true };
|
||||
|
||||
const usage = await getUsageForProvider({
|
||||
provider: "orbit-provider",
|
||||
apiKey: "test-orbit-key",
|
||||
}, proxyOptions);
|
||||
|
||||
expect(usage.plan).toBe("starter");
|
||||
expect(usage.quotas["Tokens (monthly)"].remainingPercentage).toBe(0);
|
||||
expect(proxyAwareFetch).toHaveBeenCalledWith(
|
||||
"https://api.orbit-provider.com/v1/usage",
|
||||
expect.objectContaining({
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: "Bearer test-orbit-key",
|
||||
Accept: "application/json",
|
||||
},
|
||||
}),
|
||||
proxyOptions,
|
||||
);
|
||||
});
|
||||
|
||||
it("returns an authentication message for an invalid API key", async () => {
|
||||
proxyAwareFetch.mockResolvedValueOnce(jsonResponse({ error: "unauthorized" }, 401));
|
||||
|
||||
const usage = await getUsageForProvider({
|
||||
provider: "orbit-provider",
|
||||
apiKey: "invalid",
|
||||
});
|
||||
|
||||
expect(usage.message).toMatch(/invalid or expired/i);
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseQuotaData(orbit-provider)", () => {
|
||||
it("renders only the credit progress bar", () => {
|
||||
const usage = parseOrbitUsage(ORBIT_USAGE_RESPONSE);
|
||||
const rows = parseQuotaData("orbit-provider", usage);
|
||||
|
||||
expect(rows).toHaveLength(1);
|
||||
expect(rows[0]).toMatchObject({
|
||||
name: "Credit (USD)",
|
||||
used: 102.108864,
|
||||
total: 500,
|
||||
});
|
||||
expect(rows[0].remainingPercentage).toBeCloseTo(79.5782272);
|
||||
});
|
||||
});
|
||||
@@ -16,6 +16,7 @@ const SUPPORTED = [
|
||||
"github", "gemini-cli", "antigravity", "claude", "codex", "kiro",
|
||||
"qoder", "qwen", "iflow", "ollama", "glm", "glm-cn",
|
||||
"minimax", "minimax-cn", "vercel-ai-gateway", "grok-cli",
|
||||
"orbit-provider",
|
||||
];
|
||||
|
||||
describe("usage dispatch", () => {
|
||||
|
||||
Reference in New Issue
Block a user