mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 17:10:49 +00:00
132 lines
3.9 KiB
TypeScript
132 lines
3.9 KiB
TypeScript
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
|
|
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
|
|
|
|
const { hasAnthropicVertexAvailableAuthMock } = vi.hoisted(() => ({
|
|
hasAnthropicVertexAvailableAuthMock: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("./api.js", async (importOriginal) => {
|
|
const actual = await importOriginal<typeof import("./api.js")>();
|
|
return {
|
|
...actual,
|
|
hasAnthropicVertexAvailableAuth: hasAnthropicVertexAvailableAuthMock,
|
|
};
|
|
});
|
|
|
|
import anthropicVertexPlugin from "./index.js";
|
|
|
|
describe("anthropic-vertex provider plugin", () => {
|
|
beforeEach(() => {
|
|
hasAnthropicVertexAvailableAuthMock.mockReturnValue(true);
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("resolves the ADC marker through the provider hook", async () => {
|
|
const provider = await registerSingleProviderPlugin(anthropicVertexPlugin);
|
|
|
|
expect(
|
|
provider.resolveConfigApiKey?.({
|
|
provider: "anthropic-vertex",
|
|
env: {
|
|
ANTHROPIC_VERTEX_USE_GCP_METADATA: "true",
|
|
} as NodeJS.ProcessEnv,
|
|
} as never),
|
|
).toBe("gcp-vertex-credentials");
|
|
});
|
|
|
|
it("merges the implicit Vertex catalog into explicit provider overrides", async () => {
|
|
const provider = await registerSingleProviderPlugin(anthropicVertexPlugin);
|
|
|
|
const result = await provider.catalog?.run({
|
|
config: {
|
|
models: {
|
|
providers: {
|
|
"anthropic-vertex": {
|
|
baseUrl: "https://europe-west4-aiplatform.googleapis.com",
|
|
headers: { "x-test-header": "1" },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
env: {
|
|
ANTHROPIC_VERTEX_USE_GCP_METADATA: "true",
|
|
GOOGLE_CLOUD_LOCATION: "us-east5",
|
|
} as NodeJS.ProcessEnv,
|
|
resolveProviderApiKey: () => ({ apiKey: undefined }),
|
|
resolveProviderAuth: () => ({
|
|
apiKey: undefined,
|
|
discoveryApiKey: undefined,
|
|
mode: "none",
|
|
source: "none",
|
|
}),
|
|
} as never);
|
|
|
|
expect(result).toEqual({
|
|
provider: {
|
|
api: "anthropic-messages",
|
|
apiKey: "gcp-vertex-credentials",
|
|
baseUrl: "https://europe-west4-aiplatform.googleapis.com",
|
|
headers: { "x-test-header": "1" },
|
|
models: [
|
|
expect.objectContaining({ id: "claude-opus-4-6" }),
|
|
expect.objectContaining({ id: "claude-sonnet-4-6" }),
|
|
],
|
|
},
|
|
});
|
|
});
|
|
|
|
it("owns Anthropic-style replay policy", async () => {
|
|
const provider = await registerSingleProviderPlugin(anthropicVertexPlugin);
|
|
|
|
expect(
|
|
provider.buildReplayPolicy?.({
|
|
provider: "anthropic-vertex",
|
|
modelApi: "anthropic-messages",
|
|
modelId: "claude-sonnet-4-6",
|
|
} as never),
|
|
).toEqual({
|
|
sanitizeMode: "full",
|
|
sanitizeToolCallIds: true,
|
|
toolCallIdMode: "strict",
|
|
preserveNativeAnthropicToolUseIds: true,
|
|
preserveSignatures: true,
|
|
repairToolUseResultPairing: true,
|
|
validateAnthropicTurns: true,
|
|
allowSyntheticToolResults: true,
|
|
});
|
|
});
|
|
|
|
it("resolves synthetic auth when ADC is available", async () => {
|
|
hasAnthropicVertexAvailableAuthMock.mockReturnValue(true);
|
|
const provider = await registerSingleProviderPlugin(anthropicVertexPlugin);
|
|
|
|
const result = provider.resolveSyntheticAuth?.({
|
|
provider: "anthropic-vertex",
|
|
config: undefined,
|
|
providerConfig: undefined,
|
|
} as never);
|
|
|
|
expect(result).toEqual({
|
|
apiKey: "gcp-vertex-credentials",
|
|
source: "gcp-vertex-credentials (ADC)",
|
|
mode: "api-key",
|
|
});
|
|
});
|
|
|
|
it("returns undefined when ADC is not available", async () => {
|
|
hasAnthropicVertexAvailableAuthMock.mockReturnValue(false);
|
|
const provider = await registerSingleProviderPlugin(anthropicVertexPlugin);
|
|
|
|
const result = provider.resolveSyntheticAuth?.({
|
|
provider: "anthropic-vertex",
|
|
config: undefined,
|
|
providerConfig: undefined,
|
|
} as never);
|
|
|
|
expect(result).toBeUndefined();
|
|
});
|
|
});
|