Impulse AI Docs
Intern dokumentasjon
Hopp til innhold

Notification testing

Denne guiden dekker hvordan du tester notification-programmet lokalt og på staging uten at state fra forrige iterasjon forurenser neste.

Notification-programmet har flere tilstandslag som akkumulerer over tid:

LagHvorPersistert
iOS-permissionSimulator/enhetInntil app avinstalleres eller permissions resetes
user_notification_preferencesSupabasePer bruker, JSONB
notification_messagesSupabaseSiste speil-historikk, 14-dagers UI
notification_eventsSupabaseAppend-only lifecycle log
Redis rate-limitnotif:ratelimit:<userId>:<week>Ukentlig cap (max 3/uke)
silence_untilSupabase7-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-tier

Eller direkte fra shell

heading.anchorLabel
Terminal window
./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>:* │
└──────────────────────────────────────────────────┘

Endpointen POST /api/v1/notifications/dev/reset returnerer 403 Forbidden med mindre begge er sanne:

  • DEV_API_TOKEN er satt i env
  • NODE_ENV !== 'production'

Produksjon kan aldri bli reset gjennom dette endepunktet.

Typisk test-iterasjon

heading.anchorLabel
Terminal window
# 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 1

Kjente quirks

heading.anchorLabel

iOS Simulator APNS-tokens feiler validering

heading.anchorLabel

Simulator 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.anchorLabel

Hvis 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.

Staging er en delt ressurs — bruk im:notif-reset --staging forsiktig. Ikke kjør under samtidig testing av teammedlemmer.

Terminal window
API_URL=https://api-stg.impulseai.app ./scripts/reset-notifications-test.sh mastery

Dev-token er også satt i staging-config (Doppler stg), så endepunktet svarer der også. Produksjon = 403.

Relaterte filer

heading.anchorLabel