Files
Nexus/plan.md
Hartmut 4a5edeef3e
CI / Unit Tests (pull_request) Successful in 5m46s
CI / Lint (pull_request) Failing after 3m49s
CI / E2E Tests (pull_request) Has been skipped
CI / Fresh-Linux Docker Deploy (pull_request) Has been skipped
CI / Assistant Split Regression (pull_request) Failing after 35s
CI / Architecture Guardrails (pull_request) Failing after 2m14s
CI / Typecheck (pull_request) Successful in 4m22s
CI / Build (pull_request) Has been skipped
CI / Release Images (pull_request) Has been skipped
rename(phase 1): CapaKraken → Nexus across code, UI, docs, CI
- @capakraken/* → @nexus/* across 12 packages (root + 11 workspaces),
  1551 import lines migrated via codemod
- User-visible brand strings renamed (emails, page titles, PWA
  manifest, mobile header, MFA backup-codes header, tooltips, signin
  page, invite page, weekly digest, install prompt)
- TOTP issuer "CapaKraken" → "Nexus" (existing secrets still valid;
  re-enrollment relabels them in users' authenticator apps)
- Function rename: assertCapaKrakenDbTarget → assertNexusDbTarget
- LocalStorage migration shim in apps/web/src/app/layout.tsx copies
  capakraken_* → nexus_* on first load (guarded by nexus_migrated_v1
  sentinel; runs once per browser, then never again)
- Service-worker cache name capakraken-v2 → nexus-v2 with one-time
  caches.delete('capakraken-v2') from the same shim
- Email-domain fixtures @capakraken.{dev,app} → @nexus.{dev,app} in
  seed data, e2e specs, SMTP default fallback
- Dockerfile.dev / Dockerfile.prod / all .github/workflows/*.yml
  pnpm --filter @capakraken/* → @nexus/*
- README, CLAUDE.md, LEARNINGS.md, all docs/*.md, .env.example,
  tooling/deploy/.env.production.example brand sweep

Phase 1 deliberately leaves untouched (handled in Phase 3 cutover):
- PostgreSQL DB name "capakraken" and POSTGRES_USER "capakraken"
- Volume names capakraken_pgdata etc.
- Compose project name "capakraken" / "capakraken-prod"
- db-target-guard default expectedDatabase
- env-var CAPAKRAKEN_EXPECTED_DB_NAME
- Container DNS names in docker-compose.ci.yml

Quality gates green: pnpm typecheck (7/7), pnpm test:unit (7/7),
pnpm lint (0 errors), check:exports/imports/architecture all pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 15:10:44 +02:00

5.5 KiB
Raw Permalink Blame History

Plan: Navigation Route Smoke Test (Ticket #50)

Stand: 2026-04-03

Anforderungsanalyse

Untersuchungsergebnis: Die in #50 gemeldeten 404s sind kein echter Code-Defekt.

  • analytics/skills → HTTP 200 (in Docker-Logs bestätigt)
  • reports/chargeability → HTTP 200 (in Docker-Logs bestätigt)
  • analytics/insights → Seite existiert, wurde schlicht noch nicht kompiliert (Next.js dev kompiliert Routen on-demand beim ersten Besuch)
  • Alle 35 Nav-Hrefs wurden gegen existierende page.tsx-Dateien geprüft: keine toten Links

Was gebaut wird: Ein Playwright-Smoke-Test, der bei jedem Lauf alle sichtbaren Sidebar-Destinations (navSections + adminNavEntries) für einen eingeloggten Admin-User überprüft. Verhindert, dass künftige Regressions (nav-Link zu nicht-existierender Route) erst von Usern entdeckt werden.

Betroffenes Paket: apps/web (nur Testinfrastruktur, kein Produktionscode)


Betroffene Pakete & Dateien

Paket Dateien Art der Änderung
apps/web e2e/dev-system/nav-smoke.spec.ts create
apps/web e2e/navigation.spec.ts edit — 9 bisher ungetestete Routen hinzufügen

Task-Liste

  • Task 1: e2e/dev-system/nav-smoke.spec.ts erstellen

    Neues Spec in der dev-system-Suite (läuft gegen Live-Dev-Server auf Port 3100). Nutzt gespeicherten Auth-State (storageState: .auth/admin.json) — kein manueller Login nötig, vermeidet Rate-Limiter. Admin-User hat Zugriff auf alle Routen.

    Alle Hrefs als eigenständige Konstante definieren — NICHT AppShell importieren (würde Next.js-Infrastruktur in die Test-Runtime einziehen).

    Pro Route: page.goto(href, { waitUntil: "commit" }) + zwei Assertions:

    1. response.status() !== 404
    2. "This page could not be found" ist nicht sichtbar (max 15 s warten)

    Timeout für die Seite auf 60_000 ms setzen wegen JIT-Compile-Verzögerung bei noch nicht kompilierten Routen (z.B. analytics/insights beim ersten Besuch).

    Hrefs (Stand AppShell.tsx 2026-04-03):

    • Planning: /dashboard, /timeline, /allocations, /staffing, /notifications
    • Estimating: /estimates, /admin/rate-cards, /admin/effort-rules, /admin/experience-multipliers
    • Resources: /resources, /projects, /roles
    • Analytics: /analytics/skills, /reports/chargeability, /reports/builder, /analytics/computation-graph, /analytics/insights
    • Time Off: /vacations/my, /vacations
    • Account: /account/security
    • Admin: /admin/blueprints, /admin/clients, /admin/countries, /admin/org-units, /admin/utilization-categories, /admin/management-levels, /admin/imports, /admin/calculation-rules, /admin/vacations, /admin/users, /admin/system-roles, /admin/settings, /admin/notifications, /admin/webhooks, /admin/activity-log

    → Datei: apps/web/e2e/dev-system/nav-smoke.spec.ts

  • Task 2: e2e/navigation.spec.ts erweitern

    Die bestehende navigation.spec.ts im Standard-Test-Suite prüft nur 5 Routen via Sidebar-Click. Einen separaten Test-Block "all nav routes resolve (no 404)" hinzufügen, der die restlichen regulären Routen (ohne Admin-Routen, da Role-Gate im isolierten Test-Server-Seed unbekannt) per page.goto prüft.

    Neue Routen zusätzlich zum bestehenden 5er-Set: /estimates, /roles, /analytics/skills, /reports/chargeability, /reports/builder, /analytics/computation-graph, /analytics/insights, /vacations/my, /vacations, /account/security

    Der bestehende Click-Test bleibt unverändert.

    → Datei: apps/web/e2e/navigation.spec.ts


Abhängigkeiten

  • Task 1 und Task 2 sind vollständig unabhängig — können parallel implementiert werden.
  • Task 1 setzt gespeicherte Auth-State-Dateien voraus (e2e/dev-system/.auth/admin.json). Diese existieren bereits (von vorherigen Runs). Falls nicht: playwright test --config playwright.dev.config.ts ohne Spec-Filter — global-setup läuft zuerst.

Akzeptanzkriterien

  • pnpm --filter @nexus/web exec playwright test --config playwright.dev.config.ts e2e/dev-system/nav-smoke.spec.ts → alle 35 Tests grün gegen Live-Dev-Server auf Port 3100
  • pnpm --filter @nexus/web exec playwright test e2e/navigation.spec.ts → grün im Standard-Test-Suite
  • pnpm test:unit → unverändert grün (kein Produktionscode geändert)
  • pnpm --filter @nexus/web exec tsc --noEmit → keine neuen Errors
  • Gitea #50 mit Analyseergebnis kommentieren und schließen

Risiken & offene Fragen

  1. Slow first-compile: analytics/insights wurde im Dev-Server noch nie kompiliert. Der erste Goto kann 1015 s dauern (JIT + Batch-Query). Test-Timeout auf 60_000 ms setzen.

  2. /vacations/my für Admin ohne Resource: Admin-User admin@planarchy.dev hat möglicherweise kein verlinktes Resource-Record. Die Seite rendert dann ein Amber-Warning-Banner — kein 404. Smoke-Test besteht trotzdem, da nur HTTP-Status und "page not found"-Text geprüft werden.

  3. Role-Gates in Standard-Suite (Task 2): Der Test-Server-Seed-User admin@nexus.dev muss systemRole ADMIN haben damit Role-gated Routen erreichbar sind. Prüfen via test-server.mjs bevor Implementierung.

  4. Credentials nicht mischen: navigation.spec.ts (Standard-Suite) → admin@nexus.dev. nav-smoke.spec.ts (dev-system) → admin@planarchy.dev via storageState. Nie kreuzen.