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

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

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 · 55ms
  1. POST /api/auth/request-otp
TC-A02 Correct OTP signs the user in and creates a customer account auth · api · VR-4.2 · 25ms
  1. POST /api/auth/request-otp
  2. POST /api/auth/verify-otp
TC-A03 Wrong OTP is rejected auth · api · VR-4.2 · 19ms
  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 · 8ms
  1. POST /api/auth/verify-otp
TC-A05 Empty identifier is rejected with a helpful message auth · api · VR-4.2 · 2ms
  1. POST /api/auth/request-otp
TC-A06 Session token identifies the signed-in customer on /auth/me auth · api · VR-4.2 · 23ms
  1. GET /api/auth/me
TC-A07 Protected APIs refuse anonymous access auth · api · VR-4.2 · 2ms
  1. GET /api/application
TC-A08 Mobile-number OTP login is enabled auth · api · VR-4.2 · 6ms
  1. POST /api/auth/request-otp
TC-M01 Country master is seeded and searchable masters · api · · 29ms
  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 · 18ms
  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 · 9ms
  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 · 7ms
  1. POST /api/application
TC-V02 PIN code must be 6 digits validation · api · VR-4.9 · 5ms
  1. POST /api/application
TC-V03 Travel end date cannot be before the start date (cross-field) validation · api · VR-4.8 · 5ms
  1. POST /api/application
TC-V04 Required fields are enforced on application create validation · api · VR-4.9 · 3ms
  1. POST /api/application
TC-V05 GSTIN format is validated when provided validation · api · VR-4.9 · 14ms
  1. POST /api/application
TC-V06 Passport expiry must be after the issue date (cross-field) validation · api · VR-4.7 · 6ms
  1. POST /api/application
TC-S01 Customer can create a complete application (draft) scoring · api · VR-4.7 · 20ms
  1. POST /api/application
TC-S02 VisaScore Lite — strong profile scores High (≥85) scoring · api · VR-4.13 · 46ms
  1. POST /api/flows/generate_lite_score/run
  2. GET /api/application/60
TC-S03 Scoring is blocked until the return declaration is confirmed scoring · api · VR-4.12 · 33ms
  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 · 71ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. GET /api/application/62
TC-S05 Final VisaScore — full lifecycle to Strong Readiness with VisaMatrix report scoring · api · VR-4.16 · 129ms
  1. POST /api/application/60/transition
  2. POST /api/application/60/transition
  3. POST /api/flows/generate_final_score/run
  4. GET /api/application/60
TC-S06 One free score regeneration is allowed scoring · api · VR-5.3 · 65ms
  1. POST /api/flows/regenerate_score/run
  2. GET /api/application/60
TC-S07 A second regeneration is refused (2 scores total) scoring · api · VR-5.3 · 7ms
  1. POST /api/flows/regenerate_score/run
TC-S08 Every final score writes a VisaMatrix report record scoring · api · VR-4.16 · 10ms
  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 · 105ms
  1. POST /api/application
  2. POST /api/application/63/transition
  3. GET /api/application/63
TC-C01 Applications are searchable by title crud · api · · 9ms
  1. GET /api/application?q=QA%20Strong%2020260711180241
TC-C02 List pagination respects the limit crud · api · · 9ms
  1. GET /api/application?page=1&limit=2
TC-C03 Application fields can be updated (PATCH) crud · api · · 38ms
  1. PATCH /api/application/60
  2. GET /api/application/60
TC-C04 Deleting an application removes it from lists (soft delete) crud · api · · 48ms
  1. POST /api/application
  2. DELETE /api/application/64
  3. GET /api/application?q=QAScratch20260711180241
TC-C05 Fetching a non-existent application returns 404 crud · api · · 6ms
  1. GET /api/application/999999
TC-D01 Customer can attach a document to their application documents · api · VR-4.14 · 14ms
  1. POST /api/document
TC-D02 Document can be verified (uploaded → verified) documents · api · VR-4.14 · 16ms
  1. POST /api/document/32/transition
  2. GET /api/document/32
TC-D03 Admin can flag a document documents · api · VR-4.14 · 46ms
  1. POST /api/document
  2. PATCH /api/document/33
  3. POST /api/document/33/transition
  4. GET /api/document/33
TC-D04 Customer cannot flag documents (admin-only transition) documents · api · VR-4.14 · 17ms
  1. POST /api/document
  2. POST /api/document/34/transition
TC-P01 Admin can register an agency payment · api · VR-4.5 · 12ms
  1. POST /api/agency
TC-P02 Admin approves the agency (KYC → active) payment · api · VR-4.5 · 13ms
  1. POST /api/agency/16/transition
TC-P03 Admin issues a promo code allocated to the agency payment · api · VR-4.15 · 11ms
  1. POST /api/promo_code
TC-P04 Valid promo waives the fee and issues an invoice payment · api · VR-4.15 · 72ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
  3. GET /api/payment/47
TC-P05 Unknown promo code is rejected with guidance payment · api · VR-4.15 · 17ms
  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 · 20ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
TC-P07 Successful payment triggers automatic invoice issuance payment · api · VR-4.15 · 1027ms
  1. POST /api/payment/49/transition
  2. GET /api/payment/49
TC-R01 Customer cannot approve agencies (admin-only lifecycle) rbac · api · VR-4.5 · 13ms
  1. POST /api/agency
  2. POST /api/agency/17/transition
TC-R02 Flows cannot be triggered anonymously rbac · api · · 1ms
  1. POST /api/flows/generate_final_score/run
TC-R03 SIT header-auth backdoor works for admin (must be OFF outside SIT) rbac · api · · 2ms
  1. GET /api/auth/me
TC-I01 Signed-in users can upload files (storage slot → R2) integrations · api · · 149ms
  1. POST /api/upload
TC-I02 Anonymous users cannot upload files integrations · api · · 2ms
  1. POST /api/upload
TC-F01 Customer can create their applicant profile profile · api · VR-4.6 · 10ms
  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 · 4ms
  1. POST /api/applicant_profile
TC-W01 Workflow: full customer journey draft → lite → docs → paid → final → embassy → approved workflow · api · VR-2.2 · 327ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/document
  4. POST /api/document
  5. POST /api/document/35/transition
  6. POST /api/document/36/transition
  7. POST /api/application/65/transition
  8. POST /api/application/65/transition
  9. POST /api/flows/generate_final_score/run
  10. GET /api/application/65
  11. POST /api/application/65/transition
  12. PATCH /api/application/65
  13. POST /api/application/65/transition
  14. GET /api/application/65
TC-W02 Workflow: rejection path ends in terminal rejected status workflow · api · VR-4.17 · 190ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/66/transition
  4. POST /api/application/66/transition
  5. POST /api/flows/generate_final_score/run
  6. POST /api/application/66/transition
  7. POST /api/application/66/transition
  8. GET /api/application/66
TC-W03 Workflow: customer submits to agent, agent forwards to embassy (role interplay) workflow · api · VR-4.5 · 223ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/67/transition
  4. POST /api/application/67/transition
  5. POST /api/flows/generate_final_score/run
  6. POST /api/application/67/transition
  7. POST /api/application/67/transition
  8. GET /api/application/67
TC-W04 Workflow: agency code is validated — valid code maps, unknown code errors workflow · api · VR-4.13 · 92ms
  1. PATCH /api/application/67
  2. POST /api/flows/map_agency_code/run
  3. PATCH /api/application/67
  4. POST /api/flows/map_agency_code/run
TC-W05 Workflow: multi-applicant — co-applicant attaches to the application workflow · api · VR-4.7a · 55ms
  1. PATCH /api/application/65
  2. POST /api/co_applicant
  3. GET /api/co_applicant?filter[application]=65
TC-W06 Workflow: failed payment can be retried and still issues an invoice workflow · api · VR-4.15 · 1062ms
  1. POST /api/payment
  2. POST /api/payment/50/transition
  3. POST /api/payment/50/transition
  4. GET /api/payment/50
TC-W07 Workflow: promo redemption increments its usage counter workflow · api · VR-4.15 · 5ms
  1. GET /api/promo_code/25
TC-W08 Workflow: expired promo code is refused workflow · api · VR-4.15 · 37ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
TC-W09 Workflow: promo code not yet in its validity window is refused workflow · api · VR-4.15 · 42ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
TC-W10 Workflow: deactivated promo code is refused workflow · api · VR-4.15 · 39ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
TC-W11 Workflow: single-use promo is exhausted after one redemption (usage cap) workflow · api · VR-4.15 · 150ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
  4. GET /api/payment/54
  5. GET /api/promo_code/29
  6. POST /api/payment
  7. POST /api/flows/apply_promo/run
TC-W12 Workflow: improving the profile and regenerating raises the final score workflow · api · VR-5.3 · 319ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/68/transition
  4. POST /api/application/68/transition
  5. POST /api/flows/generate_final_score/run
  6. GET /api/application/68
  7. PATCH /api/application/68
  8. POST /api/flows/regenerate_score/run
  9. GET /api/application/68
TC-W13 Workflow: flagged document — customer cannot clear the flag, agent can workflow · api · VR-4.14 · 22ms
  1. POST /api/document/33/transition
  2. POST /api/document/33/transition
  3. GET /api/document/33
TC-W14 Workflow: admin analytics reports run and group correctly workflow · api · VR-5.x · 9ms
  1. GET /api/reports
  2. GET /api/reports/applications_by_band
TC-W15 Workflow: uploaded document gets OCR-scanned into ocr_summary (vision model) workflow · api · VR-4.14 · 3184ms
  1. POST /api/upload
  2. POST /api/document
  3. POST /api/document/37/transition
  4. GET /api/document/37
TC-U01 Email OTP login lands on the personalised dashboard ui · ui · VR-4.2 · 2837ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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 · 2748ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.ui2.20260711180241@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 · 2839ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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: "Verified score"
  14. screenshot: "dashboard"
📷 TC-U03-dashboard.png
TC-U04 Profile tab opens the applicant profile form ui · ui · VR-4.6 · 3577ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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 · · 5702ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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 · 3466ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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 · 2615ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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 · · 4877ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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
TC-U09 Workflow UI: complete all 7 guided steps and generate a Lite score ui · ui · VR-2.2 · 23125ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260711180241@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: "Start New Application"
  9. expect_text: "Step 1 of 7"
  10. fill: {"placeholder": "Passport Number", "value": "U1802419"}
  11. fill: {"placeholder": "Name (as in passport)", "value": "UI Journey Tester"}
  12. fill: {"placeholder": "Place of Issue", "value": "Mumbai"}
  13. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2020-01-15"}
  14. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2031-01-14"}
  15. tap: "Select Nationality"
  16. tap: "India"
  17. tap: "Save & Continue"
  18. expect_text: "Step 2 of 7"
  19. tap: "Select Destination Country"
  20. tap: "France"
  21. tap: "Done"
  22. tap: "Select Visa Type"
  23. tap: "Tourist / Visitor"
  24. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2026-08-10"}
  25. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2026-08-24"}
  26. fill: {"placeholder": "Trip Duration (days)", "value": "14"}
  27. tap: "Save & Next"
  28. expect_text: "Step 3 of 7"
  29. fill: {"placeholder": "First Name", "value": "UI"}
  30. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "1990-05-20"}
  31. tap: "Select Gender"
  32. tap: "Male"
  33. tap: "Select Marital Status"
  34. tap: "Married"
  35. fill: {"placeholder": "Current City of Residence", "value": "Mumbai"}
  36. fill: {"placeholder": "State", "value": "Maharashtra"}
  37. fill: {"placeholder": "PIN / Postal Code", "value": "400001"}
  38. fill: {"placeholder": "Email", "value": "qa.20260711180241@visaready.test"}
  39. fill: {"placeholder": "Mobile", "value": "9876543299"}
  40. tap: "Select Highest Qualification"
  41. tap: "Postgraduate"
  42. tap: "Select User Type"
  43. tap: "Salaried"
  44. tap: "Save & Next"
  45. expect_text: "Step 4 of 7"
  46. tap: "Save & Next"
  47. expect_text: "Step 5 of 7"
  48. tap: "Save & Next"
  49. expect_text: "Step 6 of 7"
  50. toggle: 3
  51. tap: "Save & Next"
  52. expect_text: "Step 7 of 7"
  53. screenshot: "journey-step7"
  54. tap: "Generate VisaScore"
  55. wait: 3500
  56. goto: "/"
  57. expect_text: "Indicative (Lite) result"
  58. screenshot: "journey-done"
console: error: Failed to load resource: the server responded with a status of 403 (Forbidden) ⏐ error: Failed to load resource: the server responded with a status of 403 (Forbidden)
📷 TC-U09-journey-step7.png 📷 TC-U09-journey-done.png

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