Files
AgentCompany/tests/unit/connector-model-policy.test.ts
T
ZacharyZhang-NY e94939a562 test(connector-id): migrate fixtures and assertions to pi-mono ids
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
2026-04-17 02:36:53 -04:00

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,
});
});
});