test: stabilize main ci provider tests

This commit is contained in:
Peter Steinberger
2026-04-26 03:00:52 +01:00
parent 0f343ad568
commit 9123c8158d
4 changed files with 86 additions and 22 deletions

View File

@@ -1,13 +1,32 @@
import { describe, expect, it } from "vitest";
import { beforeEach, describe, expect, it } from "vitest";
import { clearPluginDiscoveryCache } from "../plugins/discovery.js";
import { clearPluginManifestRegistryCache } from "../plugins/manifest-registry.js";
import { shouldExcludeProviderFromDefaultHighSignalLiveSweep } from "./live-model-filter.js";
function hermeticProviderRegistryEnv(): NodeJS.ProcessEnv {
return {
OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY: "1",
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE: "1",
OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE: "1",
VITEST: "1",
} as NodeJS.ProcessEnv;
}
describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
beforeEach(() => {
clearPluginDiscoveryCache();
clearPluginManifestRegistryCache();
});
it("excludes dedicated harness providers from the default high-signal sweep", () => {
const env = hermeticProviderRegistryEnv();
expect(
shouldExcludeProviderFromDefaultHighSignalLiveSweep({
provider: "codex",
useExplicitModels: false,
providerFilter: null,
env,
}),
).toBe(true);
expect(
@@ -15,6 +34,7 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
provider: "openai-codex",
useExplicitModels: false,
providerFilter: null,
env,
}),
).toBe(true);
expect(
@@ -22,16 +42,20 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
provider: "codex-cli",
useExplicitModels: false,
providerFilter: null,
env,
}),
).toBe(true);
});
it("keeps dedicated harness providers when explicitly requested by provider filter", () => {
const env = hermeticProviderRegistryEnv();
expect(
shouldExcludeProviderFromDefaultHighSignalLiveSweep({
provider: "codex",
useExplicitModels: false,
providerFilter: new Set(["codex"]),
env,
}),
).toBe(false);
expect(
@@ -39,6 +63,7 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
provider: "openai-codex",
useExplicitModels: false,
providerFilter: new Set(["codex-cli"]),
env,
}),
).toBe(false);
expect(
@@ -46,6 +71,7 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
provider: "openai-codex",
useExplicitModels: false,
providerFilter: new Set(["openai"]),
env,
}),
).toBe(false);
});
@@ -66,6 +92,7 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => {
provider: "openai",
useExplicitModels: false,
providerFilter: null,
env: hermeticProviderRegistryEnv(),
}),
).toBe(false);
});

View File

@@ -1,15 +1,31 @@
import { describe, expect, it } from "vitest";
import { beforeEach, describe, expect, it } from "vitest";
import { clearPluginDiscoveryCache } from "../plugins/discovery.js";
import { clearPluginManifestRegistryCache } from "../plugins/manifest-registry.js";
import { resolveProviderDiscoveryFilterForTest } from "./models-config.providers.implicit.js";
function liveFilterEnv(overrides: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
return {
OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY: "1",
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE: "1",
OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE: "1",
VITEST: "1",
...overrides,
} as NodeJS.ProcessEnv;
}
describe("resolveProviderDiscoveryFilterForTest", () => {
beforeEach(() => {
clearPluginDiscoveryCache();
clearPluginManifestRegistryCache();
});
it("maps live provider backend ids to owning plugin ids", () => {
expect(
resolveProviderDiscoveryFilterForTest({
env: {
env: liveFilterEnv({
OPENCLAW_LIVE_TEST: "1",
OPENCLAW_LIVE_PROVIDERS: "claude-cli",
VITEST: "1",
} as NodeJS.ProcessEnv,
}),
}),
).toEqual(["anthropic"]);
});
@@ -17,11 +33,10 @@ describe("resolveProviderDiscoveryFilterForTest", () => {
it("honors gateway live provider filters too", () => {
expect(
resolveProviderDiscoveryFilterForTest({
env: {
env: liveFilterEnv({
OPENCLAW_LIVE_TEST: "1",
OPENCLAW_LIVE_GATEWAY_PROVIDERS: "claude-cli",
VITEST: "1",
} as NodeJS.ProcessEnv,
}),
}),
).toEqual(["anthropic"]);
});
@@ -29,11 +44,10 @@ describe("resolveProviderDiscoveryFilterForTest", () => {
it("keeps explicit plugin-id filters when no owning provider plugin exists", () => {
expect(
resolveProviderDiscoveryFilterForTest({
env: {
env: liveFilterEnv({
OPENCLAW_LIVE_TEST: "1",
OPENCLAW_LIVE_PROVIDERS: "openrouter",
VITEST: "1",
} as NodeJS.ProcessEnv,
}),
}),
).toEqual(["openrouter"]);
});

View File

@@ -1,11 +1,27 @@
import { describe, expect, it } from "vitest";
import { beforeEach, describe, expect, it } from "vitest";
import {
withBundledPluginAllowlistCompat,
withBundledPluginEnablementCompat,
} from "../plugins/bundled-compat.js";
import { clearPluginDiscoveryCache } from "../plugins/discovery.js";
import { clearPluginManifestRegistryCache } from "../plugins/manifest-registry.js";
import { resolveEnabledProviderPluginIds } from "../plugins/providers.js";
function providerRegistryEnv(): NodeJS.ProcessEnv {
return {
OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY: "1",
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE: "1",
OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE: "1",
VITEST: "1",
} as NodeJS.ProcessEnv;
}
describe("implicit provider plugin allowlist compatibility", () => {
beforeEach(() => {
clearPluginDiscoveryCache();
clearPluginManifestRegistryCache();
});
it("keeps bundled implicit providers discoverable when plugins.allow is set", () => {
const config = withBundledPluginEnablementCompat({
config: withBundledPluginAllowlistCompat({
@@ -22,7 +38,7 @@ describe("implicit provider plugin allowlist compatibility", () => {
expect(
resolveEnabledProviderPluginIds({
config,
env: { VITEST: "1" } as NodeJS.ProcessEnv,
env: providerRegistryEnv(),
onlyPluginIds: ["kilocode", "moonshot", "openrouter"],
}),
).toEqual(["kilocode", "moonshot", "openrouter"]);
@@ -45,7 +61,7 @@ describe("implicit provider plugin allowlist compatibility", () => {
expect(
resolveEnabledProviderPluginIds({
config,
env: { VITEST: "1" } as NodeJS.ProcessEnv,
env: providerRegistryEnv(),
onlyPluginIds: ["kilocode", "moonshot", "openrouter"],
}),
).toEqual(["moonshot", "openrouter"]);

View File

@@ -14,6 +14,11 @@ const mocks = vi.hoisted(() => ({
resolveReadOnlyChannelPluginsForConfig: vi.fn(),
}));
const READ_ONLY_CHANNEL_DOCTOR_OPTIONS = {
includePersistedAuthState: false,
includeSetupRuntimeFallback: true,
} as const;
vi.mock("../../../channels/plugins/registry.js", () => ({
getLoadedChannelPlugin: (...args: Parameters<typeof mocks.getLoadedChannelPlugin>) =>
mocks.getLoadedChannelPlugin(...args),
@@ -84,9 +89,10 @@ function mockBundledMatrixRuntimePlugin(doctor?: Record<string, unknown>) {
function expectMatrixDoctorLookupCalls(cfg?: unknown) {
if (cfg) {
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(cfg, {
includePersistedAuthState: false,
});
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(
cfg,
READ_ONLY_CHANNEL_DOCTOR_OPTIONS,
);
}
expect(mocks.getLoadedChannelPlugin).toHaveBeenCalledWith("matrix");
expect(mocks.getBundledChannelSetupPlugin).toHaveBeenCalledWith("matrix");
@@ -238,7 +244,7 @@ describe("channel doctor compatibility mutations", () => {
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(cfg, {
env,
includePersistedAuthState: false,
...READ_ONLY_CHANNEL_DOCTOR_OPTIONS,
});
});
@@ -295,9 +301,10 @@ describe("channel doctor compatibility mutations", () => {
});
expect(result).toEqual(["channels.matrix extra"]);
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(cfg, {
includePersistedAuthState: false,
});
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(
cfg,
READ_ONLY_CHANNEL_DOCTOR_OPTIONS,
);
expect(collectEmptyAllowlistExtraWarnings.mock.calls[0]?.[0]).not.toHaveProperty("cfg");
});
@@ -374,7 +381,7 @@ describe("channel doctor compatibility mutations", () => {
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledTimes(1);
expect(mocks.resolveReadOnlyChannelPluginsForConfig).toHaveBeenCalledWith(cfg, {
env,
includePersistedAuthState: false,
...READ_ONLY_CHANNEL_DOCTOR_OPTIONS,
});
expect(collectEmptyAllowlistExtraWarnings).toHaveBeenCalledTimes(3);
expect(shouldSkipDefaultEmptyGroupAllowlistWarning).toHaveBeenCalledTimes(1);