Replaces legacy adapter ids (codex_local / claude_local / gemini_local / claude_compatible) across ~42 test files with pi-mono equivalents: - codex_local → openai-codex - claude_local → claude-pro - gemini_local → gemini-cli - claude_compatible → anthropic Hand-rewrites where fixture semantics changed: - connector-matching: TASK_TYPE_PREFERENCE ordering rebased (claude-pro first for code/content/management; google first for research) - connector-model-policy: getModels(provider) from pi-ai instead of the deleted adapter.module.models array - session-management + edge-case-session: adapter exemption removed; rotation now uniform under pi-mono - ipc-core-admin-handlers: CSV compat model replaced with pi-ai anthropic - connectors.spec: lookup by openai-codex id (catalog now starts with claude-pro) - onboarding-model-pool: listProviderModels(provider) helper; label text changed to "ChatGPT Plus/Pro (Codex)" - database integration: added vault insecure-fallback env + electron mock - command-paths: uses new @main/connector-helpers normalizeCommandValue - pi-mono-migrations: added `as string` casts for 3 negative-existence assertions verifying legacy ids were removed Drops: - pnpm-workspace.yaml packages: [] (was "packages/*"; directory empty) - obsolete CONNECTOR_STRENGTHS import; .module.models probing Verification: - pnpm typecheck → 0 errors - pnpm lint → 0 errors / 0 warnings - pnpm build:verify → 0 errors / 0 warnings - pnpm test:unit → 508/508 pass - pnpm test:integration → 96/96 pass - All 6 adapter hard gates pass (NOT FOUND / 0 matches / empty) - pi-ai / pi-agent-core / pi-coding-agent all resolved @0.67.6
95 lines
3.1 KiB
TypeScript
95 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { getConnectorModelPolicy, validateConnectorModelSelection } from "@main/connector-model-policy";
|
|
import { getConnectorDefinition } from "@main/connectors";
|
|
|
|
function createDeps(overrides: {
|
|
connectorModel?: string | null;
|
|
disabledModels?: Array<{ id: string; label: string }>;
|
|
} = {}) {
|
|
return {
|
|
getConnector: () => ({
|
|
id: "anthropic" as const,
|
|
label: "Anthropic",
|
|
model: overrides.connectorModel ?? null,
|
|
}),
|
|
getDisabledModels: () => overrides.disabledModels ?? [],
|
|
};
|
|
}
|
|
|
|
describe("connector model policy", () => {
|
|
it("excludes disabled models from the enabled set", () => {
|
|
const policy = getConnectorModelPolicy(createDeps(), "anthropic");
|
|
const allIds = policy.enabledModels.map((model) => model.id);
|
|
if (allIds.length === 0) {
|
|
throw new Error("anthropic provider should expose at least one model from pi-ai.");
|
|
}
|
|
|
|
const firstModel = allIds[0];
|
|
const filteredPolicy = getConnectorModelPolicy(
|
|
createDeps({ disabledModels: [{ id: firstModel, label: firstModel }] }),
|
|
"anthropic",
|
|
);
|
|
|
|
expect(filteredPolicy.enabledModels.some((model) => model.id === firstModel)).toBe(false);
|
|
});
|
|
|
|
it("accepts an explicit enabled model", () => {
|
|
const policy = getConnectorModelPolicy(createDeps(), "anthropic");
|
|
const enabledId = policy.enabledModels[0]?.id;
|
|
if (!enabledId) {
|
|
throw new Error("anthropic provider should expose at least one model from pi-ai.");
|
|
}
|
|
const result = validateConnectorModelSelection(createDeps(), "anthropic", enabledId);
|
|
|
|
expect(result).toEqual({ ok: true, effectiveModel: enabledId });
|
|
});
|
|
|
|
it("rejects an explicit disabled model", () => {
|
|
const policy = getConnectorModelPolicy(createDeps(), "anthropic");
|
|
const enabledId = policy.enabledModels[0]?.id;
|
|
if (!enabledId) {
|
|
throw new Error("anthropic provider should expose at least one model from pi-ai.");
|
|
}
|
|
const result = validateConnectorModelSelection(
|
|
createDeps({ disabledModels: [{ id: enabledId, label: enabledId }] }),
|
|
"anthropic",
|
|
enabledId,
|
|
);
|
|
|
|
expect(result.ok).toBe(false);
|
|
if (result.ok) {
|
|
throw new Error("Expected explicit disabled model to be rejected.");
|
|
}
|
|
expect(result.error).toContain(`does not allow model "${enabledId}"`);
|
|
});
|
|
});
|
|
|
|
describe("native connector defaults", () => {
|
|
it("falls back to definition defaultModel when connector model is empty", () => {
|
|
const definition = getConnectorDefinition("openai-codex");
|
|
const configuredDefault = definition.defaultModel;
|
|
|
|
const policy = getConnectorModelPolicy({
|
|
getConnector: () => ({
|
|
id: "openai-codex" as const,
|
|
label: "Codex",
|
|
model: null,
|
|
}),
|
|
getDisabledModels: () => [],
|
|
}, "openai-codex");
|
|
|
|
expect(policy.defaultModel).toBe(configuredDefault);
|
|
expect(validateConnectorModelSelection({
|
|
getConnector: () => ({
|
|
id: "openai-codex" as const,
|
|
label: "Codex",
|
|
model: null,
|
|
}),
|
|
getDisabledModels: () => [],
|
|
}, "openai-codex", null)).toEqual({
|
|
ok: true,
|
|
effectiveModel: configuredDefault,
|
|
});
|
|
});
|
|
});
|