mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-28 05:16:23 -06:00
improve: speed up focused model directive tests (#123119)
* test(auto-reply): trim directive suite runtime imports * test(auto-reply): type channel policy fixture narrowly --------- Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
committed by
GitHub
parent
c218187244
commit
88a412b0d9
@@ -5,12 +5,13 @@ import path from "node:path";
|
||||
import { expectDefined } from "@openclaw/normalization-core";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import type { ModelCatalogEntry } from "../../agents/model-catalog.js";
|
||||
import type { ChannelPlugin } from "../../channels/plugins/types.plugin.js";
|
||||
import type {
|
||||
ProviderDefaultThinkingPolicyContext,
|
||||
ProviderThinkingProfile,
|
||||
} from "../../plugins/provider-thinking.types.js";
|
||||
import { MODEL_SELECTION_LOCKED_MESSAGE } from "../../sessions/model-overrides.js";
|
||||
|
||||
vi.hoisted(() => {
|
||||
vi.resetModules();
|
||||
});
|
||||
|
||||
const authProfilesStoreMock = vi.hoisted(() => ({
|
||||
profiles: {} as Record<
|
||||
string,
|
||||
@@ -26,6 +27,13 @@ const modelsCommandMock = vi.hoisted(() => ({
|
||||
const stickyModelMock = vi.hoisted(() => ({
|
||||
persistBestEffort: vi.fn(),
|
||||
}));
|
||||
const pluginPolicyMock = vi.hoisted(() => ({
|
||||
channels: new Map<string, Pick<ChannelPlugin, "id" | "commands">>(),
|
||||
thinkingProfiles: new Map<
|
||||
string,
|
||||
(context: ProviderDefaultThinkingPolicyContext) => ProviderThinkingProfile | null | undefined
|
||||
>(),
|
||||
}));
|
||||
|
||||
function defaultModelsCommandReply() {
|
||||
return {
|
||||
@@ -235,6 +243,14 @@ vi.mock("../../agents/provider-auth-aliases.js", () => ({
|
||||
resolveProviderIdForAuth: (provider: string) => provider,
|
||||
}));
|
||||
|
||||
vi.mock("../../agents/cli-backends.js", () => ({
|
||||
isCliRuntimeModelBackendForProvider: () => false,
|
||||
listCliRuntimeModelBackendBindings: () => [],
|
||||
listCliRuntimeProviderIds: () => [],
|
||||
resolveCliRuntimeCanonicalProvider: () => undefined,
|
||||
resolveCliRuntimeModelBackendBinding: () => undefined,
|
||||
}));
|
||||
|
||||
vi.mock("../../agents/harness/selection.js", () => ({
|
||||
selectAgentHarness: () => ({ id: "openclaw" }),
|
||||
resolveAgentHarnessPolicy: ({
|
||||
@@ -280,6 +296,20 @@ vi.mock("../../agents/runtime-plan/auth.js", () => ({
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("../../channels/plugins/index.js", () => ({
|
||||
getChannelPlugin: (id: string) => pluginPolicyMock.channels.get(id),
|
||||
}));
|
||||
|
||||
vi.mock("../../plugins/provider-thinking.js", () => ({
|
||||
resolveEffectiveThinkingProfile: ({
|
||||
provider,
|
||||
context,
|
||||
}: {
|
||||
provider: string;
|
||||
context: ProviderDefaultThinkingPolicyContext;
|
||||
}) => pluginPolicyMock.thinkingProfiles.get(provider)?.(context),
|
||||
}));
|
||||
|
||||
import { resolveAgentDir, resolveSessionAgentId } from "../../agents/agent-scope.js";
|
||||
import {
|
||||
clearRuntimeAuthProfileStoreSnapshots,
|
||||
@@ -295,14 +325,10 @@ import {
|
||||
type InternalHookEvent,
|
||||
} from "../../hooks/internal-hooks.js";
|
||||
import { enqueueSystemEvent } from "../../infra/system-events.js";
|
||||
import { createEmptyPluginRegistry } from "../../plugins/registry-empty.js";
|
||||
import { setActivePluginRegistry } from "../../plugins/runtime.js";
|
||||
import type { ProviderPlugin } from "../../plugins/types.js";
|
||||
import { withEnvAsync } from "../../test-utils/env.js";
|
||||
import type { ElevatedLevel } from "../thinking.js";
|
||||
|
||||
let handleDirectiveOnly: typeof import("./directive-handling.impl.js").handleDirectiveOnly;
|
||||
let cliBackendsTesting: typeof import("../../agents/cli-backends.test-support.js").testing;
|
||||
let maybeHandleModelDirectiveInfo: typeof import("./directive-handling.model.js").maybeHandleModelDirectiveInfo;
|
||||
let createModelVisibilityPolicy: typeof import("../../agents/model-visibility-policy.js").createModelVisibilityPolicy;
|
||||
let buildModelAliasIndex: typeof import("../../agents/model-selection.js").buildModelAliasIndex;
|
||||
@@ -312,7 +338,6 @@ let applyInlineDirectiveOverrides: typeof import("./get-reply-directives-apply.j
|
||||
let createFastTestModelSelectionState: typeof import("./model-selection.js").createFastTestModelSelectionState;
|
||||
|
||||
beforeAll(async () => {
|
||||
({ testing: cliBackendsTesting } = await import("../../agents/cli-backends.test-support.js"));
|
||||
({ handleDirectiveOnly } = await import("./directive-handling.impl.js"));
|
||||
({ maybeHandleModelDirectiveInfo } = await import("./directive-handling.model.js"));
|
||||
({ createModelVisibilityPolicy } = await import("../../agents/model-visibility-policy.js"));
|
||||
@@ -417,14 +442,22 @@ function createSessionEntry(overrides?: Partial<SessionEntry>): SessionEntry {
|
||||
};
|
||||
}
|
||||
|
||||
function setDirectiveTestProviders(providers: ProviderPlugin[]): void {
|
||||
const registry = createEmptyPluginRegistry();
|
||||
registry.providers = providers.map((provider) => ({
|
||||
pluginId: "test",
|
||||
provider,
|
||||
source: "test",
|
||||
}));
|
||||
setActivePluginRegistry(registry);
|
||||
function setDirectiveTestProviders(
|
||||
providers: Array<{
|
||||
id: string;
|
||||
label?: string;
|
||||
auth?: unknown[];
|
||||
resolveThinkingProfile?: (
|
||||
context: ProviderDefaultThinkingPolicyContext,
|
||||
) => ProviderThinkingProfile | null | undefined;
|
||||
}>,
|
||||
): void {
|
||||
pluginPolicyMock.thinkingProfiles.clear();
|
||||
for (const provider of providers) {
|
||||
if (provider.resolveThinkingProfile) {
|
||||
pluginPolicyMock.thinkingProfiles.set(provider.id, provider.resolveThinkingProfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setOpenAiRuntimeScopedUltraProvider(): void {
|
||||
@@ -449,17 +482,8 @@ function setOpenAiRuntimeScopedUltraProvider(): void {
|
||||
|
||||
beforeEach(() => {
|
||||
vi.useRealTimers();
|
||||
cliBackendsTesting.setDepsForTest({
|
||||
resolvePluginSetupRegistry: () => ({
|
||||
providers: [],
|
||||
cliBackends: [],
|
||||
configMigrations: [],
|
||||
autoEnableProbes: [],
|
||||
diagnostics: [],
|
||||
}),
|
||||
resolveRuntimeCliBackends: () => [],
|
||||
});
|
||||
setDirectiveTestProviders([]);
|
||||
pluginPolicyMock.channels.clear();
|
||||
modelsCommandMock.resolveModelsCommandReply
|
||||
.mockReset()
|
||||
.mockResolvedValue(defaultModelsCommandReply());
|
||||
@@ -480,8 +504,8 @@ beforeEach(() => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cliBackendsTesting.resetDepsForTest();
|
||||
setDirectiveTestProviders([]);
|
||||
pluginPolicyMock.channels.clear();
|
||||
clearRuntimeAuthProfileStoreSnapshots();
|
||||
clearInternalHooks();
|
||||
});
|
||||
@@ -877,20 +901,12 @@ describe("/model chat UX", () => {
|
||||
);
|
||||
|
||||
it("includes the thinking level in channel-specific model summaries", async () => {
|
||||
const registry = createEmptyPluginRegistry();
|
||||
registry.channels = [
|
||||
{
|
||||
pluginId: "test",
|
||||
plugin: {
|
||||
id: "telegram",
|
||||
commands: {
|
||||
buildModelBrowseChannelData: () => ({ telegram: { inlineKeyboard: [] } }),
|
||||
},
|
||||
},
|
||||
source: "test",
|
||||
pluginPolicyMock.channels.set("telegram", {
|
||||
id: "telegram",
|
||||
commands: {
|
||||
buildModelBrowseChannelData: () => ({ telegram: { inlineKeyboard: [] } }),
|
||||
},
|
||||
] as never;
|
||||
setActivePluginRegistry(registry);
|
||||
});
|
||||
|
||||
const reply = await resolveModelInfoReply({ surface: "telegram" });
|
||||
|
||||
@@ -2252,6 +2268,24 @@ describe("handleDirectiveOnly model persist behavior (fixes #1435)", () => {
|
||||
});
|
||||
|
||||
it("keeps xhigh when switching to OpenCode Claude Opus 4.7", async () => {
|
||||
setDirectiveTestProviders([
|
||||
{
|
||||
id: "opencode",
|
||||
resolveThinkingProfile: ({ modelId }) => ({
|
||||
levels:
|
||||
modelId === "claude-opus-4-7"
|
||||
? [
|
||||
{ id: "off" },
|
||||
{ id: "minimal" },
|
||||
{ id: "low" },
|
||||
{ id: "medium" },
|
||||
{ id: "high" },
|
||||
{ id: "xhigh" },
|
||||
]
|
||||
: [{ id: "off" }],
|
||||
}),
|
||||
},
|
||||
]);
|
||||
const sessionEntry = createSessionEntry({ thinkingLevel: "xhigh" });
|
||||
|
||||
const result = await runHandleCommand("/model opencode/claude-opus-4-7", {
|
||||
@@ -2654,10 +2688,9 @@ describe("handleDirectiveOnly model persist behavior (fixes #1435)", () => {
|
||||
expect(sessionEntry.thinkingLevel).toBe("medium");
|
||||
});
|
||||
|
||||
it.each([
|
||||
["openai", "gpt-5.5"],
|
||||
["openai", "gpt-5.5"],
|
||||
])("accepts xhigh for %s/%s when catalog marks reasoning support", async (provider, model) => {
|
||||
it("accepts xhigh when the catalog marks reasoning support", async () => {
|
||||
const provider = "openai";
|
||||
const model = "gpt-5.5";
|
||||
setDirectiveTestProviders([
|
||||
{
|
||||
id: provider,
|
||||
|
||||
Reference in New Issue
Block a user