ai-chatbot/tests/routes/agent-main-ai-template-entry.test.ts

83 lines
4.0 KiB
TypeScript

import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { expect, test } from "@playwright/test";
import { appendAgentProjectResultForSave } from "@/lib/agents/agent-project-save-merge";
import { createEmptyAgentGenerationProjectPersistedState } from "@/lib/agents/generation-project-state";
function readSource(path: string) {
return readFileSync(resolve(process.cwd(), path), "utf8");
}
test.describe("agent main-image AI template entry", () => {
test("keeps dynamic result cards painted while the workspace scrolls", () => {
const workspace = readSource("components/agents/AgentGenerationWorkspaceDarkV2.tsx");
const resultSectionStart = workspace.indexOf('id="agent-anchor-results"');
const resultSectionEnd = workspace.indexOf("<AgentAiTemplateDialog", resultSectionStart);
expect(resultSectionStart).toBeGreaterThanOrEqual(0);
expect(resultSectionEnd).toBeGreaterThan(resultSectionStart);
const resultSection = workspace.slice(resultSectionStart, resultSectionEnd);
expect(workspace).toContain('const AGENT_STABLE_RESULTS_STYLE = {\n contentVisibility: "visible"');
expect(workspace).toContain('const AGENT_STABLE_RESULT_CARD_STYLE = {\n contentVisibility: "visible"');
expect(resultSection).toContain("style={AGENT_STABLE_RESULTS_STYLE}");
expect(resultSection).not.toContain("AGENT_DEFERRED_RESULTS_STYLE");
expect(resultSection).not.toContain("AGENT_DEFERRED_LIST_CARD_STYLE");
expect(resultSection.match(/style=\{AGENT_STABLE_RESULT_CARD_STYLE\}/g)?.length || 0).toBeGreaterThanOrEqual(8);
expect(workspace).toContain('data-detail-result-scan-animation');
expect(workspace).toContain('willChange: "opacity, transform"');
});
test("keeps the main result-card action and queued generation flow wired", () => {
const workspace = readSource("components/agents/AgentGenerationWorkspaceDarkV2.tsx");
const dialog = readSource("components/agents/AgentAiTemplateDialog.tsx");
const route = readSource("app/api/canvas/layout-replace/route.ts");
const queue = readSource("lib/canvas/image-task-queue.ts");
expect(workspace).toContain(
'const isSceneResultCard = activeResultModeType === "scene_generation"'
);
expect(workspace).toContain('aria-label="AI套模版"');
expect(workspace).toContain("setAiTemplateDialogSourceUrl(card.url!)");
expect(workspace).toContain("<AgentAiTemplateDialog");
expect(workspace).toContain(
'appendResultUrlToCollection("scene_generation", result.imageUrl'
);
expect(dialog).toContain("imageGenerationService.layoutReplace({");
expect(dialog).toContain("agentProjectId: projectId");
expect(dialog).toContain('referenceLabel: "风格化主图 AI 套模版参考图"');
expect(dialog).toContain('operation: "agent-main-ai-template"');
expect(dialog).toContain("pollAiTemplateTask(taskId)");
expect(dialog).toContain("await onResultCreatedRef.current({");
expect(dialog).toContain("max-h-[calc(100dvh-1rem)]");
expect(route).toContain("createCanvasImageTask({");
expect(route).toContain("await enqueueCanvasImageTask(task.id)");
expect(queue).toContain("persistAgentProjectGeneratedResult({");
expect(queue).toContain('modeType: "scene_generation"');
});
test("appends a completed AI template result without dropping existing project results", () => {
const state = createEmptyAgentGenerationProjectPersistedState();
state.resultCollections = {
scene_generation: ["https://example.com/original.png"],
detail_generation: ["https://example.com/detail.png"],
};
const nextState = appendAgentProjectResultForSave({
existingState: state,
modeType: "scene_generation",
imageUrl: "https://example.com/ai-template.png",
});
expect(nextState.resultCollections?.scene_generation).toEqual([
"https://example.com/original.png",
"https://example.com/ai-template.png",
]);
expect(nextState.resultCollections?.detail_generation).toEqual([
"https://example.com/detail.png",
]);
});
});