Files
Nexus/plan.md
T
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

104 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.