Files
9router/tests/unit/orbit-provider.test.js
2026-07-17 16:17:50 +07:00

88 lines
3.0 KiB
JavaScript

import { describe, expect, it, vi } from "vitest";
import { getExecutor } from "../../open-sse/executors/index.js";
import { PROVIDERS, PROVIDER_MODELS } from "../../open-sse/providers/index.js";
import REGISTRY from "../../open-sse/providers/registry/index.js";
import { validateConfiguredClaudeApiKey } from "../../src/lib/providers/apiKeyValidation.js";
describe("Orbit Provider", () => {
const orbit = REGISTRY.find((entry) => entry.id === "orbit-provider");
it("registers an Anthropic-compatible API-key provider", () => {
expect(orbit).toBeDefined();
expect(orbit).toMatchObject({
alias: "orbit",
category: "apikey",
authType: "apikey",
serviceKinds: ["llm"],
transport: {
baseUrl: "https://api.orbit-provider.com/anthropic/v1/messages",
format: "claude",
},
});
});
it("builds the Claude transport with default x-api-key authentication", () => {
expect(PROVIDERS["orbit-provider"]).toMatchObject({
baseUrl: "https://api.orbit-provider.com/anthropic/v1/messages",
format: "claude",
headers: {
"anthropic-version": "2023-06-01",
},
});
const executor = getExecutor("orbit-provider");
expect(executor.buildUrl("claude-opus-4-8", true)).toBe(
"https://api.orbit-provider.com/anthropic/v1/messages",
);
expect(executor.buildHeaders({ apiKey: "orbit-test-key" })).toMatchObject({
"Content-Type": "application/json",
"anthropic-version": "2023-06-01",
"x-api-key": "orbit-test-key",
});
});
it("exposes the configured Opus models and thinking controls", () => {
expect((PROVIDER_MODELS.orbit || []).map((model) => model.id)).toEqual([
"claude-opus-4-8",
"claude-opus-4-7",
"claude-opus-4-6",
"claude-opus-4-6-thinking",
]);
expect(orbit.thinkingConfig).toEqual({
options: ["auto", "on", "off"],
defaultMode: "auto",
});
});
it("validates its API key against the configured Claude endpoint", async () => {
const fetchMock = vi.fn().mockResolvedValue({ status: 400 });
await expect(
validateConfiguredClaudeApiKey("orbit-provider", "orbit-test-key", fetchMock),
).resolves.toEqual({ valid: true, error: null });
expect(fetchMock).toHaveBeenCalledWith(
"https://api.orbit-provider.com/anthropic/v1/messages",
expect.objectContaining({
method: "POST",
headers: expect.objectContaining({
"x-api-key": "orbit-test-key",
"anthropic-version": "2023-06-01",
}),
}),
);
expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toMatchObject({
model: "claude-opus-4-8",
max_tokens: 1,
});
});
it.each([401, 403])("rejects authentication status %i", async (status) => {
const fetchMock = vi.fn().mockResolvedValue({ status });
await expect(
validateConfiguredClaudeApiKey("orbit-provider", "bad-key", fetchMock),
).resolves.toEqual({ valid: false, error: "Invalid API key" });
});
});