feat(e2e): E2E-Integrationstests mit Playwright einfuehren #205
Labels
No labels
component/backend
component/docs
component/e2e
component/frontend
component/infra
component/keycloak
prio/high
prio/low
prio/medium
type/bug
type/chore
type/feature
type/refactor
type/test
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
#212 feat(infra): Gitea Actions CI/CD-Pipelines, Container Registry und Branch-Protection
WompSchmiede/FamilienFeierPlaner
Reference
WompSchmiede/FamilienFeierPlaner#205
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
E2E-Integrationstests mit Playwright im Docker-Container, die den vollen Stack (Postgres, Mailhog, Keycloak, Backend, Frontend) testen.
Phasen
Phase 1 — Kernpfade (5 Spec-Dateien, ~19 Tests) ✅
e2e/-Verzeichnis anlegen:Dockerfile,package.json,playwright.config.tsdocker-compose.ymlume2e-runner-Service erweiternscripts/docker-test.mjsum E2E-Schritt + Healthcheck + Log-Sammlung erweitern--fast-Flag zum Ueberspringen von LintDEBUG_URL/DEBUG_COOKIEper-ean Container durchgereichtretain-on-failure,outputDirin./output/auth.ts-Fixture: Keycloak-Login via UI + Session-Cookie.gitea/workflows/e2e.ymlPhase 1.5 — Coverage-Enforcement & Testbarkeit ✅
Route-Test-Coverage:
scripts/check-e2e-coverage.mjs: Scanntfrontend/src/routes/app/und vergleicht gegene2e/.test-coverage.json. Unbekannte Routen → Exit 1.--warn-Flag fuer CI-Warning-Modus.e2e/.test-coverage.json: Mapping aller Routen mit Statuscovered/known_uncovered. Fehlender Eintrag = unbekannte Route → Fail.node scripts/check-e2e-coverage.mjs --warnmitcontinue-on-error: trueAGENTS.md: Neue Route braucht Eintrag in.test-coverage.json+ korrespondierenden E2E-Test.testid-Action & Enforcement:
frontend/src/lib/actions/testid.ts: Svelte-Actionuse:testidfuer zuverlaessiges Auffinden viagetByTestId(). Namensschema:{komponente}-{aktion}(z. B.btn-logout,link-events,form-event-create).use:testidan allen<button>,<a href>,<form>-Elementen im Frontend anbringen. (Phase 2)scripts/check-testid.mjs: Scannt.svelte-Dateien nach interaktiven Elementen ohneuse:testid.--failfuer Pre-Commit,--warnfuer CI.scripts/check-testid.mjs --warnin lint-staged (aktuell Warn-Modus, nach Phase 2 auf--failumstellen).node scripts/check-testid.mjs --warnmitcontinue-on-error: true.Organisatorisch:
.gitea/PULL_REQUEST_TEMPLATE/pull_request.md: Altes/Neues Verhalten, Begruendung, Checkliste (testid + E2E)..gitea/ISSUE_TEMPLATE/): Checklisten-Punkt: "use:testidan allen<button>,<a href>,<form>gesetzt?"AGENTS.md-Regel erweitern: testid-Pflicht + Schema + Verweis aufscripts/check-testid.mjsPhase 2 — Vollausbau (~9 Spec-Dateien, ~80-100 Tests)
use:testidan allen<button>,<a>,<form>-Elementen im Frontend--failumstellen wenn alle Templates testid habenTechnische Details
Ports (Docker-intern):
http://frontend:3000http://mailhog:8025/api/v2/messageshttp://keycloak:8080Wichtige Konfiguration:
playwright.config.ts: baseURL =http://frontend.integration.local:3000, Chromium only, list + html Reporter, outputDir =../output/e2e-resultse2e/Dockerfile: basiert aufmcr.microsoft.com/playwright, WORKDIR /apphelpers/mailhog.ts: API-Client zum Abfragen/Loeschen von E-Mailsfixtures/auth.ts: Keycloak-Login via UI (username/password aus Dev-Seed)scripts/docker-test.mjs: Orchestriert Build, Start, Healthcheck, E2E-Tests, Log-Sammlung, Cleanupe2e/docker-compose.e2e.yml: Override fuer Keycloak-Hostname und Frontend-Origin./output/(Traces, HTML-Report, Container-Logs)Dateien (neu/geaendert)
Erweiterung Phase 2 — Credential-Tests
WebAuthn (Passkeys) und TOTP sind in Keycloak/Backend/Frontend bereits vollstaendig konfiguriert
(siehe
docs/design/05-authentifizierung.mdundkeycloak-provision.ts).E2E-Tests fuer beide koennen direkt umgesetzt werden.
TOTP
e2e/helpers/totp.ts:otplib-Bibliothek, QR-Code-URL aus Keycloak-Account-Console parsen,Secret extrahieren, TOTP-Code generieren
CONFIGURE_TOTP) registrieren, Login mit TOTP-Code verifizierene2e/package.json+otplibPasskey (WebAuthn Passwordless)
page.context().newCDPSession(page)→WebAuthn.enabletype: 'internal') erstellen via CDPwebauthn-register-passwordless) registrieren,Login per Passkey (Conditional UI, kein PW/OTP)
webAuthnPolicyPasswordlessEnablePasskeys: true)