Files
lemonspace_app/tests/convex/agent-orchestration-contract.test.ts

106 lines
3.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { __testables } from "@/convex/agents";
describe("agent orchestration contract helpers", () => {
it("builds skeleton output data with rich execution-plan metadata", () => {
const data = __testables.buildSkeletonOutputData({
step: {
id: "step-linkedin",
title: "LinkedIn Launch",
channel: "linkedin",
outputType: "post",
artifactType: "social-post",
goal: "Ship launch copy",
requiredSections: ["hook", "body", "cta"],
qualityChecks: ["channel-fit", "clear-cta"],
},
stepIndex: 1,
stepTotal: 3,
definitionVersion: 4,
});
expect(data).toMatchObject({
isSkeleton: true,
stepId: "step-linkedin",
stepIndex: 1,
stepTotal: 3,
title: "LinkedIn Launch",
channel: "linkedin",
outputType: "post",
artifactType: "social-post",
requiredSections: ["hook", "body", "cta"],
qualityChecks: ["channel-fit", "clear-cta"],
definitionVersion: 4,
});
expect(data.previewText).toBe("Draft pending for LinkedIn Launch.");
});
it("builds completed output data and derives deterministic legacy body fallback", () => {
const data = __testables.buildCompletedOutputData({
step: {
id: "step-linkedin",
title: "LinkedIn Launch",
channel: "linkedin",
outputType: "post",
artifactType: "social-post",
goal: "Ship launch copy",
requiredSections: ["hook", "body", "cta"],
qualityChecks: ["channel-fit", "clear-cta"],
},
stepIndex: 0,
stepTotal: 1,
output: {
title: "LinkedIn Launch",
channel: "linkedin",
artifactType: "social-post",
previewText: "",
sections: [
{ id: "hook", label: "Hook", content: "Lead with proof." },
{ id: "cta", label: "CTA", content: "Invite comments." },
],
metadata: { audience: "SaaS founders" },
qualityChecks: [],
body: "",
},
});
expect(data.isSkeleton).toBe(false);
expect(data.body).toBe("Hook:\nLead with proof.\n\nCTA:\nInvite comments.");
expect(data.previewText).toBe("Lead with proof.");
expect(data.qualityChecks).toEqual(["channel-fit", "clear-cta"]);
});
it("requires rich execution-step fields in analyze schema", () => {
const required = __testables.getAnalyzeExecutionStepRequiredFields();
expect(required).toEqual(
expect.arrayContaining([
"id",
"title",
"channel",
"outputType",
"artifactType",
"goal",
"requiredSections",
"qualityChecks",
]),
);
});
it("resolves persisted summaries consistently across analyze and execute", () => {
const promptSummary = __testables.resolveExecutionPlanSummary({
executionPlanSummary: "",
analysisSummary: "Audience and channels clarified.",
});
expect(promptSummary).toBe("Audience and channels clarified.");
const finalSummary = __testables.resolveFinalExecutionSummary({
executionSummary: "",
modelSummary: "Delivered 3 channel drafts.",
executionPlanSummary: "Plan for 3 outputs.",
analysisSummary: "Audience and channels clarified.",
});
expect(finalSummary).toBe("Delivered 3 channel drafts.");
});
});