Files
Hartmut 1df208dbcc feat(timeline): add pulse animation for in-flight drag mutations
Allocation bars that have active optimistic overrides (post-drag,
awaiting server confirmation) now pulse subtly via animate-pulse.
The pending set is derived from the existing optimisticAllocations
map keys, requiring no additional state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 13:28:46 +02:00

5.4 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 @capakraken/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 @capakraken/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 @capakraken/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@capakraken.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@capakraken.dev. nav-smoke.spec.ts (dev-system) → admin@planarchy.dev via storageState. Nie kreuzen.