# TESTPLAN Wellenbrecher (manueller Golden Path)

Manuelle Pruefsequenz gegen eine echte WordPress-Instanz. Ergaenzt die
automatisierte PHPUnit-Suite (tests/), die ohne WordPress gegen wp-stubs +
FakeWpdb laeuft. Voraussetzung: Wellenbrecher aktiviert, Core-Kopie vorhanden,
Cap hs_manage_spam beim Admin.

Automatisierter Testlauf (aus dem Plugin-Ordner, portable Toolchain):

    ..\..\tools\php\php.exe ..\leadlotse\vendor\phpunit\phpunit\phpunit --configuration phpunit.xml

Stand W4: 156 Tests / 520 Assertions gruen.

---

## 1. Installation und erster Start

1. Plugin-ZIP (dist/wellenbrecher-1.0.0.zip) unter Plugins hochladen, aktivieren.
   Erwartung: keine Notice, keine Fehler. Menue "Wellenbrecher" mit Schild-Icon
   erscheint (Uebersicht, Quarantaene, Block-Log, Einstellungen).
2. Uebersicht oeffnen: Beobachtungsmodus-Banner mit Restlaufzeit, Einrichtungs-
   Checkliste "Klar zum Auslaufen" (Beobachtung laeuft = erledigt; Scharf
   schalten = offen; Flotten-Kanaele = informativ; Datenschutz-Hinweis = offen
   bis eine Datenschutzseite gesetzt ist), Kennzahlen-Tabelle (alles 0),
   Hans-Karte "die See ist ruhig".

## 2. Kommentar-Kanal (W2)

3. Beitragsseite im Inkognito-Fenster, Quelltext pruefen:
   - Kommentar-Textfeld traegt einen rotierten Namen `wb_xxxxxxxxxx`, NICHT
     `comment`.
   - Verstecktes Feld `name="comment"` (Honeypot, aria-hidden, tabindex -1).
   - Hidden-Felder `wb_js` (Zufallszahl), `wb_events`, `wb_token`; signals.js
     eingereiht. Nach Seitenladen steht in `wb_js` ein Timestamp, nach
     Mausbewegung in `wb_events` eine 1, in `wb_token` der Token vom REST-
     Endpoint /wellenbrecher/v1/token (Antwort mit No-Cache-Kopfzeilen).
4. Beobachtungsmodus (Default an): Bot-Submit simulieren (curl direkt an
   wp-comments-post.php). Erwartung: Kommentar geht in die normale Moderation
   DURCH, erscheint im Block-Log als "Markiert (Beobachtung)" mit Score und
   Gruenden; die Spalte "Wellenbrecher" in der Kommentarliste zeigt den
   Breakdown.
5. "Jetzt scharf schalten" klicken. Bot-Submit mit hohem Score wiederholen
   (Honeypot-Feld `comment` befuellen, BBCode-Link im Inhalt). Erwartung:
   knapper 403, KEIN Eintrag in wp_comments (keine verbrauchte ID), aber im
   Block-Log als "Blockiert".
6. Grenzwertiger Submit (Score 40-79, z.B. nur fehlender Token + zwei Links):
   Kommentar landet im WordPress-Spam-Ordner, Breakdown-Spalte zeigt die
   Gruende, Block-Log fuehrt ihn als "Quarantaene".
7. Normaler Kommentar als echter Besucher (Browser, kurz warten, Maus bewegen):
   laeuft unauffaellig durch.
8. Lern-Feedback: Quarantaene-Kommentar auf "Kein Spam" setzen. Erwartung: die
   E-Mail ist allowgelistet (Trust -30), ein erneuter Submit bekommt sichtbar
   weniger Punkte. Wieder als Spam markieren: Allowlist-Eintrag entfernt.
9. XML-RPC-Option in den Einstellungen aktivieren: `system.listMethods` zeigt
   pingback.ping und wp.newComment nicht mehr; xmlrpc.php selbst antwortet
   weiter.

## 3. Registrierungen (W3)

10. Registrierung aktivieren (Einstellungen, Mitgliedschaft). Bot-Registrierung
    mit UA-Bibliothek und ohne Accept-Language simulieren. Scharf geschaltet:
    Erwartung generische Ablehnung ("Die Registrierung konnte nicht
    abgeschlossen werden."), Block-Log fuehrt den EHRLICHEN Verdict
    (blocked bzw. quarantined). Beobachtungsmodus: durchlassen und flaggen.
11. Bei aktivem WooCommerce: dieselbe Pruefung ueber die Woo-Registrierung
    (woocommerce_registration_errors).

## 4. Leadlotse-Kanal und Quarantaene mit Restore (W3)

12. Leadlotse aktiv, ein veroeffentlichtes Formular. Bot-Submit (curl, hoher
    Score). Scharf geschaltet, Zone Quarantaene: Erwartung, der Besucher sieht
    die normale Erfolgsmeldung (stilles Abfangen), es entsteht KEIN Eintrag in
    hs_entries, KEIN Lead und KEIN Kurato-Kontakt/Abo. Die Anfrage liegt in
    Wellenbrecher unter Quarantaene.
13. Quarantaene-Seite: Payload wird wertweise und escaped angezeigt, technische
    Signalfelder ausgeblendet. Eintrag auswaehlen, "Wiederherstellen":
    Erwartung, der Submit laeuft mit Bypass durch die normale Pipeline, der Lead
    entsteht regulaer inkl. DOI/Kurato-Events, und die hs_spam_log-Zeile wird
    GELOESCHT (kein weiterer Wiederholungstaeter-Treffer).
14. Zone Block: hoeflich-generische Ablehnung (WP_Error), Block-Log fuehrt sie.

## 5. WooCommerce-Rezensionen mit verifiziertem Kaeufer (W4)

15. Braucht eine echte WooCommerce-Instanz (offener Punkt aus WB17). Als
    verifizierter Kaeufer (Bestellung mit derselben E-Mail vorhanden) eine
    Produkt-Rezension abgeben. Erwartung: Trust-Abzug -20 taucht im Score-
    Breakdown auf (Regel trust_verified_buyer), die Rezension wird seltener
    aufgehalten. Als Nicht-Kaeufer/Gast: kein Abzug. Ohne aktives WooCommerce
    bleibt alles wie bei normalen Kommentaren.

## 6. Selbst-Update-Check (W4)

16. Beispiel-Manifest testen: unter einer erreichbaren HTTPS-URL eine
    wellenbrecher.json mit einer HOEHEREN Version bereitstellen (Feld package
    MUSS mit https://hafenstudios.com/ beginnen). Fuer den Test kann der
    Filter update_plugins_hafenstudios.com kurz auf die Test-URL zeigen, oder
    das echte Manifest auf hafenstudios.com/updates/ liegt vor. Erwartung: unter
    Plugins erscheint das Update-Angebot; ein Klick auf "Aktualisieren"
    installiert das ZIP ueber den WordPress-Kern.
17. Host-Bindung pruefen: zeigt package auf einen fremden Host (nicht
    hafenstudios.com), darf KEIN Update angeboten werden. Ebenso bei kaputtem
    JSON, HTTP-Fehler oder Timeout: kein Angebot, keine Notice (fail-silent).
    Der Abruf erfolgt hoechstens alle 12 Stunden (Transient-Cache
    wellenbrecher_update_manifest).

## 7. DSGVO (W4)

18. Datenschutz-Assistent (Einstellungen, Datenschutz): der Wellenbrecher-
    Textbaustein ist als Vorschlag hinterlegt (Sie-Form, nennt Fristen und den
    Update-Check als einzigen externen Request).
19. Werkzeuge, Personenbezogene Daten exportieren: fuer die E-Mail einer
    quarantinierten Formular-Anfrage. Erwartung: die Gruppe "Quarantaene
    (Wellenbrecher)" enthaelt die dekodierten Feldwerte (ohne technische
    Signalfelder).
20. Werkzeuge, Personenbezogene Daten loeschen: fuer dieselbe E-Mail. Erwartung:
    der Quarantaene-Payload wird geloescht (items_removed), und es erscheint der
    ehrliche Hinweis, dass die uebrigen, pseudonymisierten Protokolle (IP nur
    als Pruefwert, E-Mail nur als Domain) fristgebunden geloescht werden
    (retained).

## 8. Auto-Purge-Cron (W4)

21. Der taegliche Cron `wellenbrecher_daily_purge` (Installer, seit W1) laeuft
    einmal taeglich und loescht nach den Fristen: blocked/flagged nach 7 Tagen,
    quarantined nach 30 Tagen (einstellbar 7/15/30/60). Pruefung z.B. mit WP
    Crontrol: Hook ist geplant. Alt-Eintraege mit passendem created_at
    verschwinden nach dem Lauf; die aggregierte Statistik (hs_spam_stats) bleibt
    ohne Personenbezug erhalten.

## 9. Admin-Seiten-Sichtung (W4)

22. Alle vier Admin-Seiten oeffnen und auf Darstellung/Fehler pruefen:
    Uebersicht (Checkliste, Kennzahlen, letzte Blocks, Kacheln),
    Quarantaene (Liste, Bulk-Aktionen), Block-Log (Filter, Pagination,
    Bulk-Loeschen), Einstellungen (Zonen mit "Zurueck auf Standard",
    Regel-Tabelle, Aufbewahrung, Proxy-Header, XML-RPC, Keywords).
    Ist die Checkliste komplett (scharf geschaltet + Datenschutzseite gesetzt),
    erscheint statt der Liste die einmalige Hans-Abschluss-Karte.

## Kompatibilitaets-Fallback

23. Theme mit eigenem Kommentar-Markup (ohne comment_form_field_comment):
    Formular funktioniert unveraendert, nur ohne Honeypot-/Feld-Tausch-Signal;
    alle uebrigen Regeln laufen normal.
