LEG App Logo
LEG App

Multi-Channel Smoke Tests (WhatsApp + Threema)

Dieses Runbook prueft die neue Multi-Channel-Integration in leg-app von Ende zu Ende. Ziel ist ein schneller Funktionstest fuer Entwicklung und Staging.

Voraussetzungen

  • Migrationen sind ausgefuehrt:
    • php artisan migrate
  • Queue-Worker laeuft (oder Horizon):
    • php artisan queue:work --queue=default,emails,whatsapp,threema
  • API-Credentials in .env sind gesetzt:
    • WhatsApp: WHATSAPP_*
    • Threema: THREEMA_*

1) Pennant-Flags aktivieren

Im Admin unter admin/features:

  • messaging.whatsapp
  • messaging.whatsapp.inbound
  • messaging.whatsapp.outbound
  • messaging.threema
  • messaging.threema.inbound
  • messaging.threema.outbound
  • onboarding.chatbot.whatsapp
  • onboarding.chatbot.threema

Optional fuer kontrollierten Rollout:

  • Nur Outbound aktivieren und Inbound deaktiviert lassen.
  • Pro Kanal getrennt aktivieren.

2) WhatsApp Webhook Verify testen

Erwartung: Challenge wird bei korrektem Verify-Token als Plain-Text zurueckgegeben.

Beispiel:

curl -i "https://<deine-domain>/webhooks/whatsapp/verify?hub_mode=subscribe&hub_verify_token=<WHATSAPP_VERIFY_TOKEN>&hub_challenge=abc123"

Soll: 200 und Body abc123.

3) WhatsApp Inbound/Event testen

Erwartung:

  • Eintrag in channel_webhook_events
  • Inbound in channel_inbound_messages
  • Session in channel_onboarding_sessions

Beispiel:

curl -X POST "https://<deine-domain>/webhooks/whatsapp/events" \ -H "Content-Type: application/json" \ -d '{ "entry":[{"changes":[{"value":{ "messages":[{"id":"wamid.test.1","from":"41791112233","text":{"body":"START"}}] }}]}] }'

DB-Schnellcheck:

php artisan tinker --execute=" echo \App\Models\ChannelWebhookEvent::query()->where('channel','whatsapp')->count().PHP_EOL; echo \App\Models\ChannelInboundMessage::query()->where('channel','whatsapp')->count().PHP_EOL; echo \App\Models\ChannelOnboardingSession::query()->where('channel','whatsapp')->count().PHP_EOL; "

4) Threema Inbound/Event testen

Erwartung:

  • Webhook-Token wird geprueft (X-Webhook-Token)
  • Event + Inbound + Onboarding-Session werden gespeichert

Beispiel:

curl -X POST "https://<deine-domain>/webhooks/threema/events" \ -H "Content-Type: application/json" \ -H "X-Webhook-Token: <THREEMA_WEBHOOK_TOKEN>" \ -d '{ "type":"inbound.message", "messageId":"th-msg-001", "from":"ABCD1234", "text":"START", "nickname":"Test User" }'

5) Chatbot-Onboarding testen (beide Kanaele)

Sende nacheinander:

  1. START
  2. JA
  3. Max Muster
  4. 4410
  5. Hauptstrasse 1 Basel
  6. 1
  7. JA

Erwartung:

  • Session-Status wird onboarding_completed
  • InterestedPerson wird angelegt/aktualisiert
  • Review-Task wird erstellt

DB-Pruefung:

php artisan tinker --execute=" $s=\App\Models\ChannelOnboardingSession::query()->latest('id')->first(); dump($s?->channel, $s?->state, $s?->review_status, $s?->address_verification_status); "

6) Admin-Task-Integration pruefen

Erwartung:

  • In admin/tasks existiert ein Task mit task_type=channel_onboarding_review
  • Statusmapping:
    • fachlich approved/merged_duplicate -> Task done
    • fachlich rejected -> Task dismissed

7) Notification-Pilot pruefen

Pilot ist auf InterestSubmissionReminder angebunden.

Erwartung:

  • Wenn routeNotificationForMessaging() Daten liefert und Kanal-Flags aktiv sind:
    • Outbound in channel_message_logs mit channel=whatsapp oder channel=threema
  • Wenn Kanal deaktiviert:
    • kein neuer Send fuer diesen Kanal

8) Regression/Automated Checks

Empfohlene Tests:

php artisan test tests/Feature/Webhooks/WhatsAppWebhookTest.php php artisan test tests/Feature/Webhooks/ThreemaWebhookTest.php php artisan test tests/Unit/Services/MessagingChannelRouterTest.php

Formatierung:

vendor/bin/pint --dirty

9) Schnell-Rollback

  • Flags deaktivieren:
    • messaging.whatsapp.outbound=false
    • messaging.threema.outbound=false
  • Optional Inbound aktiv lassen fuer kontrolliertes Monitoring.
  • Fallback bleibt E-Mail.

Erwartete Kernartefakte nach erfolgreichem Smoke-Test

  • channel_webhook_events enthaelt Inbound/Status-Events je Kanal
  • channel_inbound_messages enthaelt eingehende Nachrichten
  • channel_onboarding_sessions enthaelt laufende/abgeschlossene Flows
  • channel_message_logs enthaelt Outbound-Lifecycle
  • users_tasks enthaelt channel_onboarding_review fuer Admin-Review