openclaw/src/utils/provider-utils.test.ts

97 lines
3.3 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const { resolveProviderReasoningOutputModeWithPluginMock } = vi.hoisted(() => ({
resolveProviderReasoningOutputModeWithPluginMock: vi.fn(),
}));
vi.mock("../plugins/provider-runtime.js", () => ({
resolveProviderReasoningOutputModeWithPlugin: resolveProviderReasoningOutputModeWithPluginMock,
}));
import { isReasoningTagProvider, resolveReasoningOutputMode } from "./provider-utils.js";
describe("resolveReasoningOutputMode", () => {
beforeEach(() => {
resolveProviderReasoningOutputModeWithPluginMock.mockReset();
resolveProviderReasoningOutputModeWithPluginMock.mockReturnValue(undefined);
});
it.each([["google-generative-ai", "tagged"]] as const)(
"falls back to the built-in map for %s",
(provider, expected) => {
expect(resolveReasoningOutputMode({ provider, workspaceDir: process.cwd() })).toBe(expected);
expect(resolveProviderReasoningOutputModeWithPluginMock).toHaveBeenCalledTimes(1);
},
);
it.each([
["google", "tagged"],
["Google", "tagged"],
["google-gemini-cli", "tagged"],
["anthropic", "native"],
["openai", "native"],
["openrouter", "native"],
["ollama", "native"],
["minimax", "native"],
["minimax-cn", "native"],
] as const)("prefers provider hooks for %s", (provider, expected) => {
resolveProviderReasoningOutputModeWithPluginMock.mockReturnValueOnce(expected);
expect(resolveReasoningOutputMode({ provider, workspaceDir: process.cwd() })).toBe(expected);
expect(resolveProviderReasoningOutputModeWithPluginMock).toHaveBeenCalledTimes(1);
});
it("falls back to provider hooks for unknown providers", () => {
resolveProviderReasoningOutputModeWithPluginMock.mockReturnValue("tagged");
expect(
resolveReasoningOutputMode({
provider: "custom-provider",
workspaceDir: process.cwd(),
modelId: "custom/model",
}),
).toBe("tagged");
expect(resolveProviderReasoningOutputModeWithPluginMock).toHaveBeenCalledTimes(1);
});
it("returns native when hooks do not provide an override", () => {
expect(resolveReasoningOutputMode({ provider: "custom-provider" })).toBe("native");
expect(resolveProviderReasoningOutputModeWithPluginMock).toHaveBeenCalledTimes(1);
});
});
describe("isReasoningTagProvider", () => {
beforeEach(() => {
resolveProviderReasoningOutputModeWithPluginMock.mockReset();
resolveProviderReasoningOutputModeWithPluginMock.mockReturnValue(undefined);
});
it.each([
["google-generative-ai", true],
[null, false],
[undefined, false],
["", false],
] as const)("returns %s for %s", (value, expected) => {
expect(isReasoningTagProvider(value, { workspaceDir: process.cwd() })).toBe(expected);
});
it.each([
["google", true],
["Google", true],
["google-gemini-cli", true],
["anthropic", false],
["openai", false],
["openrouter", false],
["ollama", false],
["minimax", false],
["minimax-cn", false],
] as const)("uses provider hooks when available for %s", (value, expected) => {
resolveProviderReasoningOutputModeWithPluginMock.mockReturnValueOnce(
expected ? "tagged" : "native",
);
expect(isReasoningTagProvider(value, { workspaceDir: process.cwd() })).toBe(expected);
expect(resolveProviderReasoningOutputModeWithPluginMock).toHaveBeenCalledTimes(1);
});
});