79 lines
6.6 KiB
Markdown
79 lines
6.6 KiB
Markdown
# Prüfnachweise
|
||
|
||
Stand: **24. Oktober 2026**. Die folgenden Prüfungen wurden tatsächlich ausgeführt, nicht lediglich vorbereitet.
|
||
|
||
## Ergebnisse
|
||
|
||
| Prüfung | Ergebnis |
|
||
| ---------------------- | ------------------------------------------------------------------ |
|
||
| `npm run typecheck` | Erfolgreich, keine TypeScript-Fehler |
|
||
| `npm test` | **33/33 Tests bestanden**, 3 Testdateien |
|
||
| `npm run build` | Erfolgreicher Next.js-Produktionsbuild, keine Buildwarnungen |
|
||
| `npm run test:e2e` | **17/17 Tests bestanden**, keine Retries oder übersprungenen Tests |
|
||
| `npm audit --omit=dev` | **0 gemeldete Schwachstellen** zum Prüfzeitpunkt |
|
||
| `npm run test:docker` | Erfolgreich, tatsächlicher Linux/ARM64-Compose-Betrieb |
|
||
|
||
### Fachtests
|
||
|
||
- 2 → 8 Portionen; 400 → 800 g als Zutatenanker; Rückskalierung und Kommadezimalwerte.
|
||
- g/kg, ml/l, TL/EL, inkompatible Dimensionen, optionale Zutaten und Zutaten ohne Menge.
|
||
- Ungültige/negative/nichtendliche Eingaben, Division durch null, extreme Faktoren, 100 wiederholte Umskalierungen ohne kumulative Rundung.
|
||
- Bruchdarstellung, reine Anzeigerundung, strukturierte Referenzen in Kochtexten.
|
||
- Einkaufsliste: kompatible Mengen zusammenführen; verschiedene Einheiten/Notizen getrennt halten.
|
||
- Vollständiger JSON- und XML-Roundtrip inklusive optionaler Daten und Escaping.
|
||
- Unbekannte Formatversionen, kaputte Referenzen, doppelte IDs, HTML, Path Traversal, XML-Entities/DOCTYPE und Größenlimits.
|
||
- Timerstart, Pause, Fortsetzung, serialisierte Wiederherstellung, Ablauf im Hintergrund und korrekte Anzeige direkt beim Start.
|
||
|
||
### Browser- und API-Integration
|
||
|
||
Chromium gegen den **Produktionsbuild**, mit echter PostgreSQL-Testdatenbank:
|
||
|
||
- Öffentliche Sammlung ohne Anmeldung, keine unveröffentlichten Rezepte.
|
||
- Live-Zutatensuche und URL-Synchronisierung, Favoriten, Themewechsel und Theme-Persistenz.
|
||
- Portionsänderung, direkter Zutatenanker mit kg/g-Umrechnung, skalierte Kochtexte.
|
||
- Einkaufsliste und gespeicherter Abhakstatus, Drucklayout ohne Navigation.
|
||
- Kochmodus vor/zurück, Zutatenstatus, Timer über Schritte hinweg, Pause/Reset, Reload-Wiederherstellung, Abschluss und Neustart.
|
||
- Admin-Anmeldung, Anlage, Bearbeitung, Veröffentlichung, Bild-Upload, lokal wiederhergestellter Editorentwurf, Live-Vorschau, Exportdownload, Löschung und Logout.
|
||
- JSON/XML-Import über die grafische Oberfläche, prüfbare Vorschau und Duplikatsperre.
|
||
- 401 für unbefugte Schreib-/Exportversuche, 403 bei fremder Origin, Session-Cookie-Eigenschaften, Versionskonflikt 409, Datenvalidierung 422.
|
||
- Atomare Importablehnung, XXE-Abweisung und Ablehnung unzulässiger/gefälschter Bilddateien.
|
||
- Passwortwechsel mit Widerruf einer anderen Sitzung, Login-Brute-Force-Limit 429.
|
||
- Echte Browser-Offlineschaltung: besuchte Kochseite lädt weiter interaktiv, Timer bleibt erhalten, unbekannte Seite zeigt ehrliches Offline-Fallback.
|
||
- Editor in Dark Mode einschließlich Zutatenreihenfolge auf allen drei Viewports.
|
||
|
||
Viewports: Desktop **1440 × 1000**, Smartphone **390 × 664** (Chromium mit iPhone-13-Geräteprofil), Tablet **768 × 1024** (Chromium mit iPad-Mini-Profil). Geräteprofile sind Emulationen; damit wird keine Prüfung auf physischem iOS/Safari behauptet.
|
||
|
||
### Tatsächlicher Docker-Betrieb
|
||
|
||
Docker Engine über Colima, Compose 5.6.1; `node:24-bookworm-slim`, `postgres:17-bookworm`, Linux ARM64. Der automatisierte Test erstellt ein getrenntes zufällig benanntes Projekt und testet:
|
||
|
||
1. Image-Build und `compose up --wait`: App und Datenbank **healthy**.
|
||
2. App-UID **1000**, kein Root-App-Prozess.
|
||
3. Initialer Admin per CLI mit zufälligem Passwort über stdin.
|
||
4. HTTP-Anmeldung, Import von drei vollständigen Rezepten, echter JPEG-Upload mit WebP-Re-Encoding, Rezeptänderung und Gesamtexport.
|
||
5. Neustart von App und Datenbank, erneute Healthchecks.
|
||
6. Gleiche Rezeptzahl und exakt gleiche Bildbytes nach Neustart; Session weiterhin gültig.
|
||
7. `pg_dump -Fc`, Restore in eine neue Datenbank, Kontrolle der wiederhergestellten Rezeptzahl.
|
||
8. Wiederholt gestartete Migrationen bleiben idempotent.
|
||
|
||
Ein erster Docker-Prüflauf deckte einen wiederverwendeten, durch den Containerneustart geschlossenen HTTP-Testsocket auf. Die Testverbindungen werden nun explizit geschlossen; der vollständige anschließende Prüflauf bestand. Es wurden keine Fehler übersprungen und keine Produktfunktionen gemockt.
|
||
|
||
## Visuelle Inspektion
|
||
|
||
16 reale Browser-Screenshots liegen in [`docs/screenshots/`](screenshots/): Bibliothek, Rezeptseite, Kochmodus und Favoriten in Desktop/Mobile/Tablet sowie Editor in hellem und dunklem Design.
|
||
|
||
Tatsächlich angesehen: Desktop- und Mobile-Bibliothek, Tablet-Bibliothek, mobile Rezeptseite, mobiler Kochmodus, Desktop-Editor, mobiler Dark-Mode-Editor und dunkle Favoritenansicht. Dabei wurden eine falsche Suchfeld-Flexrichtung, ein zu schmaler mobiler Infobereich und eine Timer-Anzeigeabweichung nach Start korrigiert. Die aktualisierten Bilder wurden erneut kontrolliert. Browserprüfungen bestätigen fehlenden horizontalen Überlauf in den geprüften Bibliotheks-, Rezept- und Editoransichten.
|
||
|
||
## Präzise Grenzen
|
||
|
||
- Kein Test auf physischem Smartphone, Safari oder Firefox; keine tatsächliche iOS-/Android-Installation über das Betriebssystem-Installationsmenü.
|
||
- Wake Lock und akustische Signale sind implementiert, aber nicht auf gesperrten physischen Geräten validiert. Browser/OS können Hintergrundseiten suspendieren; Endzeitpunkte bleiben korrekt, ein akustischer Hintergrundalarm ist nicht garantiert.
|
||
- Reverse-Proxy-HTTPS, TLS-Zertifikate und Secure-Cookies müssen am Zielhost mit seiner Domain geprüft werden. Die lokale Integration verwendete HTTP.
|
||
- Linux ARM64 ist tatsächlich getestet; ein separater AMD64-Deploy wurde nicht durchgeführt.
|
||
- Kein externer Penetrationstest, keine Garantie, dass ein Abhängigkeitsaudit jede Schwachstelle erkennt. Es sind aus den durchgeführten Prüfungen keine kritischen Sicherheitsfehler bekannt.
|
||
- Editorentwürfe, Favoriten, Einkaufslisten und Kochfortschritt sind bewusst geräte-/browserlokal; kein geräteübergreifender Sync.
|
||
- JSON/XML transportiert Rezeptdaten und lokale Bildreferenzen. Bilddateien werden separat über das persistente Volume gesichert und übertragen.
|
||
- Offline umfasst tatsächlich gespeicherte öffentliche Ansichten; neue oder aus dem Browsercache entfernte Inhalte benötigen Netz. Administration bleibt onlinepflichtig.
|
||
|
||
Diese Grenzen sind keine als fertig ausgegebenen ungeprüften Plattformversprechen. Die oben genannten implementierten Kernabläufe wurden in der dokumentierten Umgebung erfolgreich geprüft.
|