deerflow2/frontend/tests/e2e/welcome-and-routing.spec.ts

94 lines
3.5 KiB
TypeScript

import { expect, test } from "@playwright/test";
import {
THREAD_FOR_WELCOME,
invalidNewChatUrl,
newChatEntry,
openChat,
reuseThreadChatEntry,
reuseThreadWelcomeEntry,
skipIfMissingThread,
waitForMessageListReady,
} from "./support/chat-helpers";
test.describe("聊天工作台 / 路由与欢迎态", () => {
test("DF-ROUTE-001 /new 带 thread_id 时展示欢迎态与建议词", async ({
page,
}, testInfo) => {
skipIfMissingThread(testInfo, THREAD_FOR_WELCOME, "FRONTEND_E2E_THREAD_ID");
await openChat(page, newChatEntry(THREAD_FOR_WELCOME!));
const suggestions = page.getByTestId("welcome-suggestions");
await expect(suggestions).toBeVisible();
await expect(suggestions.locator("button").first()).toBeVisible();
await expect(page.locator(".is-user, .is-assistant")).toHaveCount(0);
});
test("DF-ROUTE-002 /new 复用模式保留欢迎态且不直接渲染历史", async ({
page,
}, testInfo) => {
skipIfMissingThread(testInfo, THREAD_FOR_WELCOME, "FRONTEND_E2E_THREAD_ID");
await openChat(page, reuseThreadWelcomeEntry(THREAD_FOR_WELCOME!));
await expect(page).toHaveURL(
new RegExp(`/workspace/chats/new\\?.*thread_id=${THREAD_FOR_WELCOME!}`),
);
await expect(page.getByTestId("welcome-suggestions")).toBeVisible();
await expect(page.locator(".is-user, .is-assistant")).toHaveCount(0);
});
test("DF-ROUTE-003 /new 缺少 thread_id 时进入欢迎态", async ({ page }) => {
await page.goto(invalidNewChatUrl());
await expect(page.getByTestId("welcome-suggestions")).toBeVisible();
await expect(page.locator("textarea[name='message']")).toBeVisible();
});
test("DF-ROUTE-004 线程页直接展示历史消息与标题栏", async ({
page,
}, testInfo) => {
skipIfMissingThread(testInfo, THREAD_FOR_WELCOME, "FRONTEND_E2E_THREAD_ID");
await openChat(page, reuseThreadChatEntry(THREAD_FOR_WELCOME!));
await waitForMessageListReady(page);
await expect(page).toHaveURL(
new RegExp(`/workspace/chats/${THREAD_FOR_WELCOME!}`),
);
await expect(page.getByRole("log").first()).toBeVisible();
await expect(page.locator("header button").first()).toBeVisible();
await expect(page.getByTestId("welcome-suggestions")).toHaveCount(0);
});
test("DF-ROUTE-005 退出确认取消后保持当前线程页面", async ({
page,
}, testInfo) => {
skipIfMissingThread(testInfo, THREAD_FOR_WELCOME, "FRONTEND_E2E_THREAD_ID");
await openChat(page, reuseThreadChatEntry(THREAD_FOR_WELCOME!));
await waitForMessageListReady(page);
await page.locator("header button").first().click();
await expect(page.getByText("退出后,当前会话结束并销毁")).toBeVisible();
await page.getByRole("button", { name: "取消" }).click();
await expect(page).toHaveURL(
new RegExp(`/workspace/chats/${THREAD_FOR_WELCOME!}`),
);
});
test("DF-ROUTE-006 退出确认确认后返回带 thread_id 的 /new", async ({
page,
}, testInfo) => {
skipIfMissingThread(testInfo, THREAD_FOR_WELCOME, "FRONTEND_E2E_THREAD_ID");
await openChat(page, reuseThreadChatEntry(THREAD_FOR_WELCOME!));
await waitForMessageListReady(page);
await page.locator("header button").first().click();
await page.getByRole("button", { name: "确定" }).click();
await expect(page).toHaveURL(
new RegExp(`/workspace/chats/new\\?.*thread_id=${THREAD_FOR_WELCOME!}`),
);
await expect(page.getByTestId("welcome-suggestions")).toBeVisible();
});
});