spb/tools-spboucher-ai
Public
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