Files
book-comic-library/frontend/e2e/text-search.spec.ts
2026-09-16 19:27:25 +08:00

67 lines
2.9 KiB
TypeScript

import { expect, test, type APIRequestContext } from "@playwright/test";
import { adminApiRetry, creds, ensureBook, FIXTURE_TXT } from "./helpers/api";
import { scanA11y } from "./helpers/axe";
let admin: APIRequestContext;
let bookId: number;
test.beforeAll(async () => {
admin = await adminApiRetry();
// 文件名避免与 CBZ 样本书同名:fixture 用 e2e-sample-txt.txt(title=e2e-sample-txt)
bookId = await ensureBook(admin, "e2e", "e2e-sample-txt.txt", FIXTURE_TXT);
});
test.afterAll(async () => {
await admin?.dispose();
});
test("登录 → txt 阅读 → 全书搜索 → 跳转", async ({ page }) => {
const { user, pass } = creds();
await page.goto("/login");
await page.fill("#login-user", user);
await page.fill("#login-pass", pass);
await page.getByRole("button", { name: "登录", exact: true }).click();
await expect(page).toHaveURL(/\/$/);
const card = page.locator(".group > button", { hasText: "e2e-sample-txt" });
await expect(card).toBeVisible();
await card.click();
await expect(page).toHaveURL(new RegExp(`/book/${bookId}$`));
// 导航抽屉 → 搜索 tab
await page.getByRole("button", { name: "导航", exact: true }).click();
const nav = page.locator("#reader-nav");
await expect(nav).toBeVisible();
await nav.getByRole("tab", { name: "搜索" }).click();
await nav.getByRole("textbox", { name: "搜索全书" }).fill("zebra-xc42");
// 大小写不敏感:第一章 2 处 + 第二章 1 处 = 3 行
await expect(nav.getByRole("listitem")).toHaveCount(3, { timeout: 10_000 });
expect(await nav.locator("mark").count()).toBe(3); // <mark> 高亮
// 点第二条 → 跳到第一章/第二章(第二条命中)的章,章计数 2/3,抽屉关闭
await nav.getByRole("button").filter({ hasText: "第二章" }).first().click();
await expect(page.getByText("2/3")).toBeVisible({ timeout: 10_000 });
await expect(nav).not.toBeVisible();
await scanA11y(page, "reader-chrome");
// 设置面板冒烟:字号/行距即时生效 + 主题卡联动阅读面(data-rd 受控)
const pre = page.locator(".rd-surface pre");
await expect(pre).toHaveCSS("font-size", "20px");
await page.getByRole("button", { name: "更多阅读设置" }).click();
await page.getByRole("button", { name: "加大字号" }).click();
await expect(pre).toHaveCSS("font-size", "22px");
await page.getByRole("button", { name: "1.8", exact: true }).click();
await expect(pre).toHaveAttribute("style", /line-height: 1\.8/);
await page.getByRole("button", { name: "夜色主题" }).click();
await expect(page.locator(".rd-surface").first()).toHaveAttribute("data-rd", "night");
// 退出
await page.getByRole("link", { name: "书架" }).click();
await expect(page).toHaveURL(/\/$/);
await page.getByRole("button", { name: new RegExp(`账户 ${user}`) }).click();
await page.getByText("退出登录").click();
await expect(page).toHaveURL(/\/login/);
});