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
.envsind gesetzt:- WhatsApp:
WHATSAPP_* - Threema:
THREEMA_*
- WhatsApp:
1) Pennant-Flags aktivieren
Im Admin unter admin/features:
messaging.whatsappmessaging.whatsapp.inboundmessaging.whatsapp.outboundmessaging.threemamessaging.threema.inboundmessaging.threema.outboundonboarding.chatbot.whatsapponboarding.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:
STARTJAMax Muster4410Hauptstrasse 1 Basel1JA
Erwartung:
- Session-Status wird
onboarding_completed InterestedPersonwird 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/tasksexistiert ein Task mittask_type=channel_onboarding_review - Statusmapping:
- fachlich
approved/merged_duplicate-> Taskdone - fachlich
rejected-> Taskdismissed
- fachlich
7) Notification-Pilot pruefen
Pilot ist auf InterestSubmissionReminder angebunden.
Erwartung:
- Wenn
routeNotificationForMessaging()Daten liefert und Kanal-Flags aktiv sind:- Outbound in
channel_message_logsmitchannel=whatsappoderchannel=threema
- Outbound in
- 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=falsemessaging.threema.outbound=false
- Optional Inbound aktiv lassen fuer kontrolliertes Monitoring.
- Fallback bleibt E-Mail.
Erwartete Kernartefakte nach erfolgreichem Smoke-Test
channel_webhook_eventsenthaelt Inbound/Status-Events je Kanalchannel_inbound_messagesenthaelt eingehende Nachrichtenchannel_onboarding_sessionsenthaelt laufende/abgeschlossene Flowschannel_message_logsenthaelt Outbound-Lifecycleusers_tasksenthaeltchannel_onboarding_reviewfuer Admin-Review