From 17bdc76d90325936fdb391dced1c04ff2ebf17c1 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Apr 2026 04:19:54 +0100 Subject: [PATCH] test(providers): share onboard primary assertions --- extensions/minimax/onboard.test.ts | 50 +++++++-------------- extensions/mistral/onboard.test.ts | 55 ++++++++---------------- extensions/zai/onboard.test.ts | 9 ++-- test/helpers/plugins/provider-onboard.ts | 10 +++++ 4 files changed, 48 insertions(+), 76 deletions(-) diff --git a/extensions/minimax/onboard.test.ts b/extensions/minimax/onboard.test.ts index b2cb0e8f224..143c0cc8092 100644 --- a/extensions/minimax/onboard.test.ts +++ b/extensions/minimax/onboard.test.ts @@ -1,13 +1,9 @@ -import { - resolveAgentModelFallbackValues, - resolveAgentModelPrimaryValue, -} from "openclaw/plugin-sdk/provider-onboard"; +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; import { - createConfigWithFallbacks, - createLegacyProviderConfig, - EXPECTED_FALLBACKS, -} from "../../test/helpers/plugins/onboard-config.js"; + expectProviderOnboardMergedLegacyConfig, + expectProviderOnboardPreservesPrimary, +} from "../../test/helpers/plugins/provider-onboard.js"; import { applyMinimaxApiConfig, applyMinimaxApiProviderConfig } from "./onboard.js"; describe("minimax onboard", () => { @@ -48,20 +44,15 @@ describe("minimax onboard", () => { }); it("merges existing minimax provider models", () => { - const cfg = applyMinimaxApiConfig( - createLegacyProviderConfig({ - providerId: "minimax", - api: "openai-completions", - }), - ); - expect(cfg.models?.providers?.minimax?.baseUrl).toBe("https://api.minimax.io/anthropic"); - expect(cfg.models?.providers?.minimax?.api).toBe("anthropic-messages"); - expect(cfg.models?.providers?.minimax?.authHeader).toBe(true); - expect(cfg.models?.providers?.minimax?.apiKey).toBe("old-key"); - expect(cfg.models?.providers?.minimax?.models.map((m) => m.id)).toEqual([ - "old-model", - "MiniMax-M2.7", - ]); + const provider = expectProviderOnboardMergedLegacyConfig({ + applyProviderConfig: applyMinimaxApiConfig, + providerId: "minimax", + providerApi: "anthropic-messages", + baseUrl: "https://api.minimax.io/anthropic", + legacyApi: "openai-completions", + }); + expect(provider?.authHeader).toBe(true); + expect(provider?.models.map((m) => m.id)).toEqual(["old-model", "MiniMax-M2.7"]); }); it("preserves other providers when adding minimax", () => { @@ -99,12 +90,10 @@ describe("minimax onboard", () => { }); it("does not overwrite existing primary model in provider-only mode", () => { - const cfg = applyMinimaxApiProviderConfig({ - agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } }, + expectProviderOnboardPreservesPrimary({ + applyProviderConfig: applyMinimaxApiProviderConfig, + primaryModelRef: "anthropic/claude-opus-4-5", }); - expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe( - "anthropic/claude-opus-4-5", - ); }); it("sets the chosen model as primary in config mode", () => { @@ -113,11 +102,4 @@ describe("minimax onboard", () => { "minimax/MiniMax-M2.7-highspeed", ); }); - - it("preserves existing model fallbacks", () => { - const cfg = applyMinimaxApiConfig(createConfigWithFallbacks()); - expect(resolveAgentModelFallbackValues(cfg.agents?.defaults?.model)).toEqual([ - ...EXPECTED_FALLBACKS, - ]); - }); }); diff --git a/extensions/mistral/onboard.test.ts b/extensions/mistral/onboard.test.ts index 1e48bc4caef..da5d753d396 100644 --- a/extensions/mistral/onboard.test.ts +++ b/extensions/mistral/onboard.test.ts @@ -1,13 +1,8 @@ -import { - resolveAgentModelFallbackValues, - resolveAgentModelPrimaryValue, -} from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; import { - createConfigWithFallbacks, - createLegacyProviderConfig, - EXPECTED_FALLBACKS, -} from "../../test/helpers/plugins/onboard-config.js"; + expectProviderOnboardMergedLegacyConfig, + expectProviderOnboardPrimaryAndFallbacks, +} from "../../test/helpers/plugins/provider-onboard.js"; import { buildMistralModelDefinition as buildBundledMistralModelDefinition } from "./model-definitions.js"; import { applyMistralConfig, @@ -22,31 +17,24 @@ describe("mistral onboard", () => { baseUrl: "https://api.mistral.ai/v1", api: "openai-completions", }); - expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe( - MISTRAL_DEFAULT_MODEL_REF, - ); + expectProviderOnboardPrimaryAndFallbacks({ + applyConfig: applyMistralConfig, + modelRef: MISTRAL_DEFAULT_MODEL_REF, + }); }); it("merges Mistral models and keeps existing provider overrides", () => { - const cfg = applyMistralProviderConfig( - createLegacyProviderConfig({ - providerId: "mistral", - api: "anthropic-messages", - modelId: "custom-model", - modelName: "Custom", - }), - ); - - expect(cfg.models?.providers?.mistral?.baseUrl).toBe("https://api.mistral.ai/v1"); - expect(cfg.models?.providers?.mistral?.api).toBe("openai-completions"); - expect(cfg.models?.providers?.mistral?.apiKey).toBe("old-key"); - expect(cfg.models?.providers?.mistral?.models.map((m) => m.id)).toEqual([ - "custom-model", - "mistral-large-latest", - ]); - const mistralDefault = cfg.models?.providers?.mistral?.models.find( - (model) => model.id === "mistral-large-latest", - ); + const provider = expectProviderOnboardMergedLegacyConfig({ + applyProviderConfig: applyMistralProviderConfig, + providerId: "mistral", + providerApi: "openai-completions", + baseUrl: "https://api.mistral.ai/v1", + legacyApi: "anthropic-messages", + legacyModelId: "custom-model", + legacyModelName: "Custom", + }); + expect(provider?.models.map((m) => m.id)).toEqual(["custom-model", "mistral-large-latest"]); + const mistralDefault = provider?.models.find((model) => model.id === "mistral-large-latest"); expect(mistralDefault?.contextWindow).toBe(262144); expect(mistralDefault?.maxTokens).toBe(16384); }); @@ -69,11 +57,4 @@ describe("mistral onboard", () => { const cfg = applyMistralProviderConfig({}); expect(cfg.agents?.defaults?.models?.[MISTRAL_DEFAULT_MODEL_REF]?.alias).toBe("Mistral"); }); - - it("preserves existing model fallbacks", () => { - const cfg = applyMistralConfig(createConfigWithFallbacks()); - expect(resolveAgentModelFallbackValues(cfg.agents?.defaults?.model)).toEqual([ - ...EXPECTED_FALLBACKS, - ]); - }); }); diff --git a/extensions/zai/onboard.test.ts b/extensions/zai/onboard.test.ts index 5b40a6ffc60..5318de99b28 100644 --- a/extensions/zai/onboard.test.ts +++ b/extensions/zai/onboard.test.ts @@ -1,5 +1,6 @@ import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; +import { expectProviderOnboardPreservesPrimary } from "../../test/helpers/plugins/provider-onboard.js"; import { ZAI_CODING_CN_BASE_URL, ZAI_GLOBAL_BASE_URL } from "./model-definitions.js"; import { applyZaiConfig, applyZaiProviderConfig } from "./onboard.js"; @@ -27,11 +28,9 @@ describe("zai onboard", () => { }); it("does not overwrite existing primary model in provider-only mode", () => { - const cfg = applyZaiProviderConfig({ - agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } }, + expectProviderOnboardPreservesPrimary({ + applyProviderConfig: applyZaiProviderConfig, + primaryModelRef: "anthropic/claude-opus-4-5", }); - expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe( - "anthropic/claude-opus-4-5", - ); }); }); diff --git a/test/helpers/plugins/provider-onboard.ts b/test/helpers/plugins/provider-onboard.ts index 22ce672eb3a..27d3e1beb95 100644 --- a/test/helpers/plugins/provider-onboard.ts +++ b/test/helpers/plugins/provider-onboard.ts @@ -43,6 +43,16 @@ export function expectProviderOnboardPrimaryAndFallbacks(params: { ]); } +export function expectProviderOnboardPreservesPrimary(params: { + applyProviderConfig: (config: OpenClawConfig) => OpenClawConfig; + primaryModelRef: string; +}) { + const cfg = params.applyProviderConfig({ + agents: { defaults: { model: { primary: params.primaryModelRef } } }, + }); + expect(resolveAgentModelPrimaryValue(cfg.agents?.defaults?.model)).toBe(params.primaryModelRef); +} + export function expectProviderOnboardMergedLegacyConfig(params: { applyProviderConfig: (config: OpenClawConfig) => OpenClawConfig; providerId: string;