e2e: scope the FrankBook-Pro leg to its own trigger-gated Playwright project

The 11-admin spec walked links that terminate on FrankBook-Pro
(192.168.0.112), which sleeps when idle — every deploy gate timed out
there (measured 2026-10-05, two deploy windows). Split: the frankbook
links move to tests/e2e/specs/19-frankbook.spec.ts under a frankbook
project that run.sh excludes by default and deploy.sh triggers ONLY
when a frankbook blast-radius path changed (the spec, frankbook-pro/,
the homepage registry, the Caddyfile arr vhosts). deploy.sh computes
the trigger from the same BASE..HEAD revision range the plan uses.
This commit is contained in:
Frank committed 2026-10-05 18:04:02 -07:00
1 parent 77decb545e
commit 9c508218e9
6 files changed
+158 -7

No files matched your search

+22 -3
View File
@@ -24,10 +24,28 @@ test("admin panel renders admin-category services", async ({ page }) => {
test("admin open links reach their apps through SSO", async ({ page }) => {
test.setTimeout(240_000);
// Expected link count comes from the live registry (admin showLink=true
// entries, now including the *arr vhosts that use their own auth).
const registry: { name: string; category: string; showLink: boolean }[] =
await (await page.request.get("/services.json")).json();
// entries, now including the *arr vhosts that use their own auth). The
// frankbook-hosted links (probe on 192.168.0.112) are NOT walked here:
// they terminate on FrankBook-Pro, which sleeps when idle, so their walk
// lives in 19-frankbook.spec.ts (frankbook project — excluded from the
// default e2e run and from the deploy gate unless a frankbook trigger
// path changed; see tests/e2e/run.sh and scripts/deploy.sh).
const registry: {
name: string;
category: string;
showLink: boolean;
url: string;
probe: string;
}[] = await (await page.request.get("/services.json")).json();
const expectedAdminLinks = registry.filter((s) => s.category === "admin" && s.showLink).length;
const frankbookUrls = registry
.filter(
(s) =>
s.category === "admin" &&
s.showLink &&
((s.probe ?? "").startsWith("192.168.0.112") || s.url.includes("192.168.0.112")),
)
.map((s) => new URL(s.url).origin);
await page.goto("/admin/");
await expect(page.locator("#grid a.open")).toHaveCount(expectedAdminLinks);
const hrefs = await page.locator("#grid a.open").evaluateAll((els) =>
@@ -35,6 +53,7 @@ test("admin open links reach their apps through SSO", async ({ page }) => {
);
for (const href of hrefs) {
if (frankbookUrls.includes(new URL(href).origin)) continue; // 19-frankbook walks these
const target = new URL(href);
await page.goto(href);
// Every guarded vhost runs its own Anubis proof-of-work on first visit.