mirror of
https://github.com/musistudio/claude-code-router.git
synced 2026-07-09 17:18:24 +00:00
131 lines
4.7 KiB
TypeScript
131 lines
4.7 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { newApiKeyUsageAccountConfig } from "../../packages/core/src/providers/new-api.ts";
|
|
import { geminiProviderPreset } from "../../packages/core/src/providers/presets/gemini/index.ts";
|
|
import {
|
|
applyProviderProbeResult,
|
|
createProviderDraft,
|
|
providerAccountConnectorsTextWithNewApiUserBalanceTemplate,
|
|
providerProtocolOptions,
|
|
providerProbeCandidates,
|
|
setProviderPresets
|
|
} from "../../packages/ui/src/pages/home/shared/index.tsx";
|
|
|
|
test("Gemini preset keeps full protocol probing candidates", () => {
|
|
setProviderPresets([geminiProviderPreset]);
|
|
const draft = {
|
|
...createProviderDraft([]),
|
|
presetId: "gemini"
|
|
};
|
|
|
|
const candidates = providerProbeCandidates(draft);
|
|
|
|
assert.equal(candidates.length, 1);
|
|
assert.deepEqual(candidates[0].protocols, providerProtocolOptions.map((option) => option.value));
|
|
});
|
|
|
|
test("provider probe result drops unavailable selected protocols", () => {
|
|
const draft = {
|
|
...createProviderDraft([]),
|
|
baseUrl: "https://generativelanguage.googleapis.com",
|
|
protocol: "gemini_generate_content",
|
|
selectedProtocols: providerProtocolOptions.map((option) => option.value)
|
|
};
|
|
|
|
const next = applyProviderProbeResult(draft, {
|
|
capabilities: [],
|
|
detectedProtocol: "gemini_generate_content",
|
|
models: [],
|
|
normalizedBaseUrl: draft.baseUrl,
|
|
protocols: providerProtocolOptions.map((option) => ({
|
|
endpoint: draft.baseUrl,
|
|
message: "HTTP 404",
|
|
protocol: option.value,
|
|
status: 404,
|
|
supported: false
|
|
}))
|
|
});
|
|
|
|
assert.deepEqual(next.selectedProtocols, []);
|
|
});
|
|
|
|
test("provider probe result keeps only supported selected protocols", () => {
|
|
const draft = {
|
|
...createProviderDraft([]),
|
|
baseUrl: "https://generativelanguage.googleapis.com",
|
|
protocol: "gemini_generate_content",
|
|
selectedProtocols: providerProtocolOptions.map((option) => option.value)
|
|
};
|
|
|
|
const next = applyProviderProbeResult(draft, {
|
|
capabilities: [],
|
|
detectedProtocol: "gemini_generate_content",
|
|
models: [],
|
|
normalizedBaseUrl: draft.baseUrl,
|
|
protocols: providerProtocolOptions.map((option) => ({
|
|
endpoint: draft.baseUrl,
|
|
message: option.value === "gemini_generate_content" ? "HTTP 400: contents is not specified" : "HTTP 404",
|
|
protocol: option.value,
|
|
status: option.value === "gemini_generate_content" ? 400 : 404,
|
|
supported: option.value === "gemini_generate_content"
|
|
}))
|
|
});
|
|
|
|
assert.deepEqual(next.selectedProtocols, ["gemini_generate_content"]);
|
|
});
|
|
|
|
test("provider probe result applies detected New API key quota account connector", () => {
|
|
const draft = {
|
|
...createProviderDraft([]),
|
|
accountEnabled: false,
|
|
baseUrl: "https://gateway.example/v1",
|
|
protocol: "openai_chat_completions"
|
|
};
|
|
const account = newApiKeyUsageAccountConfig("https://gateway.example/v1");
|
|
|
|
const next = applyProviderProbeResult(draft, {
|
|
account,
|
|
detectedProvider: "new-api",
|
|
detectedProtocol: "openai_chat_completions",
|
|
models: [],
|
|
normalizedBaseUrl: draft.baseUrl,
|
|
protocols: [
|
|
{
|
|
detectedProvider: "new-api",
|
|
endpoint: "https://gateway.example/v1/chat/completions",
|
|
message: "HTTP 401",
|
|
protocol: "openai_chat_completions",
|
|
status: 401,
|
|
supported: true
|
|
}
|
|
]
|
|
});
|
|
|
|
assert.equal(next.accountEnabled, true);
|
|
assert.equal(next.accountMode, "raw");
|
|
const connectors = JSON.parse(next.accountConnectorsText);
|
|
assert.equal(connectors.length, 1);
|
|
assert.equal(connectors[0].endpoint, "https://gateway.example/api/usage/token/");
|
|
assert.equal(connectors[0].parser, "new-api-key-usage");
|
|
assert.equal(connectors[0].mapping.meters[0].id, "new_api_key_quota");
|
|
assert.equal(connectors[0].mapping.meters[0].kind, "quota");
|
|
assert.equal(connectors[0].mapping.meters[0].remaining, "$.data.total_available");
|
|
});
|
|
|
|
test("New API user balance template adds configurable user self connector", () => {
|
|
const account = newApiKeyUsageAccountConfig("https://gateway.example/v1");
|
|
const text = providerAccountConnectorsTextWithNewApiUserBalanceTemplate(
|
|
JSON.stringify(account.connectors ?? [], null, 2),
|
|
"https://gateway.example/v1",
|
|
"42"
|
|
);
|
|
const connectors = JSON.parse(text);
|
|
|
|
assert.equal(connectors.length, 2);
|
|
assert.equal(connectors[0].parser, "new-api-key-usage");
|
|
assert.equal(connectors[1].endpoint, "https://gateway.example/api/user/self");
|
|
assert.equal(connectors[1].parser, "new-api-user-self");
|
|
assert.equal(connectors[1].headers.Authorization, "Bearer <new-api-access-token>");
|
|
assert.equal(connectors[1].headers["New-Api-User"], "42");
|
|
assert.equal(connectors[1].mapping.meters[0].id, "new_api_user_balance");
|
|
});
|