83 lines
4.0 KiB
TypeScript
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",
|
|
]);
|
|
});
|
|
});
|