# IMP-05 – Prüfprotokoll: Hot-Folder/Scanner-Anbindung Voraussetzung IMP-01 (Fertig). ## Umsetzung - `mail/internal/hotfolder/store.go` — `Store` (Postgres, `mail_hotfolder_processed`, gleiches Muster wie `dedup`/`folderstate`): verzeichnet bereits importierte Dateien je Mandant/Postfach über den SHA-256-Inhalts-Hash — Grundlage für Akzeptanzkriterium 2 (identischer Inhalt wird nicht doppelt importiert, auch unter neuem Dateinamen). - `mail/internal/hotfolder/watcher.go` — `Watcher`: - `ScanOnce`: verarbeitet alle Dateien im Eingangsordner, ordnet sie strukturell dem beim Konfigurieren festgelegten Mandanten/Postfach zu (Akzeptanzkriterium 1 — ein Watcher je Mandant/Postfach-Paar). - Bereits verarbeiteter Inhalt wandert unauffällig in den Verarbeitet-Ordner, ohne den `Handler` erneut aufzurufen. - Ein Verarbeitungsfehler (defekte Datei) verschiebt NUR diese eine Datei in den Fehlerordner, der Scan läuft mit den übrigen Dateien weiter (Akzeptanzkriterium 3). - `Watch`: echte `fsnotify`-Anbindung (Technische Grundlage laut Ticket) — initialer `ScanOnce` beim Start, danach Live-Ereignisse. - Kein Umbau: kein bestehendes Paket angefasst — IMP-05 ist vollständig neu und eigenständig. `github.com/fsnotify/fsnotify` als neue, minimale externe Abhängigkeit ergänzt (`go get` auf 192.168.1.131, `go.mod`/`go.sum` aktualisiert). ## Prüfungen | # | Prüfung | Ergebnis | |---|---|---| | 1 | Test: gleiche Datei zweimal abgelegt wird nur einmal importiert | **bestanden** – `TestScanOnce_SameFileDroppedTwiceImportedOnce`: identischer Inhalt unter zwei verschiedenen Dateinamen abgelegt, zweiter Scan meldet real 0 Importe/1 Duplikat, Handler real nur 1x aufgerufen | | 2 | Test: fehlerhafte Datei landet nachvollziehbar im Fehlerordner | **bestanden** – `TestScanOnce_CorruptFileMovedToErrorFolderTraceably`: defekte Datei real im Fehlerordner, real aus dem Eingang entfernt, die GUTE Nachbardatei wurde real trotzdem verarbeitet | | 3 | Dauertest über mehrere Scan-Zyklen ohne Ressourcenleck | **bestanden** – `TestScanOnce_ManyCyclesWithoutResourceLeak`: 50 reale Scan-Zyklen, Goroutine-Anzahl real stabil (Toleranz eingehalten), Verarbeitet-Ordner real konsistent | Zusätzlich (benannte Technik `fsnotify` real geprüft): `TestWatch_RealFsnotifyEventTriggersImport` — eine neu abgelegte Datei wird real über ein echtes Dateisystem-Ereignis erkannt und importiert, ohne manuellen `ScanOnce`-Aufruf. ## Build/Test-Ergebnis (192.168.1.131) ``` go build ./... -> clean go vet ./... -> clean golangci-lint run ./... -> 0 issues TEST_TENANT_DSN=... go test ./internal/hotfolder/... -v -timeout 60s -> 4/4 bestanden TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1 -> alle 20 Pakete bestanden, keine Regression ``` ## Gesamtergebnis **Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. Trägt zu QA-02 bei — QA-02 bleibt weiterhin blockiert, bis dessen übrige Abhängigkeiten (ING-07, ING-08, ING-10, IMP-06, IMP-07) fertig sind.