diff --git a/config/menu.ts b/config/menu.ts index 09c0351..9f8d5e4 100644 --- a/config/menu.ts +++ b/config/menu.ts @@ -9,7 +9,7 @@ export default defineMenu({ branding: { name: "Plainpages", // app name shown in the sidebar sub: "Console", // optional subtitle under the name - // logo: "/public/logo.svg", // optional logo asset (rendered in the shell — next §2 item) + // logo: "/public/logo.svg", // optional logo asset (rendered in the sidebar brand) // theme: "auto", // default color theme: auto | light | dark }, diff --git a/e2e/full-flow.spec.ts b/e2e/full-flow.spec.ts index 48c5215..7d70488 100644 --- a/e2e/full-flow.spec.ts +++ b/e2e/full-flow.spec.ts @@ -2,9 +2,8 @@ import { type Browser, type Page, expect, test } from "@playwright/test"; import { randomUUID } from "node:crypto"; // Full browser E2E (todo §8): the real Playwright UI against the live stack via the same-origin -// gateway (compose.e2e-full.yml). Covers password + mocked-SSO login, menu filtering by role, the -// users/groups/roles admin CRUD, a permission-gated plugin page, and logout. The earlier full-stack -// suites drove flows over HTTP and deferred the browser-UI login here; this is that coverage. +// gateway (compose.e2e-full.yml) — the browser-UI login the earlier full-stack suites deferred here. +// Coverage is the test titles below, plus the standalone SSO test. // // Runs on a fresh stack (`down -v` after, like the other full-stack suites). The serial admin // journey and the standalone SSO test run in parallel (fullyParallel) but stay independent: each diff --git a/todo.md b/todo.md index ee95bfc..f60c726 100644 --- a/todo.md +++ b/todo.md @@ -121,7 +121,7 @@ everything via Docker. - [x] **Playwright full E2E**: login (password + mocked SSO), menu filtering by role, users/groups/permissions CRUD, a plugin page, logout. → New browser-UI suite `e2e/full-flow.spec.ts` (`compose.e2e-full.yml`) — the real Playwright UI the earlier full-stack suites deferred here ("browser-UI login is owned by §8"). The themed login form posts straight to Kratos' action and cookies are host-scoped, so a tiny **stdlib reverse proxy** (`e2e/proxy.mjs`) fronts web + Kratos on **one origin** (the browser's only host), exactly like a prod reverse proxy; `ory/kratos/e2e-proxy.yml` points Kratos' base_url + every self-service URL at it, and Kratos runs `--dev` so cookies aren't marked Secure over http (Kratos marks them Secure for a non-loopback host like the gateway). Coverage (6 tests, all green): **password login** (themed form → Kratos → `/auth/complete` → dashboard); **mocked SSO** (a stdlib **mock OIDC provider** `e2e/mock-oidc.mjs` — RS256-signed id_token, nonce-bound single-use codes — wired via `SELFSERVICE_METHODS_OIDC_*` env + the committed claims jsonnet; click the provider button → auto-approve → identity created → signed in); **menu filtering by role** (the admin sees the gated Admin section + the plugin nav; anon/SSO-user don't); **users/groups/roles CRUD** (create → list → delete a user via the confirm step; create a group + role, each with a first member since a Keto set needs ≥1); the **permission-gated plugin page** (`/scheduling/shifts` renders the mock upstream's shifts in the native shell); **logout** (sign-out ends the session → back to /login, admin nav gone). **Found + fixed a real bug the E2E surfaced:** the SSO submit button sits in the same `