Files
paseo/packages/app/e2e/browser/mermaid-streaming.spec.ts
T
Mohamed Boudra 77aff0f4fb fix(app): stabilize Mermaid streaming lifecycle (#4210)
Drive the streaming assertion from the actual turn lifecycle so iframe replacement at completion is not mistaken for diagram loss. Preserve the cached timeline range during reload reconciliation so a projected message spanning the cache cursor replaces its partial prefix instead of being appended to it.
2026-09-02 13:37:32 +02:00

73 lines
2.2 KiB
TypeScript

import { test } from "../support/fixtures";
import {
expectCompletedDiagram,
expectDiagramRemainsRenderedWhileStreaming,
expectDiagramWithLabels,
reloadConversation,
requestDiagram,
waitForDiagramTurnToComplete,
} from "../support/helpers/diagram";
import { openAgentRoute, seedMockAgentWorkspace } from "../support/helpers/mock-agent";
const STREAMED_MERMAID = [
"```mermaid",
"flowchart LR",
" Start --> Middle",
' Middle --> Done["<i>Done</i>"]',
" Middle --> Review",
" Review --> Verify",
" Verify --> Ship",
" Ship --> Package",
" Package --> Sign",
" Sign --> Upload",
" Upload --> Publish",
" Publish --> Deploy",
" Deploy --> Observe",
" Observe --> Validate",
" Validate --> Announce",
" Announce --> Document",
" Document --> Archive",
" Archive --> Release",
"```",
].join("\n");
test("keeps a Mermaid diagram rendered while its message streams, completes, and reloads", async ({
page,
}) => {
test.setTimeout(120_000);
let diagramTurnCompleted!: Promise<void>;
const agent = await seedMockAgentWorkspace({
repoPrefix: "mermaid-streaming-",
title: "Streaming Mermaid",
featureValues: {
mockStreamingAssistantResponse: STREAMED_MERMAID,
mockStreamingAssistantIntervalMs: 150,
},
});
try {
await test.step("Open the conversation and request a diagram", async () => {
await openAgentRoute(page, agent);
await requestDiagram(agent);
diagramTurnCompleted = waitForDiagramTurnToComplete(agent);
});
await test.step("The diagram renders and stays rendered while tokens arrive", async () => {
await expectDiagramWithLabels(page, ["Start", "Middle"]);
await expectDiagramRemainsRenderedWhileStreaming(page, diagramTurnCompleted);
});
await test.step("The completed diagram shows the final streamed content", async () => {
await diagramTurnCompleted;
await expectCompletedDiagram(page, ["Start", "Done", "Release"]);
});
await test.step("The completed diagram remains rendered after reload", async () => {
await reloadConversation(page);
await expectCompletedDiagram(page, ["Start", "Done", "Release"]);
});
} finally {
await agent.cleanup();
}
});