You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.7 KiB
130 lines
4.7 KiB
import { test, expect } from "@playwright/test";
|
|
import { E2E_ADMIN, FIXED_CAPTCHA } from "../fixtures/test-users";
|
|
|
|
const MOCK_REPLY = "你好!这是一个测试回复。";
|
|
|
|
async function loginViaUI(page: import("@playwright/test").Page) {
|
|
await page.goto("/auth/login");
|
|
await page.fill("#login-username", E2E_ADMIN.username);
|
|
await page.fill("#login-password", E2E_ADMIN.password);
|
|
await page.fill("#login-captcha", FIXED_CAPTCHA);
|
|
await page.click('button[type="submit"]');
|
|
await page.waitForURL("/", { timeout: 15000 });
|
|
await expect(page.locator(".agent-textarea")).toBeVisible({ timeout: 10000 });
|
|
await page.waitForTimeout(1000);
|
|
const newChatBtn = page.locator(".new-chat-btn").first();
|
|
if (await newChatBtn.isVisible()) {
|
|
await newChatBtn.click();
|
|
await page.waitForTimeout(500);
|
|
}
|
|
}
|
|
|
|
test.describe("Agent 对话", () => {
|
|
test("首页显示欢迎页和示例卡片", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
await expect(page.locator(".agent-welcome")).toBeVisible({ timeout: 10000 });
|
|
await expect(page.locator(".welcome-title")).toContainText("有什么可以帮你的");
|
|
await expect(page.locator(".example-card")).toHaveCount(4);
|
|
});
|
|
|
|
test("输入框和发送按钮存在", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
await expect(page.locator(".agent-textarea")).toBeVisible({ timeout: 10000 });
|
|
await expect(page.locator(".btn-send")).toBeVisible();
|
|
});
|
|
|
|
test("空消息时发送按钮禁用", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
const sendBtn = page.locator(".btn-send");
|
|
await expect(sendBtn).toBeDisabled();
|
|
});
|
|
|
|
test("输入内容后发送按钮启用", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
await page.fill(".agent-textarea", "测试消息");
|
|
await expect(page.locator(".btn-send")).toBeEnabled();
|
|
});
|
|
|
|
test("点击示例卡片直接发送消息", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
const firstExample = page.locator(".example-card").first();
|
|
const exampleText = await firstExample.innerText();
|
|
await firstExample.click();
|
|
|
|
await expect(page.locator(".agent-message.is-user .user-bubble")).toContainText(exampleText, { timeout: 10000 });
|
|
});
|
|
|
|
test("发送消息后显示用户消息和助手回复", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
const testMessage = "你好,这是一条测试消息";
|
|
await page.fill(".agent-textarea", testMessage);
|
|
await page.click(".btn-send");
|
|
|
|
await expect(page.locator(".agent-message.is-user .user-bubble")).toContainText(testMessage, { timeout: 10000 });
|
|
|
|
await expect(page.locator(".agent-message.is-assistant")).toBeVisible({ timeout: 10000 });
|
|
|
|
await expect(
|
|
page.locator(".agent-message.is-assistant .agent-markdown"),
|
|
).toContainText(MOCK_REPLY, { timeout: 30000 });
|
|
});
|
|
|
|
test("发送消息后显示加载动画", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
await page.fill(".agent-textarea", "测试加载状态");
|
|
await page.click(".btn-send");
|
|
|
|
await expect(page.locator(".assistant-loading")).toBeVisible({ timeout: 5000 });
|
|
});
|
|
|
|
test("Enter 键发送消息", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
const testMessage = "通过回车发送";
|
|
await page.fill(".agent-textarea", testMessage);
|
|
await page.press(".agent-textarea", "Enter");
|
|
|
|
await expect(page.locator(".agent-message.is-user .user-bubble")).toContainText(testMessage, { timeout: 10000 });
|
|
});
|
|
|
|
test("流式响应完成后消息内容完整", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
await page.fill(".agent-textarea", "请回复");
|
|
await page.click(".btn-send");
|
|
|
|
await expect(
|
|
page.locator(".agent-message.is-assistant .agent-markdown"),
|
|
).toContainText(MOCK_REPLY, { timeout: 30000 });
|
|
|
|
await expect(page.locator(".btn-stop")).not.toBeVisible({ timeout: 15000 });
|
|
await expect(page.locator(".btn-send")).toBeVisible();
|
|
});
|
|
|
|
test("连续对话保留历史消息", async ({ page }) => {
|
|
await loginViaUI(page);
|
|
|
|
const firstMsg = "第一条消息";
|
|
await page.fill(".agent-textarea", firstMsg);
|
|
await page.click(".btn-send");
|
|
|
|
await expect(page.locator(".agent-message.is-user .user-bubble").first()).toContainText(firstMsg, { timeout: 10000 });
|
|
await expect(
|
|
page.locator(".agent-message.is-assistant .agent-markdown").first(),
|
|
).toContainText(MOCK_REPLY, { timeout: 30000 });
|
|
|
|
const secondMsg = "第二条消息";
|
|
await page.fill(".agent-textarea", secondMsg);
|
|
await page.click(".btn-send");
|
|
|
|
await expect(page.locator(".agent-message.is-user")).toHaveCount(2, { timeout: 10000 });
|
|
await expect(page.locator(".agent-message.is-assistant")).toHaveCount(2, { timeout: 30000 });
|
|
});
|
|
});
|
|
|