From 73f414e22ab251d76cfb32c29960769014badc7f Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Mon, 6 Jul 2026 10:16:21 +0000 Subject: [PATCH] R6.1: QA-Checkliste erstellt, Vorpruefung abgeschlossen dev/release/qa-checkliste.md loest Par. 15 der Scope-Doku ab: jeder Punkt mit Beleg-Tests aus der gruenen Suite bzw. konkreten manuellen Browser-/Staging-Schritten, inkl. Testzugaenge und Reihenfolge. Befunde der Vorpruefung: /thumbnails-Redirect fehlte (separat gefixt, d0ffe66); Newsletter-Double-Opt-In bewusst vertagt und als Nicht-Blocker dokumentiert. Offen bleiben die manuellen Durchgaenge (User) und die Staging-Punkte (R6.3). Co-Authored-By: Claude Fable 5 --- dev/release/entwicklungsplan-release.md | 2 +- dev/release/qa-checkliste.md | 75 +++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 dev/release/qa-checkliste.md diff --git a/dev/release/entwicklungsplan-release.md b/dev/release/entwicklungsplan-release.md index 0f993d2b..62fd25a0 100644 --- a/dev/release/entwicklungsplan-release.md +++ b/dev/release/entwicklungsplan-release.md @@ -117,7 +117,7 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G ## Phase R6 — QA & Go-Live (teils extern/Ops) -- [ ] **R6.1 Manuelle QA-Checkliste durcharbeiten** — `dev/migration 2026/06-FEATURES-SCOPE.md` §15 (komplett offen): Logins inkl. 2FA + Magic-Link, Portal-Scoping, PM-Workflow Admin+Customer, Image-Upload, Blacklist, Stripe-Checkout inkl. Webhook + Invoice-PDF, Grandfathering, Legacy-Rechnungen, API (Sanctum + Abweisung alter api_key), Thumbnail-Redirect, Scheduler. Dabei auch verifizieren, was die (veraltete) Frontend-Konzept-Doku noch als offen führt (Branchen-/Kategorieseite, Veröffentlichen-Landing — im Code existieren `KategorieController`/`VeroeffentlichenController` bereits → visuell abnehmen statt neu bauen). +- [~] **R6.1 Manuelle QA-Checkliste durcharbeiten** — **Vorprüfung + aktualisierte Checkliste erledigt 06.07.:** `dev/release/qa-checkliste.md` ersetzt §15 der Scope-Doku (jeder Punkt mit Beleg-Tests bzw. konkreten manuellen Schritten; Testzugänge, Reihenfolge lokal → Staging). **Befunde:** (1) /thumbnails-Redirect fehlte trotz „ANGEPASST"-Vermerk → gebaut (`LegacyMediaRedirectController` + Tests, 301 auf neue Storage-URLs für PM-Bilder/Logos). (2) Newsletter-DOI unvollständig → bewusst vertagt, kein Launch-Blocker (kein öffentliches Formular verlinkt), vor Newsletter-Aktivierung DOI-Flow bauen. **Offen:** manuelle Browser-Durchgänge (User) — Kategorieseite/Veröffentlichen-Landing erst nach Abschluss des laufenden Frontend-Umbaus abnehmen; Stripe-/Scheduler-/Mail-Punkte beim Staging-Rehearsal (R6.3). - [x] **R6.2 Security-Review** — Audit + Härtung erledigt 03.07. **Solide befunden:** CSRF (Stripe-Webhook via Signatur, keine Ausnahmen), Magic-Link-Krypto (64-Zeichen-Token, sha256-gehasht, atomare Einmalverwendung), HTMLPurifier-Sanitizing der PM-Texte, Raw-Queries durchgängig mit Bindings, IDOR-Schutz doppelt (Scope + Policy), BasicAuth timing-sicher, Session host-only korrekt fürs Hub-and-Spoke-Setup. **Gefixt:** Security-Header-Middleware (app-seitig), Logo-Upload im Company-Create über ImageService (vorher SVG/XSS möglich), Rate-Limits für Passwort-Reset/Registrierung/Consume-Routen, `EnsureUserIsCustomer` als persistente Livewire-Middleware. Tests: `SecurityHardeningTest`. **Offen/bewusst:** CSP separat einführen (Livewire/Alpine-Inline-Strategie nötig); Token-Abilities werden auf API-Routen nicht feingranular geprüft (ein Scope für alles — ok, solange keine eingeschränkten Tokens ausgegeben werden); Draft-PM-Anhänge nur per URL-Obscurity (dokumentierter MVP-Tradeoff); HSTS am Proxy setzen; **[USER-ENTSCHEIDUNG] Legacy-SQL-Dumps (`dev/migration 2026/sql/*.sql`, Produktivdaten!) sind im Git getrackt — enttracken + ggf. History bereinigen.** - [ ] **R6.3 Staging-Import-Rehearsal** — Datenimport gegen produktiven Legacy-Snapshot auf Staging (mehrfach als der offene Vollständigkeitsnachweis referenziert, P6.10/P11.3). Achtung: `mysql_businessportal`-Verbindung lokal ist nur ein ~April-Snapshot — fürs Rehearsal echten aktuellen Dump ziehen. **[EXTERN: Server/Snapshot]** - [ ] **R6.4 Go-Live-Kette** — Go-Live-Mailing (Passwort-Reset) + API-Kunden-Mailing: Code fertig, **finale Texte + Freigabeliste [EXTERN]**; DNS-Cutover `pressekonto.de`; Legacy-System read-only während Final-Import; alte Symfony-Server abschalten. *(= P11.x)* diff --git a/dev/release/qa-checkliste.md b/dev/release/qa-checkliste.md new file mode 100644 index 00000000..1a076ec7 --- /dev/null +++ b/dev/release/qa-checkliste.md @@ -0,0 +1,75 @@ +# Manuelle QA-Checkliste (R6.1) — Stand 06.07.2026 + +Quelle: `dev/migration 2026/06-FEATURES-SCOPE.md` §15, aktualisiert auf den echten +Funktionsstand. **Vorprüfung 06.07. (Claude):** Jeder Punkt wurde gegen Code und +Testsuite geprüft; „Automatisiert belegt" heißt: der Flow ist End-to-End auf +HTTP-/Service-Ebene durch grüne Tests abgedeckt — manuell bleibt die visuelle +Abnahme im Browser. Testzugänge lokal: `admin@pressekonto.test` / `password` +(Admin), `test@example.com` / `password` (Customer, Seeder). + +Empfohlene Reihenfolge: erst lokal durchklicken, dann dieselbe Liste beim +Staging-Rehearsal (R6.3) mit echtem Datenbestand wiederholen. + +## A. Login & Konto + +- [ ] **Admin-Login inkl. 2FA** — Automatisiert: `Auth/AuthenticationTest`, `Auth/TwoFactorLoginTest`. Manuell: 2FA im Portal einrichten (QR-Code scannen), abmelden, Login mit TOTP-Code und einmal mit Recovery-Code. +- [ ] **Customer-Login via Magic-Link** — Automatisiert: `Auth/MagicLinkLoginTest` (TTL 15 Min., Einmalverwendung). Manuell: Link anfordern, Mail-Optik (neues CI-Layout) prüfen, Login klappt, zweiter Klick auf denselben Link wird abgewiesen. +- [ ] **Customer-Login via Passwort + Google** — Automatisiert: `Auth/AuthenticationTest`, `Auth/GoogleLoginTest`. Manuell: Google-Round-Trip geht erst live mit echter Domain (WS-7-Checkliste). +- [ ] **Passwort-Reset-Flow** (kritisch fürs Go-Live-Mailing) — Automatisiert: `Auth/PasswordResetTest`, Mail-CI: `Mail/EmailBrandingTest`. Manuell: Reset anfordern → Mail → neues Passwort → Login. +- [ ] **Registrierung + E-Mail-Verifizierung** — Automatisiert: `Auth/RegistrationTest`, `Auth/EmailVerificationTest`. Manuell: einmal komplett durchlaufen inkl. Freischaltung. + +## B. Admin-Backend + +- [ ] **Portal-Scoping-Filter** (Presseecho-only / BP24-only / alle) — Automatisiert: `PressReleaseCompanyScopeTest`, PortalScope-Abdeckung in Admin-Tests. Manuell: Filter in PM-/Firmen-/User-Listen umschalten und Stichproben zählen. +- [ ] **PM-Workflow Admin**: Create → Draft → Publish → Mail an Autor → sichtbar im Frontend — Automatisiert: `Admin/AdminPressReleaseActionsTest`, `Admin/AdminPressReleaseSchedulingTest`, `Admin/AdminPressReleaseShowTest`. Manuell: einmal komplett, Frontend-Sichtbarkeit auf beiden Spokes prüfen. +- [ ] **Recht & Compliance-Queue** — Automatisiert: `LegalRequestTest`, `Web/ReportFormTest` (Vorgangsnummern, Eingangsbestätigung). Manuell: Meldung über /melden/rechtswidrig absenden → taucht mit M-Nummer in der Queue auf → erledigen. +- [ ] **Admin-Statuswechsel/Depublikation sichtbar** — Automatisiert: `Billing/DepublicationTest` (Tombstone 410). Manuell: depublizierte PM im Frontend aufrufen (Entfernt-Hinweis statt Inhalt). + +## C. Customer-Panel + +- [ ] **PM-Workflow Customer**: Create → Draft → Submit → Admin sieht zur Prüfung — Automatisiert: `PressReleaseBookingGateTest` (Submit-Gate), `PressReleaseQuotaTest`, `PressReleaseWithdrawalWaiverTest` (Archiv-Hinweis T2neu). Manuell: einmal komplett inkl. Submit-Modal (4 Schalter). +- [ ] **Image-Upload**: mehrere Bilder, Preview-Flag, Rechteangaben — Automatisiert: `PressReleaseImageLicenseTest`, `SyncPressReleaseImagesTest`, Api-Upload: `Api/V1/PressReleaseImageApiTest` (16 MB, jpg/png/webp). Manuell: Drag&Drop, Sortierung, Preview-Wechsel visuell. +- [ ] **Company-Logo-Upload** — Automatisiert: `SecurityHardeningTest` (ImageService, kein SVG/XSS). Manuell: Logo hochladen, Varianten in Firmenübersicht + Newsroom prüfen. +- [ ] **Blacklist blockiert Publish** — Automatisiert: `PressReleaseBlacklistTest`. Manuell: PM mit Blacklist-Wort einreichen → automatische Ablehnung mit Begründung. +- [ ] **Buchungsseite komplett**: Abo, Einzel-PM, Credits, Unternehmer-Checkbox (T1neu) — Automatisiert: `Billing/BookingsPageTest`, `Billing/CheckoutFlowTest`, `CreditTopupTest`. Manuell: Modal-Optik, USt-Aufschlüsselung, Checkbox-Zwang. + +## D. Billing & Stripe (Staging mit Stripe-Testmode) + +- [ ] **Stripe-Checkout End-to-End inkl. Webhook** — Automatisiert: `Billing/CheckoutFlowTest`, `Billing/StripeWebhookProcessingTest`, `CreditTopupTest` (Gutschrift genau einmal). Manuell auf Staging: echter Testmode-Checkout (Karte 4242…), Webhook via `stripe listen`, Buchung erscheint im Panel. +- [ ] **Rechnungen**: STR-Kreis (Stripe/Billing-Portal) + MAN-Kreis (`billing:generate-manual-invoices`) — Automatisiert: `Billing/InvoiceNumberGeneratorTest`, `Billing/ManualInvoiceGenerationTest`. Manuell: Rechnung im Stripe-Billing-Portal abrufbar. +- [ ] **Grandfathering**: Alt-Abo wird korrekt angezeigt/weiterberechnet, Bestandskunde sieht keinen Buchungs-Hinweis — Automatisiert: `Billing/GrandfatherLegacySubscriptionsTest`, `Billing/HasActiveBookingTest`, `Billing/LegacyBundleTest`. Manuell: mit echtem Grandfather-User nach dem Staging-Import (R6.3). +- [ ] **Legacy-Rechnungen im Archiv** (Admin + Customer, PDF) — Automatisiert: `Admin/AdminLegacyInvoiceArchiveTest`, `LegacyInvoiceArchiveCommandTest`. Manuell: PDF-Download eines Altbelegs. +- [ ] **Depublikations-Checkout** (35 € netto) — Automatisiert: `Billing/DepublicationTest`. Manuell auf Staging: einmal komplett bis Tombstone. + +## E. API v1 + +- [ ] **`POST /v1/press-releases` mit Sanctum-Token** — Automatisiert: `Api/V1/PressReleaseApiTest`, `PressReleaseSubmitApiTest`, `PressReleaseImageApiTest`, `CustomerDataApiTest`. Manuell: Token im Kundenkonto erzeugen (setzt aktive Buchung voraus), curl-Workflow aus der /api-Doku durchspielen. +- [ ] **Alter `api_key`-Parameter wird abgewiesen** (mit Migrationshinweis) — Automatisiert: `ApiAccessSecurityAndLoggingTest` (Middleware `RejectLegacyApiKeys`). Manuell: entfällt. +- [ ] **Rate-Limit 60/min** — Automatisiert: abgedeckt. Manuell: entfällt. + +## F. Frontend Spokes + Hub + +- [ ] **Alter `/thumbnails/...`-Link redirectet** — **Lücke am 06.07. gefunden und geschlossen** (Scope-Doku führte den Redirect fälschlich als „ANGEPASST"): `LegacyMediaRedirectController`, Tests `Web/LegacyMediaRedirectTest`. Manuell nach Staging-Import: 2–3 echte Alt-URLs aus dem Live-Portal stichprobenartig aufrufen. +- [ ] **Legacy-.html-Redirects** (Startseite, FAQ, Newsrooms, Detail-URLs) — Automatisiert: `Web/LegacyRedirectTest`. Manuell: Stichprobe mit echten Alt-URLs nach Staging-Import. +- [ ] **Kategorieseite + Veröffentlichen-Landing visuell abnehmen** (Frontend-Konzept-Doku führt sie noch als „offen", Code existiert) — Automatisiert: `Web/CategoryPageTest`, `Web/VeroeffentlichenPageTest`/`StaticPagesTest`. Manuell: visuelle Abnahme — **Achtung: Web-Frontend wird gerade umgebaut (User, 06.07.), Abnahme erst danach.** +- [ ] **Rechtsseiten auf allen drei Domains** (Impressum, AGB, Datenschutz, Richtlinien, Melden, Kündigung) — Automatisiert: `Web/StaticPagesTest`, `Web/HubStaticPageShellTest`, `Legal/LegalDocumentTest`. Manuell: Sichtprüfung Hub + beide Spokes, Links im Footer. +- [ ] **Sitemap/robots je Host** — Automatisiert: `Web/SitemapRobotsTest`. Manuell: /sitemap.xml und /robots.txt auf allen drei Hosts aufrufen. + +## G. Betrieb (Staging/Live, Ops) + +- [ ] **Scheduler greift** — Vorgeprüft 06.07.: `schedule:list` zeigt 6 Tasks (magic-links:purge, press-releases:purge-drafts, publish-scheduled, billing:generate-manual-invoices, reset-monthly-quota, market:refresh). Manuell auf Staging: Cron-Eintrag + `php artisan schedule:run` + `queue:work` laufen (Runbook WS-7). +- [ ] **KI-Queue**: PM einreichen → Worker klassifiziert, kein Stau in `jobs`/`failed_jobs` — Automatisiert: `PressReleaseClassificationJobTest`. Manuell: mit echtem `OPENAI_API_KEY` auf Staging. +- [ ] **Mail-Zustellung real** (nicht `log`), Absender/SPF/DKIM — nur Staging/Live [EXTERN]. +- [ ] **Umami**: `UMAMI_ENABLED=true` erst beim Go-Live; danach Snippet je Domain im Quelltext prüfen (`Web/UmamiSnippetTest` sichert die IDs). + +## Nicht Teil von R6.1 + +- **Import-Rehearsal** gegen produktiven Snapshot → eigener Punkt **R6.3** [EXTERN: Server/Snapshot]. +- **Newsletter Double-Opt-In End-to-End**: bewusst **vertagt** (Release-Plan „Bewusst NICHT im Plan": echte Newsletter-Sync bleibt No-Op; R0.3 macht das Binding nur ehrlich). Die API v1 legt Subscriptions unbestätigt an (`is_confirmed=false` + Token) — ein Bestätigungs-/Versandweg existiert noch nicht. Vor Aktivierung des Newsletters: DOI-Flow bauen. Kein öffentliches Anmeldeformular verlinkt → kein Launch-Blocker. +- **Frontend-Redesign-Abnahme**: Web-Frontend (Startseiten, Feeds, Kategorie) ist am 06.07. in Arbeit (User) — visuelle Abnahme + betroffene Web-Tests nach Abschluss des Umbaus. + +## Befunde der Vorprüfung 06.07. + +1. **/thumbnails-Redirect fehlte** (Scope-Doku behauptete „ANGEPASST") → gebaut + getestet (siehe F). +2. **Newsletter-DOI unvollständig** → bewusst vertagt, dokumentiert (siehe oben). +3. Alles Übrige aus §15 ist durch die grüne Suite (957 Tests) auf Funktionsebene belegt; offen ist die **visuelle bzw. operative Abnahme** im Browser und auf Staging.