The service answers on a LAN address with no vhost, so it was in no guarded-vhost list and no spec touched it: every deploy gate passed while its login was dead. The gate signs in as qa-e2e-admin and asserts the two consumer-visible outcomes that the two defect classes break - every .js the SPA loads arrives as JavaScript (a bundle built for the wrong base path comes back text/html and boots nothing), and /api/me answers 200 with type 'admin' (true only while grant types, the OpenID scope mappings and the group claim all hold). Joined to the admin project, so it rides every deploy e2e gate.
70 lines
2.7 KiB
TypeScript
70 lines
2.7 KiB
TypeScript
import { defineConfig } from "@playwright/test";
|
|
import { BASE_URL, REAL_UA } from "./lib/env";
|
|
|
|
export default defineConfig({
|
|
testDir: "./specs",
|
|
timeout: 90_000,
|
|
expect: { timeout: 20_000 },
|
|
retries: 1,
|
|
workers: 2,
|
|
fullyParallel: false,
|
|
reporter: [["list"]],
|
|
outputDir: "./test-results",
|
|
use: {
|
|
baseURL: BASE_URL,
|
|
userAgent: REAL_UA,
|
|
ignoreHTTPSErrors: true,
|
|
viewport: { width: 1440, height: 900 },
|
|
trace: "retain-on-failure",
|
|
},
|
|
projects: [
|
|
{
|
|
name: "setup",
|
|
testMatch: /00-auth\.setup\.ts/,
|
|
},
|
|
{
|
|
name: "standard",
|
|
// NOTE: specs are matched by NUMBER PREFIX, not globbed. A spec file
|
|
// whose prefix is not listed in any project silently never runs — a
|
|
// green suite with a test that does not exist. 17- joined on 2026-09-16
|
|
// (the hermes vhost, whose upstream is a host address rather than a
|
|
// container name, so it needs its own pass condition). 18- joined on
|
|
// 2026-09-24 (OpenWebUI SSO through authentik). 20- joined on 2026-10-21
|
|
// (Grafana's OAuth2 relying-party login, which the edge-only 13- never
|
|
// follows). 21- joined 2026-10-21 (the open-notebook vhost, deployed
|
|
// 2026-10-19 - the newest guarded app, in neither GUARDED list nor any
|
|
// spec until now: the 17-hermes "uncovered vhost broke silently" class).
|
|
// 22- joins Prometheus's app-is-really-there proof (its own API), closing
|
|
// the "not a login wall but maybe a 404" hole 20- closed for Grafana.
|
|
testMatch: /(10|12|13|16|17|18|20|21|22)-.*\.spec\.ts/,
|
|
use: { storageState: ".auth/qa-e2e.json" },
|
|
dependencies: ["setup"],
|
|
},
|
|
{
|
|
name: "admin",
|
|
// 23- joins 2026-11-02 (Audiobookshelf SSO): it needs BOTH halves of the admin
|
|
// fixture — a live authentik session to ride the OIDC round trip, and the
|
|
// qa-e2e-admin group membership that grants site admin in the app.
|
|
testMatch: /(11|23)-.*\.spec\.ts/,
|
|
use: { storageState: ".auth/qa-e2e-admin.json" },
|
|
dependencies: ["setup"],
|
|
},
|
|
{
|
|
name: "guest",
|
|
testMatch: /(14|15)-.*\.spec\.ts/,
|
|
use: { storageState: { cookies: [], origins: [] } },
|
|
},
|
|
{
|
|
name: "frankbook",
|
|
// The *arr/qBittorrent walk (19-). Excluded from default runs and from
|
|
// the deploy e2e gate unless a frankbook trigger path changed — the
|
|
// links terminate on FrankBook-Pro, which sleeps (see tests/e2e/run.sh
|
|
// and scripts/deploy.sh). Matched by number prefix like every project
|
|
// here; joined 2026-10-05.
|
|
testMatch: /19-.*\.spec\.ts/,
|
|
use: { storageState: ".auth/qa-e2e-admin.json" },
|
|
dependencies: ["setup"],
|
|
},
|
|
],
|
|
});
|