mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-13 04:59:51 +08:00
- tests/e2e/lib: openApp(page, { path, config }), MODEL_CONFIGS_KEY,
savedModelConfigs, settingsDialog, chunkedReplies, sse() and
toolCallEvents() replace about 70 copies of goto + wait for iframe,
three local openApp functions, 14 window.fetch overrides and the
Node-side SSE serialisers; unused fixtures removed
- delete theme, save, history, model-config, upload and copy-paste
specs (the copy-button test moves to chat.spec.ts); trim
iframe-interaction, history-restore, keyboard and smoke to tests that
can fail; file-upload asserts on the preview image
- settings-review-fixes.spec.ts split by topic into settings-bedrock,
settings-tabs-sync and settings-providers
- unit tests use vi.stubEnv with unstubEnvs: true instead of
hand-written process.env save and restore loops
105 lines
3.1 KiB
TypeScript
105 lines
3.1 KiB
TypeScript
import { ARCHITECTURE_XML, createBoxXml } from "./fixtures/diagrams"
|
|
import {
|
|
createMixedMock,
|
|
createMultiTurnMock,
|
|
expect,
|
|
openApp,
|
|
sendMessage,
|
|
test,
|
|
waitForComplete,
|
|
waitForText,
|
|
} from "./lib/fixtures"
|
|
import { createTextOnlyResponse } from "./lib/helpers"
|
|
|
|
test.describe("Multi-turn Conversation", () => {
|
|
test("handles multiple diagram requests in sequence", async ({ page }) => {
|
|
await page.route(
|
|
"**/api/chat",
|
|
createMultiTurnMock([
|
|
{
|
|
xml: createBoxXml("box1", "First"),
|
|
text: "Creating diagram 1...",
|
|
},
|
|
{
|
|
xml: createBoxXml("box2", "Second", 200),
|
|
text: "Creating diagram 2...",
|
|
},
|
|
]),
|
|
)
|
|
|
|
await openApp(page)
|
|
|
|
// First request
|
|
await sendMessage(page, "Draw first box")
|
|
await waitForText(page, "Creating diagram 1...")
|
|
|
|
// Second request
|
|
await sendMessage(page, "Draw second box")
|
|
await waitForText(page, "Creating diagram 2...")
|
|
|
|
// Both messages should be visible
|
|
await expect(page.locator('text="Draw first box"')).toBeVisible()
|
|
await expect(page.locator('text="Draw second box"')).toBeVisible()
|
|
})
|
|
|
|
test("preserves conversation history", async ({ page }) => {
|
|
let requestCount = 0
|
|
await page.route("**/api/chat", async (route) => {
|
|
requestCount++
|
|
const request = route.request()
|
|
const body = JSON.parse(request.postData() || "{}")
|
|
|
|
// Verify messages array grows with each request
|
|
if (requestCount === 2) {
|
|
expect(body.messages?.length).toBeGreaterThan(1)
|
|
}
|
|
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "text/event-stream",
|
|
body: createTextOnlyResponse(`Response ${requestCount}`),
|
|
})
|
|
})
|
|
|
|
await openApp(page)
|
|
|
|
// First message
|
|
await sendMessage(page, "Hello")
|
|
await waitForText(page, "Response 1")
|
|
|
|
// Second message (should include history)
|
|
await sendMessage(page, "Follow up question")
|
|
await waitForText(page, "Response 2")
|
|
})
|
|
|
|
test("can continue after a text-only response", async ({ page }) => {
|
|
await page.route(
|
|
"**/api/chat",
|
|
createMixedMock([
|
|
{
|
|
type: "text",
|
|
text: "I understand. Let me explain the architecture first.",
|
|
},
|
|
{
|
|
type: "diagram",
|
|
xml: ARCHITECTURE_XML,
|
|
text: "Here is the diagram:",
|
|
},
|
|
]),
|
|
)
|
|
|
|
await openApp(page)
|
|
|
|
// Ask for explanation first
|
|
await sendMessage(page, "Explain the architecture")
|
|
await waitForText(
|
|
page,
|
|
"I understand. Let me explain the architecture first.",
|
|
)
|
|
|
|
// Then ask for diagram
|
|
await sendMessage(page, "Now show it as a diagram")
|
|
await waitForComplete(page)
|
|
})
|
|
})
|