Notification testing
Denne guiden dekker hvordan du tester notification-programmet lokalt og på staging uten at state fra forrige iterasjon forurenser neste.
Problem
heading.anchorLabelNotification-programmet har flere tilstandslag som akkumulerer over tid:
| Lag | Hvor | Persistert |
|---|---|---|
| iOS-permission | Simulator/enhet | Inntil app avinstalleres eller permissions resetes |
user_notification_preferences | Supabase | Per bruker, JSONB |
notification_messages | Supabase | Siste speil-historikk, 14-dagers UI |
notification_events | Supabase | Append-only lifecycle log |
| Redis rate-limit | notif:ratelimit:<userId>:<week> | Ukentlig cap (max 3/uke) |
silence_until | Supabase | 7-dagers pause |
Uten en reset-strategi må du enten:
- Kjøre
db:reset(dyrt, sletter alt) - Manuelt slette rader og reinstallere app
- Bytte test-bruker (ikke nok; iOS-state er per-bundle, ikke per-bruker)
Løsning: im:notif-reset-skill
heading.anchorLabelÉn kommando rydder alt for én dev-bruker, uten å røre andre brukere eller data.
Kjør fra Claude Code
heading.anchorLabel/im:notif-reset # mastery (default)/im:notif-reset trial # trial-tier/im:notif-reset foundation # foundation-tierEller direkte fra shell
heading.anchorLabel./scripts/reset-notifications-test.sh [tier]
# Mot staging:API_URL=https://api-stg.impulseai.app ./scripts/reset-notifications-test.sh [tier]Hva skjer under panseret
heading.anchorLabel┌──────────────────────────────────────────────────┐│ 1. xcrun simctl privacy <booted-sim> ││ reset notifications com.digiteers.impulseai ││ → iOS-permission: .notDetermined │├──────────────────────────────────────────────────┤│ 2. POST /api/v1/notifications/dev/reset ││ header: X-Dev-Token, X-Dev-User-Tier ││ → DELETE user_notification_preferences ││ → DELETE notification_messages ││ → DELETE notification_events ││ → redis.del notif:ratelimit:<userId>:* │└──────────────────────────────────────────────────┘Sikkerhet
heading.anchorLabelEndpointen POST /api/v1/notifications/dev/reset returnerer 403 Forbidden med mindre begge er sanne:
DEV_API_TOKENer satt i envNODE_ENV !== 'production'
Produksjon kan aldri bli reset gjennom dette endepunktet.
Typisk test-iterasjon
heading.anchorLabel# 1. Ren start-state/im:notif-reset
# 2. Relaunch app (SweetPad eller Xcode)
# 3. Verifiser i appen:# Profile → Varsler# → Alle tre produkter skal vise "Off"# → "Turn on all mirrors" synlig
# 4. Tapp "Turn on all mirrors"# → iOS permission-dialog skal vises (første gang)# → Grant: alle tre skifter til "On"# → Decline: alert med "Åpne innstillinger"
# 5. Observer SweetPad-loggene:# [NotifSettings] Master CTA tapped# [NotifSettings] ensurePermission returned 2 (authorized)# [NotifSettings] Toggling impulseReminders on# [NotifSettings] Toggling weekStart on# [NotifSettings] Toggling weekEnd on# [NotificationService] APNS token: bytes=32 hexLen=64 prefix=...
# 6. For neste iterasjon: gjenta fra trinn 1Kjente quirks
heading.anchorLabeliOS Simulator APNS-tokens feiler validering
heading.anchorLabelSimulator registrerer for APNS men returnerer ofte en token som ikke er 64 hex-tegn. Vi fanger dette i NotificationService.swift:
guard hexToken.count == 64 else { AppLogger.warning("NotificationService", "Skipping APNS register: token is N chars...") return}Resultat: på simulator blir ios_permission_status værende .not_asked server-side selv om iOS-siden har grantet. Dette er forventet — simulator mottar ikke ekte push uansett.
For å teste faktisk APNS-sending: bruk fysisk enhet (TestFlight-bygg) eller xcrun simctl push med lokal .apns-fil.
simctl privacy reset failed-advarsel
heading.anchorLabelHvis skriptet viser ⚠ simctl privacy reset failed (app may not be installed yet), er det typisk harmløst — apple-verktøyet rapporterer falske positiver. Trinn 2 (backend) kjører uansett.
Hvis du virkelig trenger å resette iOS permissions: Settings → General → Transfer or Reset iPhone → Reset → Reset Location & Privacy i simulatoren.
Mot staging
heading.anchorLabelStaging er en delt ressurs — bruk im:notif-reset --staging forsiktig. Ikke kjør under samtidig testing av teammedlemmer.
API_URL=https://api-stg.impulseai.app ./scripts/reset-notifications-test.sh masteryDev-token er også satt i staging-config (Doppler stg), så endepunktet svarer der også. Produksjon = 403.