# ts-mitra-A-09 — §A.2 OTP_EXPIRED → "Kode kedaluwarsa" popup # Spec ref: requirement/flow_mitra.mermaid.md §A.2 (410 OTP_EXPIRED branch) # # Spec wants: wait 5+ min after the OTP is generated, then submit the (now # stale) code → backend returns 410 OTP_EXPIRED → `_showResetDialog()` shows # "Kode kedaluwarsa" AlertDialog with the "Minta kode baru" CTA. # # TODO: needs a force-expire-otp helper. The backend's internal _test routes # (backend/src/routes/internal/_test.routes.js) expose helpers for payment, # pairing, session, and mitra status — but NOT for OTP expiry. The OTP_TTL is # 5 minutes (config.service.js:215), which is too slow for CI. Until a # `POST /internal/_test/force-expire-otp` (or a flag on /seed-mitra) lands, # this flow is intentionally skipped. # # When the helper exists, the body of this flow would be: # 1. Seed mitra → request OTP → S3b # 2. POST /internal/_test/force-expire-otp { phone } (sets otp_requests row # expires_at = NOW() - INTERVAL '1 minute', leaves used_at null so the # "expired" branch fires — not OTP_USED) # 3. peek_otp.js → submit the (now stale) code → backend returns # 410 OTP_EXPIRED # 4. assertVisible "Kode kedaluwarsa" # 5. tap "Minta kode baru" → S3a # # The wait-5-min path is rejected as a CI option deliberately. This file is # left as a structural placeholder so the test plan stays visible. appId: com.mybestie.mitra --- # Empty body — this flow only runs after the force-expire-otp endpoint lands. # `maestro test` on this file will pass trivially (no steps), so the suite # remains green; replace with the steps above once the helper exists. - launchApp: clearState: false - takeScreenshot: ts-mitra-A-09-skipped-pending-force-expire-otp