105 lines
11 KiB
Markdown
105 lines
11 KiB
Markdown
# Prüfnachweise
|
||
|
||
Stand: **24. Oktober 2026**. Die folgenden Prüfungen wurden tatsächlich ausgeführt, nicht lediglich vorbereitet.
|
||
|
||
## Ergebnisse der Erstprüfung
|
||
|
||
| Prüfung | Ergebnis |
|
||
| ---------------------- | ------------------------------------------------------------------ |
|
||
| `npm run typecheck` | Erfolgreich, keine TypeScript-Fehler |
|
||
| `npm test` | **34/34 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
|
||
|
||
19 reale Browser-Screenshots liegen in [`docs/screenshots/`](screenshots/): Bibliothek, Rezeptseite, Kochmodus und Favoriten in Desktop/Mobile/Tablet sowie Editor und kompakte Zutatenliste 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.
|
||
|
||
### Nachprüfung: kompakter Zutateneditor
|
||
|
||
Nach der gestalterischen Überarbeitung wurden TypeScript-Prüfung und Produktionsbuild erneut erfolgreich ausgeführt. Die vier betroffenen Browserabläufe bestanden: vollständige Rezeptanlage/-bearbeitung auf Desktop sowie der Zutateneditor auf Desktop, Smartphone und Tablet. Geprüft wurden aufklappbare Details, Mengen, optionale Zutaten, Fokus nach Hinzufügen, Enter zum Weitererfassen, Reihenfolge per Buttons und Desktop-Drag-and-drop, Entwurfswiederherstellung sowie fehlender horizontaler Überlauf mit und ohne Live-Vorschau. Ein zunächst falsch auf `textbox` statt `combobox` gerichteter Testselektor für die Abschnittsauswahl wurde korrigiert; anschließend bestanden alle vier Tests. Die neuen Screenshots der hellen Desktop-/Smartphone-Ansicht und der dunklen Tablet-Ansicht wurden visuell kontrolliert.
|
||
|
||
### Nachprüfung: externe Bilder und strukturierte Schritte
|
||
|
||
- TypeScript-Prüfung und Produktionsbuild erfolgreich; **49/49 Unit-Tests** in vier Dateien bestanden.
|
||
- **13 betroffene Browser-/API-Abläufe** erfolgreich geprüft: Editor mit Schrittbild-Upload und Löschsperre für verwendete Medien, JSON/XML-Import, API-Validierung, Offline-Kochmodus sowie auf Desktop/Smartphone/Tablet jeweils externer Bildimport mit Editoränderung/Export, Portionsrechner/Druckansicht und Kochfortschritt/Timer.
|
||
- HTTPS-Titelbilder, Rezeptgalerien und Schrittbilder werden in JSON und XML verlustfrei erhalten. Alte Rezepte ohne Schrittbilder bleiben lesbar. Ungültige URL-Protokolle, Zugangsdaten in Bildadressen und Bildlimits sind getestet.
|
||
- Die neuen Browserabläufe verwenden deterministische HTTPS-Bildantworten per Playwright-Routing, einschließlich einer 404-Antwort. Sie prüfen die reale CSP, tatsächlich geladene Bilder, Fehlerplatzhalter, Listen/Absätze, skalierte Referenzen und fehlenden horizontalen Überlauf. Ein dabei entdeckter Bildfehler vor React-Hydration wurde durch Prüfung des bereits abgeschlossenen Bildladezustands behoben.
|
||
- Visuell angesehen: neue Desktop-Rezeptkarten für Schritte, Smartphone-Rezeptseite mit Schrittbildern, dunkle Desktop-Schrittkarte und mobiler Kochmodus. Die Rezept-/Kochmodus-Screenshots unter `docs/screenshots/` wurden aktualisiert; zusätzliche Bild-/Listenansichten liegen in den Playwright-Testartefakten.
|
||
- Die JSON-Vorlage in `docs/CHATGPT-PROMPT.md` wurde mit dem tatsächlichen Importparser geprüft; das öffentliche JSON-Schema und die Beispiele wurden neu erzeugt.
|
||
|
||
### Nachprüfung: mobile Rezeptbreite
|
||
|
||
Der mobile Überlauf wurde am veröffentlichten Pljeskavica-Rezept reproduziert: lange Bildquellen-URLs in den Tipps vergrößerten die minimale Grid-Spaltenbreite und damit auch die Zutatenliste. Die Spalte verwendet nun `minmax(0, 1fr)`, ihre Kinder dürfen schrumpfen und lange Texte umbrechen. Mit dem echten Rezept und dem korrigierten Stylesheet wurden 320, 360, 390, 430 und 768 Pixel Breite ohne Überlauf geprüft. Produktionsbuild und alle 15 öffentlichen Browserabläufe bestanden. Der Regressionstest enthält eine lange Quellen-URL und vergleicht die Inhaltsbreite mit `document.documentElement.clientWidth`; `innerWidth` kann sich auf mobilen Browsern selbst mit dem Überlauf vergrößern und ist dafür ungeeignet.
|
||
|
||
### Nachprüfung: Admin-2FA und Mail (25. Oktober 2026)
|
||
|
||
- Formatprüfung, TypeScript und Produktionsbuild erfolgreich; **55/55 Unit-Tests** bestanden, darunter RFC-6238-Vektoren, Zeitfenster, Replay-Schutz, verschlüsselte Geheimnisse und Wiederherstellungscodes.
|
||
- **6/6 betroffene Browser-/API-Abläufe** gegen eine isolierte PostgreSQL-17-Testdatenbank auf dem Server bestanden. Docker und PostgreSQL auf dem Entwicklungs-Mac blieben ausgeschaltet.
|
||
- Authenticator-Einrichtung per QR-Code, Passwort-/2FA-Stufen, CSRF, Sitzungswiderruf, fünf Fehlversuche, abgelaufene Challenges, gleichzeitige Verwendung desselben Wiederherstellungscodes und Code-Neugenerierung geprüft.
|
||
- Echte SMTP-Zustellung mit TLS und Authentifizierung an einen Testserver; Testmail, Login-Herkunft, Opt-out, Passwortbeibehaltung, Geheimnisverschlüsselung und fehlende Geheimnisse in API-Antworten geprüft. Ein absichtlicher SMTP-Verbindungsfehler verhindert die Anmeldung nicht.
|
||
- Einstellungen auf Desktop und bei 390 Pixel Breite visuell kontrolliert; kein horizontaler Überlauf. Screenshots liegen in den ignorierten Playwright-Artefakten.
|
||
- Die Ziel-Mailbox benötigt noch vom Betreiber eingetragene SMTP-Zugangsdaten. 2FA wird vom Admin persönlich durch Scannen und Codebestätigung aktiviert.
|
||
|
||
## 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 sowie lokale und externe Bildreferenzen. Lokale Bilddateien werden separat über das persistente Volume gesichert und übertragen; externe Bilder verbleiben beim jeweiligen Anbieter und werden nicht für den Offlinebetrieb gespeichert.
|
||
- 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.
|