chore(frontend): coverage auf 70%+ heben #274

Closed
opened 2026-07-08 21:02:00 +02:00 by niboer · 0 comments
Owner

Beschreibung

Nach Abschluss von #268 liegt die Frontend-Coverage bei 50.68% Statements, 79% in lib/components/. Dieses Issue hebt die restlichen Luecken, sortiert nach absteigendem Aufwand.

Aktueller Ist-Stand (Thresholds: 45/30/33/47):

Metrik Ist Threshold
Statements 50.68% 45%
Branches 35.63% 30%
Functions 38.02% 33%
Lines 52.33% 47%

Ziel nach Abschluss: ~70% Statements.


Phase 1: Page-Komponenten (hoechster Aufwand, groesster Impact)

Alle +page.svelte-Templates haben 0% Coverage (~2000 Zeilen ungetestet). Jeder Page-Test benoetigt:

  • // @vitest-environment jsdom
  • render() aus @testing-library/svelte
  • i18n-Mock ($lib/stores/i18n.svelte.ts)
  • $app/*-Mock via src/test/helpers/app-mocks.ts
  • Ggf. gemockte Navigation
Datei Zeilen Komplexitaet
routes/app/dashboard/+page.svelte 95 Einfaches Dashboard-Layout
routes/app/events/+page.svelte 71 Event-Liste mit DataTable
routes/app/events/new/+page.svelte 16 Sehr einfach
routes/app/templates/+page.svelte 109 Template-Liste mit DataTable
routes/app/templates/new/+page.svelte 16 Sehr einfach
routes/app/templates/[templateId]/+page.svelte 31 Einfach
routes/app/groups/+page.svelte 168 Gruppen-Liste mit Dialogen
routes/app/groups/[groupId]/+page.svelte 247 Gruppen-Detail
routes/app/persons/+page.svelte 227 Personen-Liste
routes/app/persons/[personId]/+page.svelte 176 Self-Service-Seite
routes/app/account/+page.svelte 275 Account-Einstellungen
routes/app/events/[eventId]/+page.svelte 1322 Event-Detail (Tabs, Gästeliste, Zahlung, Formular)
routes/app/deletion-requests/+page.svelte 133 Admin-Deletion-Requests
routes/+page.svelte 28 Landing Page
routes/app/+layout.svelte 36 App-Layout
routes/app/+error.svelte 29 Error-Seite

Vorgehen:

  1. Einfache Pages zuerst (dashboard, events/liste, templates) als Proof of Concept
  2. Mittlere Pages (account, groups, persons)
  3. Komplexe Pages (events/[eventId] mit 1322 Zeilen)

Ziel: ~20% Stmts Gesamtanstieg (vor allem durch routes/-Coverage).


Phase 2: Component-Tests erweitern (mittel)

Komponente Aktuell Ziel Fehlende Testfälle
action-menu.svelte 36.6% Stmts ~70% Submit-Items (mit hidden fields, enhance-Rückgabewert), Submenus (hover, children, close-on-action), Href-Items (window.location.href), Backdrop-Klick-Schliessen
data-table.svelte 59.8% Stmts ~80% Sort-Interaktion (Klick auf sortierbare Spalte, Cycle-Vorwärts/Rücksetzung), onRowClick-Callback, children-Snippet-Rendering, Sort mit null-Werten

Phase 3: Server/Utils-Tests (mittel)

lib/server/auth.ts — 44% -> 100%

  • base64UrlEncode(): replace() mit padding-, +//-Ersetzung
  • generateCodeChallenge(): subtle.digest + encoding
  • generateRandomString(): crypto.getRandomValues + mapping
  • tryRefreshToken(): Catch-Block bei fehlgeschlagenem Keycloak-Refresh
  • createAiaUrl(): PKCE-Parameter, Cookie-Setzung, CodeVerifier-Erzeugung (kann teilweise aus auth-flow.test.ts übernommen werden)

Phase 4: Kleine Lücken (geringster Aufwand, schnell erledigt)

Datei Aktuell Tests Aufwand
lib/utils/form.ts 0% withReload success/failure/navigateTo, Callback-Normalisierung 4 Tests
lib/actions/testid.ts 0% Svelte-use:testid-Action setzt data-testid 1 Test
lib/stores/session.svelte.ts 66% setSessionExpiresAt() / getSessionExpiresAt()-Zykel 1 Test
lib/stores/i18n.svelte.ts 84% console.error-Catch in setLocale, Cookie-Fallback in initLocale 2 Tests

Threshold-Anpassung (nach Abschluss)

Nach erfolgreicher Umsetzung werden die Thresholds erneut angehoben, z. B. auf statements: 65, branches: 50, functions: 55, lines: 65.

## Beschreibung Nach Abschluss von #268 liegt die Frontend-Coverage bei 50.68% Statements, 79% in `lib/components/`. Dieses Issue hebt die restlichen Luecken, sortiert nach absteigendem Aufwand. Aktueller Ist-Stand (Thresholds: 45/30/33/47): | Metrik | Ist | Threshold | |---|---|---| | Statements | 50.68% | 45% | | Branches | 35.63% | 30% | | Functions | 38.02% | 33% | | Lines | 52.33% | 47% | Ziel nach Abschluss: ~70% Statements. --- ## Phase 1: Page-Komponenten (hoechster Aufwand, groesster Impact) Alle `+page.svelte`-Templates haben 0% Coverage (~2000 Zeilen ungetestet). Jeder Page-Test benoetigt: - `// @vitest-environment jsdom` - `render()` aus `@testing-library/svelte` - i18n-Mock (`$lib/stores/i18n.svelte.ts`) - `$app/*`-Mock via `src/test/helpers/app-mocks.ts` - Ggf. gemockte Navigation | Datei | Zeilen | Komplexitaet | |---|---|---| | `routes/app/dashboard/+page.svelte` | 95 | Einfaches Dashboard-Layout | | `routes/app/events/+page.svelte` | 71 | Event-Liste mit DataTable | | `routes/app/events/new/+page.svelte` | 16 | Sehr einfach | | `routes/app/templates/+page.svelte` | 109 | Template-Liste mit DataTable | | `routes/app/templates/new/+page.svelte` | 16 | Sehr einfach | | `routes/app/templates/[templateId]/+page.svelte` | 31 | Einfach | | `routes/app/groups/+page.svelte` | 168 | Gruppen-Liste mit Dialogen | | `routes/app/groups/[groupId]/+page.svelte` | 247 | Gruppen-Detail | | `routes/app/persons/+page.svelte` | 227 | Personen-Liste | | `routes/app/persons/[personId]/+page.svelte` | 176 | Self-Service-Seite | | `routes/app/account/+page.svelte` | 275 | Account-Einstellungen | | `routes/app/events/[eventId]/+page.svelte` | 1322 | Event-Detail (Tabs, Gästeliste, Zahlung, Formular) | | `routes/app/deletion-requests/+page.svelte` | 133 | Admin-Deletion-Requests | | `routes/+page.svelte` | 28 | Landing Page | | `routes/app/+layout.svelte` | 36 | App-Layout | | `routes/app/+error.svelte` | 29 | Error-Seite | Vorgehen: 1. Einfache Pages zuerst (dashboard, events/liste, templates) als Proof of Concept 2. Mittlere Pages (account, groups, persons) 3. Komplexe Pages (events/[eventId] mit 1322 Zeilen) Ziel: ~20% Stmts Gesamtanstieg (vor allem durch routes/-Coverage). --- ## Phase 2: Component-Tests erweitern (mittel) | Komponente | Aktuell | Ziel | Fehlende Testfälle | |---|---|---|---| | `action-menu.svelte` | 36.6% Stmts | ~70% | Submit-Items (mit hidden fields, `enhance`-Rückgabewert), Submenus (hover, children, close-on-action), Href-Items (`window.location.href`), Backdrop-Klick-Schliessen | | `data-table.svelte` | 59.8% Stmts | ~80% | Sort-Interaktion (Klick auf sortierbare Spalte, Cycle-Vorwärts/Rücksetzung), `onRowClick`-Callback, `children`-Snippet-Rendering, Sort mit `null`-Werten | --- ## Phase 3: Server/Utils-Tests (mittel) ### `lib/server/auth.ts` — 44% -> 100% - **`base64UrlEncode()`**: `replace()` mit padding-, `+`/`/`-Ersetzung - **`generateCodeChallenge()`**: `subtle.digest` + encoding - **`generateRandomString()`**: `crypto.getRandomValues` + mapping - **`tryRefreshToken()`**: Catch-Block bei fehlgeschlagenem Keycloak-Refresh - **`createAiaUrl()`**: PKCE-Parameter, Cookie-Setzung, CodeVerifier-Erzeugung (kann teilweise aus `auth-flow.test.ts` übernommen werden) --- ## Phase 4: Kleine Lücken (geringster Aufwand, schnell erledigt) | Datei | Aktuell | Tests | Aufwand | |---|---|---|---| | `lib/utils/form.ts` | 0% | `withReload` success/failure/navigateTo, Callback-Normalisierung | 4 Tests | | `lib/actions/testid.ts` | 0% | Svelte-`use:testid`-Action setzt `data-testid` | 1 Test | | `lib/stores/session.svelte.ts` | 66% | `setSessionExpiresAt()` / `getSessionExpiresAt()`-Zykel | 1 Test | | `lib/stores/i18n.svelte.ts` | 84% | `console.error`-Catch in `setLocale`, Cookie-Fallback in `initLocale` | 2 Tests | --- ## Threshold-Anpassung (nach Abschluss) Nach erfolgreicher Umsetzung werden die Thresholds erneut angehoben, z. B. auf `statements: 65, branches: 50, functions: 55, lines: 65`.
niboer self-assigned this 2026-07-08 21:02:00 +02:00
Sign in to join this conversation.
No description provided.