From c910ddac384c48e979e1aa0cbcbc3ab66aa59573 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 21 Apr 2026 02:40:01 +0100 Subject: [PATCH] test: add Kimi and Qianfan extension coverage --- extensions/kimi-coding/onboard.test.ts | 33 ++++++++ extensions/kimi-coding/replay-policy.test.ts | 10 +++ extensions/qianfan/index.test.ts | 89 ++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 extensions/kimi-coding/onboard.test.ts create mode 100644 extensions/kimi-coding/replay-policy.test.ts create mode 100644 extensions/qianfan/index.test.ts diff --git a/extensions/kimi-coding/onboard.test.ts b/extensions/kimi-coding/onboard.test.ts new file mode 100644 index 00000000000..3da27d2808f --- /dev/null +++ b/extensions/kimi-coding/onboard.test.ts @@ -0,0 +1,33 @@ +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; +import { + applyKimiCodeConfig, + applyKimiCodeProviderConfig, + KIMI_CODING_MODEL_REF, + KIMI_MODEL_REF, +} from "./onboard.js"; + +describe("kimi coding onboard", () => { + it("keeps the historical Kimi model ref alias pointed at the coding default", () => { + expect(KIMI_MODEL_REF).toBe("kimi/kimi-code"); + expect(KIMI_CODING_MODEL_REF).toBe(KIMI_MODEL_REF); + }); + + it("adds the Kimi coding provider defaults", () => { + const cfg = applyKimiCodeProviderConfig({}); + const provider = cfg.models?.providers?.kimi; + + expect(provider).toMatchObject({ + api: "anthropic-messages", + baseUrl: "https://api.kimi.com/coding/", + }); + expect(provider?.models?.map((model) => model.id)).toEqual(["kimi-code"]); + expect(cfg.agents?.defaults?.models?.[KIMI_MODEL_REF]?.alias).toBe("Kimi"); + }); + + it("sets the agent primary model when applying the full Kimi coding preset", () => { + const cfg = applyKimiCodeConfig({}); + + expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe(KIMI_MODEL_REF); + }); +}); diff --git a/extensions/kimi-coding/replay-policy.test.ts b/extensions/kimi-coding/replay-policy.test.ts new file mode 100644 index 00000000000..3b86ad18d83 --- /dev/null +++ b/extensions/kimi-coding/replay-policy.test.ts @@ -0,0 +1,10 @@ +import { describe, expect, it } from "vitest"; +import { KIMI_REPLAY_POLICY } from "./replay-policy.js"; + +describe("kimi replay policy", () => { + it("disables signature preservation for replay repair", () => { + expect(KIMI_REPLAY_POLICY).toEqual({ + preserveSignatures: false, + }); + }); +}); diff --git a/extensions/qianfan/index.test.ts b/extensions/qianfan/index.test.ts new file mode 100644 index 00000000000..d56f56f5462 --- /dev/null +++ b/extensions/qianfan/index.test.ts @@ -0,0 +1,89 @@ +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; +import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; +import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; +import qianfanPlugin from "./index.js"; +import { + applyQianfanConfig, + applyQianfanProviderConfig, + QIANFAN_DEFAULT_MODEL_REF, +} from "./onboard.js"; + +describe("qianfan provider plugin", () => { + it("registers Qianfan with api-key auth wizard metadata", async () => { + const provider = await registerSingleProviderPlugin(qianfanPlugin); + const resolved = resolveProviderPluginChoice({ + providers: [provider], + choice: "qianfan-api-key", + }); + + expect(provider.id).toBe("qianfan"); + expect(provider.label).toBe("Qianfan"); + expect(provider.docsPath).toBe("/providers/qianfan"); + expect(provider.envVars).toEqual(["QIANFAN_API_KEY"]); + expect(provider.auth).toHaveLength(1); + expect(resolved).not.toBeNull(); + expect(resolved?.provider.id).toBe("qianfan"); + expect(resolved?.method.id).toBe("api-key"); + }); + + it("builds the static Qianfan model catalog", async () => { + const provider = await registerSingleProviderPlugin(qianfanPlugin); + const catalogProvider = await runSingleProviderCatalog(provider); + + expect(catalogProvider.api).toBe("openai-completions"); + expect(catalogProvider.baseUrl).toBe("https://qianfan.baidubce.com/v2"); + expect(catalogProvider.models?.map((model) => model.id)).toEqual([ + "deepseek-v3.2", + "ernie-5.0-thinking-preview", + ]); + expect(catalogProvider.models?.find((model) => model.id === "deepseek-v3.2")).toMatchObject({ + name: "DEEPSEEK V3.2", + reasoning: true, + input: ["text"], + contextWindow: 98304, + maxTokens: 32768, + }); + expect( + catalogProvider.models?.find((model) => model.id === "ernie-5.0-thinking-preview"), + ).toMatchObject({ + name: "ERNIE-5.0-Thinking-Preview", + reasoning: true, + input: ["text", "image"], + contextWindow: 119000, + maxTokens: 64000, + }); + }); + + it("adds Qianfan provider defaults without changing primary model in provider-only mode", () => { + const cfg = applyQianfanProviderConfig({ + agents: { + defaults: { + model: { primary: "anthropic/claude-opus-4-6" }, + }, + }, + }); + + expect(cfg.models?.providers?.qianfan).toMatchObject({ + api: "openai-completions", + baseUrl: "https://qianfan.baidubce.com/v2", + }); + expect(cfg.models?.providers?.qianfan?.models?.map((model) => model.id)).toEqual([ + "deepseek-v3.2", + "ernie-5.0-thinking-preview", + ]); + expect(cfg.agents?.defaults?.models?.[QIANFAN_DEFAULT_MODEL_REF]?.alias).toBe("QIANFAN"); + expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe( + "anthropic/claude-opus-4-6", + ); + }); + + it("sets Qianfan as the agent primary model in full onboarding mode", () => { + const cfg = applyQianfanConfig({}); + + expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe( + QIANFAN_DEFAULT_MODEL_REF, + ); + }); +});