Files
PaperClipAI/tests/runner-e2e/chat-catalog-consistency.test.ts
T

37 lines
3.0 KiB
TypeScript

import { expect, it, vi } from "vitest";
import { validateChatCatalogConsistency } from "./chat-catalog-consistency.js";
import { chatCatalogCases } from "./chat-catalog-registry.js";
import { chatCatalogScenarios } from "./chat-catalog-inventory.js";
import { validChatCatalogHumanCounts, chatCatalogHumanHistoryMatches } from "./chat-catalog-contract.js";
it("loads all 242 actual lazy declarations through the admission loaders without executing fixtures", async () => {
expect(chatCatalogCases).toHaveLength(242);
expect([...chatCatalogCases.map(row => row.scenarioId), "tasks.create-backlog", "tasks.delegate-announcement"].sort())
.toEqual(chatCatalogScenarios.map(row => row.id).sort());
expect(await validateChatCatalogConsistency()).toEqual({ descriptorCount: 242, fixtureCallbacksInvoked: 0 });
});
it("rejects actual declaration drift before any fixture callback executes", async () => {
const descriptor = chatCatalogCases.find(row => row.scenarioId === "agents.hire-denied")!;
const callback = vi.fn(() => { throw new Error("Fixture must not execute during preflight"); });
const runtime = { ...descriptor, setup: callback, observe: callback, grade: callback, verifyResult: callback };
const importer = async () => ({ [descriptor.exportName]: [runtime] });
await expect(validateChatCatalogConsistency([descriptor], importer)).resolves.toMatchObject({ descriptorCount: 1 });
await expect(validateChatCatalogConsistency([{ ...descriptor, sourceFiles: [...descriptor.sourceFiles, "unreviewed.ts"] }], importer)).rejects.toThrow("Runtime descriptor drift");
await expect(validateChatCatalogConsistency([{ ...descriptor, expectedRunCount: descriptor.expectedRunCount + 1 }], importer)).rejects.toThrow("Runtime descriptor drift");
expect(callback).not.toHaveBeenCalled();
});
it("preserves the effective one-human limit when optional declaration defaults are used", () => {
const choice = chatCatalogCases.find(row => row.scenarioId === "execution-environments.choose-capable-target")!;
const explicit = { ...choice, expectedHumanMessageCount: 1 };
const effective = (row: typeof choice) => row.expectedHumanMessageCount ?? 1;
expect(effective(choice)).toBe(1); expect(effective(explicit)).toBe(1);
expect(validChatCatalogHumanCounts(choice)).toBe(true); expect(validChatCatalogHumanCounts(explicit)).toBe(true);
expect(validChatCatalogHumanCounts({ ...choice, expectedHumanMessageCount: 0 })).toBe(false);
const history = { human: [{ id: "canonical", body: "Original query" }], runIds: [], boundary: { humanCommentIds: [], runIds: [] }, renderedQuery: "Original query" };
for (const implementation of [choice, explicit]) {
expect(chatCatalogHumanHistoryMatches({ ...history, implementation })).toBe(true);
expect(chatCatalogHumanHistoryMatches({ ...history, implementation, human: [] })).toBe(false);
expect(chatCatalogHumanHistoryMatches({ ...history, implementation, human: [...history.human, { id: "extra", body: "Hidden nudge" }] })).toBe(false);
}
});