import { test, expect } from "@playwright/test"; const core = "http://localhost:17324"; const errors = new WeakMap(); async function control(request, data) { expect((await request.post(core + "/__test/control", { data })).ok()).toBe(true); } test.beforeEach(async ({ page, request }) => { expect((await request.post(core + "/__test/reset")).ok()).toBe(true); errors.set(page, []); page.on("pageerror", error => errors.get(page).push(error.message)); }); test.afterEach(async ({ page }) => { expect(errors.get(page)).toEqual([]); expect(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true); }); test("search failures retain controls and recover after a revised query", async ({ page, request }) => { for (const [status, heading] of [[504, "这次检索耗时较长"], [429, "论文索引正在处理较多请求"], [503, "论文暂时无法读取"], [400, "请调整搜索条件"]]) { await control(request, { paperStatus: status }); await page.goto("/?q=original&topic=cs.LG&searchIn=author"); await expect(page.getByRole("heading", { name: heading, exact: true })).toBeVisible(); await expect(page.getByRole("textbox", { name: "搜索论文", exact: true })).toHaveValue("original"); await expect(page.getByLabel("搜索范围")).toHaveValue("author"); await expect(page.locator('.search-form input[name="topic"]')).toHaveValue("cs.LG"); await expect(page.locator(".index-heading h2 span, .pagination, .sample-note")).toHaveCount(0); await expect(page.getByRole("heading", { name: "没有找到符合条件的论文" })).toHaveCount(0); await expect(page.getByRole("link", { name: "重新尝试", exact: true })).toHaveAttribute("href", /q=original/); } await control(request, { paperStatus: 0 }); await page.setViewportSize({ width: 390, height: 844 }); await page.getByRole("textbox", { name: "搜索论文", exact: true }).fill("revised query"); await page.getByRole("button", { name: "搜索论文", exact: true }).click(); await expect(page).toHaveURL(/q=revised\+query/); await expect(page.locator(".paper-row")).toHaveCount(8); await expect(page.locator(".paper-index [role=alert]")).toHaveCount(0); }); test("malformed research responses do not become empty results or sample mode", async ({ page, request }) => { await control(request, { paperMalformed: true }); await page.goto("/?q=keep-this-query"); await expect(page.getByRole("heading", { name: "论文暂时无法读取", exact: true })).toBeVisible(); await expect(page.getByRole("textbox", { name: "搜索论文", exact: true })).toHaveValue("keep-this-query"); await expect(page.locator(".paper-row, .sample-note, .index-heading h2 span, .pagination")).toHaveCount(0); });