SPB Git forge

spb/polyllm

Public
15commits 1branches 0releases
2.2 MBsize
maindefault branch
13 days agolast push
TypeScript 97.4% SQL 1% JavaScript 0.9% CSS 0.6%
2.0 KB · 43 lines typescript
Raw Blame History
1import { test, expect, type Page } from "@playwright/test";2import fs from "node:fs";3import { restoreSession } from "./helpers";45/**6 * Visual pass: every main screen in light + dark, desktop + mobile widths.7 * Asserts: no console errors, no horizontal overflow. Screenshots → qa/out/.8 * Requires a saved session from full-flow.spec.ts (run it first).9 */10const PAGES = ["/app/chat", "/app/arena", "/app/models", "/app/prompts", "/app/presets", "/app/usage", "/app/settings/account", "/app/settings/security", "/app/settings/providers", "/app/settings/appearance", "/app/settings/data", "/"];11const VIEWPORTS = { desktop: { width: 1360, height: 860 }, mobile: { width: 390, height: 844 } };1213async function setTheme(page: Page, theme: "light" | "dark") {14  await page.addInitScript((t) => {15    window.localStorage.setItem("theme", t);16  }, theme);17}1819for (const theme of ["dark", "light"] as const) {20  for (const [vp, size] of Object.entries(VIEWPORTS)) {21    test(`screens ${theme} ${vp}`, async ({ page }) => {22      test.setTimeout(240_000);23      const errors: string[] = [];24      page.on("console", (m) => {25        if (m.type() === "error" && !/favicon|Download the React DevTools/i.test(m.text())) errors.push(`${m.text()}`);26      });27      page.on("pageerror", (e) => errors.push(e.message));28      await page.setViewportSize(size);29      await setTheme(page, theme);30      await restoreSession(page);31      fs.mkdirSync("qa/out", { recursive: true });32      for (const path of PAGES) {33        await page.goto(path, { waitUntil: "networkidle" }).catch(() => page.goto(path));34        await page.waitForTimeout(400);35        const overflow = await page.evaluate(() => document.documentElement.scrollWidth - document.documentElement.clientWidth);36        expect.soft(overflow, `${path} (${theme}/${vp}) horizontal overflow ${overflow}px`).toBeLessThanOrEqual(1);37        await page.screenshot({ path: `qa/out/${theme}-${vp}-${path.replace(/\//g, "_") || "_home"}.png`, fullPage: vp === "desktop" });38      }39      expect(errors, "console errors").toEqual([]);40    });41  }42}43