QA Report — visaready SIT · https://visaready-sit.winds-os.com · run 20260711162058

58cases
58passed
0failed
8/8auth
3/3masters
6/6validation
9/9scoring
5/5crud
4/4documents
7/7payment
3/3rbac
2/2integrations
3/3profile
8/8ui

All green — no bugs this run ✅

Cases

TC-A01 OTP request succeeds for a new email with a resend timer auth · api · VR-4.2 · 42ms
  1. POST /api/auth/request-otp
TC-A02 Correct OTP signs the user in and creates a customer account auth · api · VR-4.2 · 39ms
  1. POST /api/auth/request-otp
  2. POST /api/auth/verify-otp
TC-A03 Wrong OTP is rejected auth · api · VR-4.2 · 25ms
  1. POST /api/auth/request-otp
  2. POST /api/auth/verify-otp
TC-A04 OTP verify without a prior request is rejected as expired auth · api · VR-4.2 · 9ms
  1. POST /api/auth/verify-otp
TC-A05 Empty identifier is rejected with a helpful message auth · api · VR-4.2 · 6ms
  1. POST /api/auth/request-otp
TC-A06 Session token identifies the signed-in customer on /auth/me auth · api · VR-4.2 · 27ms
  1. GET /api/auth/me
TC-A07 Protected APIs refuse anonymous access auth · api · VR-4.2 · 3ms
  1. GET /api/application
TC-A08 Mobile-number OTP login is enabled auth · api · VR-4.2 · 9ms
  1. POST /api/auth/request-otp
TC-M01 Country master is seeded and searchable masters · api · · 32ms
  1. GET /api/country?page=1&limit=100
  2. GET /api/country?q=India
  3. GET /api/country?q=France
TC-M02 Plans master is seeded (Lite / Starter / Advance …) masters · api · VR-4.15 · 19ms
  1. GET /api/plan?page=1&limit=50
  2. GET /api/plan?q=Starter
TC-M03 Document checklist master is seeded masters · api · VR-4.14 · 8ms
  1. GET /api/doc_requirement?page=1&limit=100
TC-V01 Passport number format is enforced (8–9 uppercase alphanumerics) validation · api · VR-4.7 · 6ms
  1. POST /api/application
TC-V02 PIN code must be 6 digits validation · api · VR-4.9 · 4ms
  1. POST /api/application
TC-V03 Travel end date cannot be before the start date (cross-field) validation · api · VR-4.8 · 3ms
  1. POST /api/application
TC-V04 Required fields are enforced on application create validation · api · VR-4.9 · 15ms
  1. POST /api/application
TC-V05 GSTIN format is validated when provided validation · api · VR-4.9 · 6ms
  1. POST /api/application
TC-V06 Passport expiry must be after the issue date (cross-field) validation · api · VR-4.7 · 4ms
  1. POST /api/application
TC-S01 Customer can create a complete application (draft) scoring · api · VR-4.7 · 21ms
  1. POST /api/application
TC-S02 VisaScore Lite — strong profile scores High (≥85) scoring · api · VR-4.13 · 48ms
  1. POST /api/flows/generate_lite_score/run
  2. GET /api/application/14
TC-S03 Scoring is blocked until the return declaration is confirmed scoring · api · VR-4.12 · 21ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
TC-S04 VisaScore Lite — weak profile lands in the Low band (≤30) scoring · api · VR-4.13 · 76ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. GET /api/application/16
TC-S05 Final VisaScore — full lifecycle to Strong Readiness with VisaMatrix report scoring · api · VR-4.16 · 172ms
  1. POST /api/application/14/transition
  2. POST /api/application/14/transition
  3. POST /api/flows/generate_final_score/run
  4. GET /api/application/14
TC-S06 One free score regeneration is allowed scoring · api · VR-5.3 · 79ms
  1. POST /api/flows/regenerate_score/run
  2. GET /api/application/14
TC-S07 A second regeneration is refused (2 scores total) scoring · api · VR-5.3 · 11ms
  1. POST /api/flows/regenerate_score/run
TC-S08 Every final score writes a VisaMatrix report record scoring · api · VR-4.16 · 11ms
  1. GET /api/visa_report?page=1&limit=50
TC-S09 Lifecycle-button path also produces the Lite score (transition + async flow) scoring · api · VR-4.13 · 107ms
  1. POST /api/application
  2. POST /api/application/17/transition
  3. GET /api/application/17
TC-C01 Applications are searchable by title crud · api · · 17ms
  1. GET /api/application?q=QA%20Strong%2020260711162058
TC-C02 List pagination respects the limit crud · api · · 20ms
  1. GET /api/application?page=1&limit=2
TC-C03 Application fields can be updated (PATCH) crud · api · · 48ms
  1. PATCH /api/application/14
  2. GET /api/application/14
TC-C04 Deleting an application removes it from lists (soft delete) crud · api · · 66ms
  1. POST /api/application
  2. DELETE /api/application/18
  3. GET /api/application?q=QAScratch20260711162058
TC-C05 Fetching a non-existent application returns 404 crud · api · · 9ms
  1. GET /api/application/999999
TC-D01 Customer can attach a document to their application documents · api · VR-4.14 · 29ms
  1. POST /api/document
TC-D02 Document can be verified (uploaded → verified) documents · api · VR-4.14 · 34ms
  1. POST /api/document/8/transition
  2. GET /api/document/8
TC-D03 Admin can flag a document documents · api · VR-4.14 · 61ms
  1. POST /api/document
  2. PATCH /api/document/9
  3. POST /api/document/9/transition
  4. GET /api/document/9
TC-D04 Customer cannot flag documents (admin-only transition) documents · api · VR-4.14 · 20ms
  1. POST /api/document
  2. POST /api/document/10/transition
TC-P01 Admin can register an agency payment · api · VR-4.5 · 13ms
  1. POST /api/agency
TC-P02 Admin approves the agency (KYC → active) payment · api · VR-4.5 · 14ms
  1. POST /api/agency/6/transition
TC-P03 Admin issues a promo code allocated to the agency payment · api · VR-4.15 · 10ms
  1. POST /api/promo_code
TC-P04 Valid promo waives the fee and issues an invoice payment · api · VR-4.15 · 91ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
  3. GET /api/payment/8
TC-P05 Unknown promo code is rejected with guidance payment · api · VR-4.15 · 18ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
TC-P06 Applying promo without a code tells the user to enter one payment · api · VR-4.15 · 15ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
TC-P07 Successful payment triggers automatic invoice issuance payment · api · VR-4.15 · 1036ms
  1. POST /api/payment/10/transition
  2. GET /api/payment/10
TC-R01 Customer cannot approve agencies (admin-only lifecycle) rbac · api · VR-4.5 · 34ms
  1. POST /api/agency
  2. POST /api/agency/7/transition
TC-R02 Flows cannot be triggered anonymously rbac · api · · 3ms
  1. POST /api/flows/generate_final_score/run
TC-R03 SIT header-auth backdoor works for admin (must be OFF outside SIT) rbac · api · · 1ms
  1. GET /api/auth/me
TC-I01 Signed-in users can upload files (storage slot → R2) integrations · api · · 217ms
  1. POST /api/upload
TC-I02 Anonymous users cannot upload files integrations · api · · 6ms
  1. POST /api/upload
TC-F01 Customer can create their applicant profile profile · api · VR-4.6 · 18ms
  1. POST /api/applicant_profile
TC-F02 Duplicate profile email is rejected cleanly (unique) profile · api · VR-4.6 · 8ms
  1. POST /api/applicant_profile
TC-F03 First name must be at least 2 characters profile · api · VR-4.6 · 5ms
  1. POST /api/applicant_profile
TC-U01 Email OTP login lands on the personalised dashboard ui · ui · VR-4.2 · 3111ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. screenshot: "home"
📷 TC-U01-home.png
TC-U02 Wrong OTP shows an inline error ui · ui · VR-4.2 · 2905ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.ui2.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "9999"}
  6. tap: "Verify & sign in"
  7. expect_text: "Incorrect code"
  8. screenshot: "wrong-otp"
console: error: Failed to load resource: the server responded with a status of 401 (Unauthorized)
📷 TC-U02-wrong-otp.png
TC-U03 Dashboard shows score card, journeys, recent apps and explore links ui · ui · VR-2.2 · 2866ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. expect_text: "Visa Readiness"
  9. expect_text: "Get started"
  10. expect_text: "Visa Application (6 Steps + Score)"
  11. expect_text: "Start New Application"
  12. expect_text: "Explore"
  13. expect_text: "Indicative (Lite) result"
  14. screenshot: "dashboard"
📷 TC-U03-dashboard.png
TC-U04 Profile tab opens the applicant profile form ui · ui · VR-4.6 · 3487ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. tap: "Profile"
  9. expect_text: "Passport Number"
  10. screenshot: "profile"
📷 TC-U04-profile.png
TC-U05 Customer does not see admin/agent-only navigation ui · ui · · 5724ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. expect_not_text: "Leads"
  9. expect_not_text: "Administration"
TC-U06 Guided journey opens at Step 1 with the passport form ui · ui · VR-2.2 · 3402ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. tap: "Visa Application (6 Steps + Score)"
  9. expect_text: "Step 1 of 7"
  10. fill: {"placeholder": "Passport Number", "value": "M7654321"}
  11. screenshot: "wizard-step1"
📷 TC-U06-wizard-step1.png
TC-U07 Explore links include the Terms & Consent page ui · ui · VR-4.4 · 2576ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. expect_text: "Terms of Use, Consent & Disclaimer"
TC-U08 Library tab renders without errors ui · ui · · 4818ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711162058@visaready.test"}
  3. tap: "Send code"
  4. expect_text: "Enter the 4-digit code"
  5. fill: {"nth": 0, "value": "1234"}
  6. tap: "Verify & sign in"
  7. expect_text: "Hi there"
  8. tap: "Library"
  9. wait: 1500
  10. screenshot: "library"
📷 TC-U08-library.png

Generated by spec-studio QA runner — deterministic execution, AI only authors the test pack.