# 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