SPB Git
2.3 KB · 23 lines typescript
1import { test, expect } from "@playwright/test";2const EMAIL = process.env.E2E_OWNER_EMAIL ?? ""; const PASSWORD = process.env.E2E_OWNER_PASSWORD ?? "";3test.describe("admin", () => {4  test.skip(!EMAIL || !PASSWORD, "E2E_OWNER_EMAIL / E2E_OWNER_PASSWORD not set");5  test.beforeEach(async ({ page }) => { await page.goto("/login"); await page.getByLabel("E-mail").fill(EMAIL); await page.getByLabel("Password").fill(PASSWORD); await page.getByRole("button", { name: "Sign in", exact: true }).click(); await expect(page).toHaveURL(/\/admin/); });6  test("dashboard, tools list, editor save round-trip, review queue, links, jobs, owner, audit", async ({ page }) => {7    await expect(page.getByRole("heading", { name: "Dashboard" })).toBeVisible();8    await page.goto("/admin/tools?q=duckdb"); await page.getByRole("link", { name: "DuckDB" }).click(); await expect(page.getByRole("heading", { level: 1 })).toHaveText("DuckDB");9    const alias = page.getByLabel(/Aliases/); const before = await alias.inputValue(); await alias.fill(before ? before + "\nE2E Alias" : "E2E Alias");10    await page.getByRole("button", { name: "Save", exact: true }).click(); await expect(page.getByText(/Saved\./)).toBeVisible();11    await page.reload(); await expect(page.getByLabel(/Aliases/)).toHaveValue(/E2E Alias/);12    await page.getByLabel(/Aliases/).fill(before); await page.getByRole("button", { name: "Save", exact: true }).click(); await expect(page.getByText(/Saved\./)).toBeVisible();13    await page.goto("/admin/review"); await expect(page.getByRole("heading", { name: "Review queue" })).toBeVisible();14    await page.goto("/admin/links"); await expect(page.getByRole("heading", { name: "Link integrity" })).toBeVisible();15    await page.goto("/admin/jobs"); await expect(page.getByRole("heading", { name: "Jobs & crawler" })).toBeVisible();16    await page.goto("/admin/owner"); await expect(page.getByRole("heading", { name: /Owner dashboard/ })).toBeVisible();17    await page.goto("/admin/audit"); await expect(page.getByText("tool.update").first()).toBeVisible();18  });19  test("public pages never leak owner notes", async ({ page, request }) => {20    const r = await request.get("/tools/claude-code"); const html = await r.text(); expect(html).not.toMatch(/Primary development agent for every project|owner_notes|deployment_urls|use_state|cluster_compat/i);21  });22});23
Files · laptop-initial-20261102
Menu

Theme