feat(mail): QA-02 Prüfgate Ingestion & Import

Neues Paket mail/internal/ingestiontestgate, spiegelt das etablierte
Muster aus mail/internal/qagate (QA-03) und mail/internal/importtestgate
(IMP-09): ein echtes, ausführbares Gate statt einer nur behaupteten
Prüfung. IngestionAndImportPackages listet alle 14 aus QA-02s eigener
dependsOn-Liste folgenden Pakete (Protokoll-Server, Fehlerbehandlung/
Logging, Import-Pfade). RunTestSuites führt go test -count=1 -p 1 über
alle 14 Pakete aus — -p 1 bewusst, da parallele Testbinaries sich bei
den echten QA-07-Lasttests gegenseitig CPU-Kontingent wegnehmen und
Latenz-Zielwerte durch reine Testhost-Überlastung verfehlen lassen
(real beobachtet, mit -p 1 behoben). ScanForKnownErrorPointTests prüft
automatisiert, dass die drei in Akzeptanzkriterium 2 namentlich
geforderten Fehlerpunkte (Header-Injection, Anhang-Limit, UIDVALIDITY)
je einen passenden Regressionstest im zuständigen Paket haben.

Gate-Lauf gegen aktuellen Stand real ausgeführt und mit Zeitstempel
dokumentiert: BESTANDEN, 14 Pakete grün, alle drei bekannten
Fehlerpunkte abgedeckt. Scanner durch Negativtest bewiesen, dass er
eine tatsächlich fehlende Abdeckung real erkennt statt immer
"bestanden" zu melden.

Pflichtprüfung 3 (Zweitperson bestätigt Gate-Ergebnis unabhängig)
bleibt strukturell offen — eine einzelne Sitzung kann keine unabhängige
zweite Person sein, im Prüfprotokoll dokumentiert (analog zu ING-10 und
QA-04).

go build/go vet/golangci-lint clean, gesamtes Mail-Modul
regressionsfrei getestet.
This commit is contained in:
sysops
2026-09-01 17:36:48 +02:00
parent 0505351e8f
commit 2d32157de4
3 changed files with 452 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# QA-02 — Prüfgate Ingestion & Import: Prüfprotokoll
Datum: 2026-09-01
Host: 192.168.1.131 (Build/Test/Lint), rsync + ssh
Paket: `mail/internal/ingestiontestgate` (neu)
## Umsetzung
Spiegelt das bereits etablierte Muster aus `mail/internal/qagate`
(QA-03) und `mail/internal/importtestgate` (IMP-09) — ein echtes,
ausführbares Prüfgate statt einer nur behaupteten Prüfung:
- `IngestionAndImportPackages`: alle 14 Pakete, die aus QA-02s eigener
`dependsOn`-Liste folgen (ING-10: IMAP/POP3/SMTP/MIME/Folder-State;
ING-07: protoguard; ING-08: protolog; IMP-04/IMP-09: imapimport;
IMP-05: hotfolder; IMP-06: virusscan; IMP-07: mailboxconfig; IMP-08:
syncalert; zugehörig: attachments, mailrules).
- `RunTestSuites`: führt `go test -count=1 -p 1` über alle 14 Pakete
aus (`-p 1`: nacheinander statt parallel — mehrere gleichzeitige
Testbinaries würden sich bei den echten QA-07-Lasttests in
imap/pop3/smtp gegenseitig CPU-Kontingent wegnehmen und so
Latenz-Zielwerte durch reine Testhost-Überlastung verfehlen lassen,
real beobachtet und behoben).
- `ScanForKnownErrorPointTests`: prüft für die drei in
Akzeptanzkriterium 2 namentlich geforderten Fehlerpunkte
(Header-Injection, Anhang-Limit, UIDVALIDITY), ob im jeweils
zuständigen Paket eine `_test.go`-Datei eine passende Testfunktion
enthält — automatisiert, nicht nur behauptet.
## Pflichtprüfung 1: Gate-Lauf gegen aktuellen Stand von ING-10/IMP-09 dokumentiert
`TestRun_RealGateAgainstCurrentIngestionImportState`
(`ingestiontestgate/gate_test.go`): echter Gate-Lauf gegen den
aktuellen Quelltext, Ergebnis:
```
# QA-02 Gate-Ergebnis: BESTANDEN
Zeitstempel (UTC): 2026-09-01T15:35:33Z
## Testsuiten (Ingestion & Import, 14 Pakete)
Bestanden: true
## Bekannte Fehlerpunkte — Regressionstest-Stichprobe
- Header-Injection: abgedeckt=true — TestHeaderWriter_RejectsControlCharsAndCRLFInSubjectAndDisplayName in internal/mailer/mailer_test.go
- Anhang-Limit: abgedeckt=true — TestParse_OversizedAttachmentRejectedNotMemoryExhausted in internal/mimeparse/mimeparse_test.go
- UIDVALIDITY: abgedeckt=true — TestRebuild_ChangesUIDValidityOnSimulatedFolderRebuild in internal/folderstate/store_test.go
```
Ergebnis: **BESTANDEN**, dokumentiert mit Zeitstempel.
## Pflichtprüfung 2: Stichprobe — mindestens ein Regressionstest je bekanntem Fehlerpunkt vorhanden
Durch Pflichtprüfung 1 automatisiert mitgeprüft. Ergänzt um zwei
eigenständige Bausteintests: `TestScanForKnownErrorPointTests_
RealPackagesAllCovered` (positiver Nachweis gegen den echten
Quelltext) und `TestScanForKnownErrorPointTests_DetectsMissingCoverage`
(Negativtest — beweist, dass der Scanner eine tatsächlich fehlende
Abdeckung auch real erkennt, nicht nur immer "bestanden" meldet).
Ergebnis: **BESTANDEN**.
## Pflichtprüfung 3: Zweite Person bestätigt Gate-Ergebnis unabhängig
**Nicht durchführbar durch diese Sitzung**, aus demselben strukturellen
Grund wie bereits bei ING-10 (Stichprobenreview) und QA-04
(API-Token-Prüfung) dokumentiert: eine einzelne KI-Sitzung kann keine
unabhängige ZWEITE Person sein, ohne den Zweck der Prüfung (echte
menschliche Gegenkontrolle) zu unterlaufen. **Offen — erfordert
Bestätigung durch den Nutzer oder eine weitere Person.** Grundlage für
dieses Review: der Gate-Bericht oben, reproduzierbar über
`go test ./internal/ingestiontestgate/... -run TestRun_RealGate` mit
gesetztem `TEST_TENANT_DSN`/`TEST_MANTICORE_URL`.
## Akzeptanzkriterien
1. **Gate prüft Testabdeckung und Bestehen aller Ingestion-/
Import-Testsuiten**: durch Pflichtprüfung 1 belegt.
2. **Gate prüft, dass bekannte Fehlerpunkte (Header-Injection,
Anhang-Limit, UIDVALIDITY) durch Tests abgedeckt sind**: durch
Pflichtprüfung 2 belegt.
3. **Gate-Ergebnis ist dokumentiert und nachvollziehbar mit
Zeitstempel**: `GateResult.Report()`, siehe Pflichtprüfung 1.
## Build/Vet/Lint/Test — Gesamtmodul
```
go build ./... → OK
go vet ./... → OK
golangci-lint run ./... → 0 issues
go test ./... -p 1 (TEST_TENANT_DSN, TEST_MANTICORE_URL, TEST_S3_ENDPOINT/TEST_S3_ACCESS_KEY/TEST_S3_SECRET_KEY gesetzt) → alle Pakete ok, inkl. neuem internal/ingestiontestgate
```
Keine Regression.
## Ergebnis
QA-02 erfüllt Akzeptanzkriterium 13 mit echten, ausgeführten
Nachweisen; Pflichtprüfung 3 (Zweitreview) bleibt strukturell offen,
siehe Abschnitt oben — analog zu ING-10 und QA-04 im Entscheidungs-
verlauf vermerkt. Freigeschaltet: QA-09 (zusammen mit QA-05/QA-06/
QA-08).