Mitra §A: pre-home (S3a/S3b/AccountInactive) + design system + Bestie Home
- Port halo_tokens + halo_theme + HaloButton to mitra_app (rose palette, Bricolage display, Poppins body, JetBrainsMono). - Build S3a Input WhatsApp (figma-bestie BestieS3 first half) with +62 chip, leading-zero/62 normalization, allow '+' in input. - Build S3b OTP verification (6-digit, 60s resend timer, attempts hint, Focus(canRequestFocus:false) for maestro inputText compat) with full error branching (CODE_MISMATCH, OTP_EXPIRED, OTP_USED, ATTEMPTS_EXCEEDED, WRONG_FLOW, ACCOUNT_INACTIVE). - Add AccountInactive terminal screen for is_active=false mitras. - Typed MitraAuthError with Indonesian-first localized messages + retryAfterSeconds passthrough. - Rebuild home_screen.dart to match figma BestieHome (greeting + status card + Ganti Status CTA + Pengingat + 2-tile dark grid). - Backend: POST /internal/_test/seed-mitra (idempotent) and PATCH /internal/mitras/:id (display_name update). - Control center: inline Edit Nama on mitras row + expandable inline log table under clicked mitra (vs old below-table panel). - 5 maestro flows ts-mitra-A-01/03/04/05/06 covering invalid input, happy path, account inactive, phone-format normalization, and the back-to-S3a regression. All green. Plan + memory documented in: - requirement/phase4-mitra-prehome-plan.md - requirement/flow_mitra.md / flow_mitra.mermaid.md §A Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# ts-mitra-A-01 — §A.1 phone-input validation gates the CTA
|
||||
# Spec ref: requirement/flow_mitra.mermaid.md §A.1
|
||||
#
|
||||
# The local CTA gate (subscriberDigits.length >= 9) prevents short phones
|
||||
# from even reaching the backend — this test verifies the client-side
|
||||
# guard: "12345" leaves the button disabled, "8123456789" enables it.
|
||||
#
|
||||
# (The PHONE_INVALID server-side path is unreachable from the UI today
|
||||
# because the local gate is stricter than the backend regex. Kept as
|
||||
# defensive code in login_screen.dart's auth listener; not test-driven.)
|
||||
appId: com.mybestie.mitra
|
||||
env:
|
||||
TEST_PHONE: "+628222222222"
|
||||
BACKEND_INTERNAL_URL: http://localhost:3001
|
||||
---
|
||||
# Reset rate-limit history for the test phone so the kirim-kode tap below
|
||||
# never trips OTP_COOLDOWN / OTP_RATE_LIMIT_PHONE leftover from prior runs.
|
||||
- runScript:
|
||||
file: ../scripts/reset_phone.js
|
||||
env:
|
||||
TEST_PHONE: ${TEST_PHONE}
|
||||
BACKEND_INTERNAL_URL: ${BACKEND_INTERNAL_URL}
|
||||
|
||||
- launchApp:
|
||||
clearState: true
|
||||
- extendedWaitUntil:
|
||||
visible:
|
||||
text: "(?s).*Halo Mitra Bestie.*"
|
||||
timeout: 10000
|
||||
|
||||
# Short phone — 5 digits — CTA should remain disabled.
|
||||
- tapOn:
|
||||
point: "60%, 47%"
|
||||
- inputText: "12345"
|
||||
- assertVisible: "(?s).*kirim kode.*"
|
||||
|
||||
# Tapping the disabled CTA should NOT navigate forward.
|
||||
- tapOn: "(?s).*kirim kode.*"
|
||||
# Brief idle; if the CTA were active the screen would push to /otp.
|
||||
- assertNotVisible: "Masukkan OTP"
|
||||
- assertNotVisible: "(?s).*masukin 6 digit kode.*"
|
||||
|
||||
# Erase, type a valid 10-digit subscriber → CTA enables and pushes to S3b.
|
||||
- eraseText
|
||||
- inputText: "8222222222"
|
||||
- tapOn: "(?s).*kirim kode.*"
|
||||
- extendedWaitUntil:
|
||||
visible:
|
||||
text: "(?s).*masukin 6 digit kode.*"
|
||||
timeout: 10000
|
||||
Reference in New Issue
Block a user