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

23/23CORE purpose
83cases
83passed
0failed
3/3masters
9/9scoring
15/15workflow
8/8auth
6/6validation
5/5crud
4/4documents
7/7payment
3/3rbac
2/2integrations
3/3profile
14/14ui
4/4android

All green — no bugs this run ✅

📸 Screens — Genymotion device (18)

Cases

CORE TC-M01 Country master is seeded and searchable masters · api · · 61ms
  1. GET /api/country?page=1&limit=100
  2. GET /api/country?q=India
  3. GET /api/country?q=France
CORE TC-M02 Plans master is seeded (Lite / Starter / Advance …) masters · api · VR-4.15 · 10ms
  1. GET /api/plan?page=1&limit=50
  2. GET /api/plan?q=Starter
CORE TC-S01 Customer can create a complete application (draft) scoring · api · VR-4.7 · 20ms
  1. POST /api/application
CORE TC-S02 VisaScore Lite — strong profile scores High (≥85) scoring · api · VR-4.13 · 30ms
  1. POST /api/flows/generate_lite_score/run
  2. GET /api/application/161
CORE TC-S03 Scoring is blocked until the return declaration is confirmed scoring · api · VR-4.12 · 16ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
CORE TC-S04 VisaScore Lite — weak profile lands in the Low band (≤30) scoring · api · VR-4.13 · 37ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. GET /api/application/163
CORE TC-S05 Final VisaScore — full lifecycle to Strong Readiness with VisaMatrix report scoring · api · VR-4.16 · 96ms
  1. POST /api/application/161/transition
  2. POST /api/application/161/transition
  3. POST /api/flows/generate_final_score/run
  4. GET /api/application/161
CORE TC-S06 One free score regeneration is allowed scoring · api · VR-5.3 · 57ms
  1. POST /api/flows/regenerate_score/run
  2. GET /api/application/161
CORE TC-S07 A second regeneration is refused (2 scores total) scoring · api · VR-5.3 · 7ms
  1. POST /api/flows/regenerate_score/run
CORE TC-S08 Every final score writes a VisaMatrix report record scoring · api · VR-4.16 · 8ms
  1. GET /api/visa_report?page=1&limit=50
CORE TC-S09 Lifecycle-button path also produces the Lite score (transition + async flow) scoring · api · VR-4.13 · 71ms
  1. POST /api/application
  2. POST /api/application/164/transition
  3. GET /api/application/164
CORE TC-W01 Workflow: full customer journey draft → lite → docs → paid → final → embassy → approved workflow · api · VR-2.2 · 282ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/document
  4. POST /api/document
  5. POST /api/document/89/transition
  6. POST /api/document/90/transition
  7. POST /api/application/165/transition
  8. POST /api/application/165/transition
  9. POST /api/flows/generate_final_score/run
  10. GET /api/application/165
  11. POST /api/application/165/transition
  12. PATCH /api/application/165
  13. POST /api/application/165/transition
  14. GET /api/application/165
CORE TC-W02 Workflow: rejection path ends in terminal rejected status workflow · api · VR-4.17 · 187ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/166/transition
  4. POST /api/application/166/transition
  5. POST /api/flows/generate_final_score/run
  6. POST /api/application/166/transition
  7. POST /api/application/166/transition
  8. GET /api/application/166
CORE TC-W03 Workflow: customer submits to agent, agent forwards to embassy (role interplay) workflow · api · VR-4.5 · 182ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/167/transition
  4. POST /api/application/167/transition
  5. POST /api/flows/generate_final_score/run
  6. POST /api/application/167/transition
  7. POST /api/application/167/transition
  8. GET /api/application/167
CORE TC-W11 Workflow: single-use promo is exhausted after one redemption (usage cap) workflow · api · VR-4.15 · 72ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
  4. GET /api/payment/126
  5. GET /api/promo_code/69
  6. POST /api/payment
  7. POST /api/flows/apply_promo/run
CORE TC-U09 Workflow UI: complete all 7 guided steps and generate a Lite score ui · ui · VR-2.2 · 25638ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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": "Application Title", "value": "UI Journey 20260712043709"}
  11. fill: {"placeholder": "Passport Number", "value": "U0437099"}
  12. fill: {"placeholder": "Name (as in passport)", "value": "UI Journey Tester"}
  13. fill: {"placeholder": "Place of Issue", "value": "Mumbai"}
  14. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2020-01-15"}
  15. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2031-01-14"}
  16. tap: "Select Nationality"
  17. tap: "India"
  18. tap: "Save & Continue"
  19. expect_text: "Step 2 of 7"
  20. tap: "Select Destination Country"
  21. tap: "France"
  22. tap: "Done"
  23. tap: "Select Visa Type"
  24. tap: "Tourist / Visitor"
  25. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2026-08-11"}
  26. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2026-08-25"}
  27. fill: {"placeholder": "Trip Duration (days)", "value": "14"}
  28. tap: "Save & Next"
  29. expect_text: "Step 3 of 7"
  30. fill: {"placeholder": "First Name", "value": "UI"}
  31. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "1990-05-20"}
  32. tap: "Select Gender"
  33. tap: "Male"
  34. tap: "Select Marital Status"
  35. tap: "Married"
  36. fill: {"placeholder": "Current City of Residence", "value": "Mumbai"}
  37. fill: {"placeholder": "State", "value": "Maharashtra"}
  38. fill: {"placeholder": "PIN / Postal Code", "value": "400001"}
  39. fill: {"placeholder": "Email", "value": "qa.20260712043709@visaready.test"}
  40. fill: {"placeholder": "Mobile", "value": "9876543299"}
  41. tap: "Select Highest Qualification"
  42. tap: "Postgraduate"
  43. tap: "Select User Type"
  44. tap: "Salaried"
  45. tap: "Save & Next"
  46. expect_text: "Step 4 of 7"
  47. tap: "Save & Next"
  48. expect_text: "Step 5 of 7"
  49. tap: "Save & Next"
  50. expect_text: "Step 6 of 7"
  51. toggle: 3
  52. tap: "Save & Next"
  53. expect_text: "Step 7 of 7"
  54. screenshot: "journey-step7"
  55. tap: "Generate VisaScore"
  56. wait: 3500
  57. goto: "/"
  58. expect_text: "Indicative (Lite) result"
  59. 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)
CORE TC-U10 Workflow UI: progress the application docs → paid → Final Score from the app ui · ui · VR-4.16 · 13508ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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: "UI Journey 20260712043709"
  9. expect_text: "Application Progress"
  10. tap: "Documents Complete"
  11. wait: 900
  12. tap: "Payment Received"
  13. wait: 900
  14. tap: "Generate Final Score"
  15. wait: 4500
  16. goto: "/"
  17. expect_text: "Verified score"
  18. screenshot: "ui-final-score"
CORE TC-U11 Workflow UI (negative): second score regeneration is refused with a visible message ui · ui · VR-5.3 · 9772ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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: "Verified score"
  9. expect_text: "Score Improvement"
  10. tap: "Generate New Score (re-score rule)"
  11. wait: 3000
  12. expect_text: "done ✓"
  13. tap: "Generate New Score (re-score rule)"
  14. wait: 1500
  15. expect_text: "Regeneration limit reached"
  16. screenshot: "ui-regen-cap"
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 400 (Bad Request)
CORE TC-U12 Workflow UI (negative): invalid passport number shows the exact rule and blocks Step 1 ui · ui · VR-4.7 · 4533ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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": "abc123"}
  11. tap: "Save & Continue"
  12. expect_text: "8–9 characters"
  13. expect_text: "Step 1 of 7"
  14. screenshot: "ui-invalid-passport"
console: error: Failed to load resource: the server responded with a status of 400 (Bad Request)
CORE TC-U13 Workflow UI (negative): scoring without the return declaration shows the guard message ui · ui · VR-4.12 · 10499ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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": "D0437099"}
  11. tap: "Save & Continue"
  12. expect_text: "Step 2 of 7"
  13. tap: "Save & Next"
  14. expect_text: "Step 3 of 7"
  15. tap: "Save & Next"
  16. expect_text: "Step 4 of 7"
  17. tap: "Save & Next"
  18. expect_text: "Step 5 of 7"
  19. tap: "Save & Next"
  20. expect_text: "Step 6 of 7"
  21. tap: "Save & Next"
  22. expect_text: "Step 7 of 7"
  23. tap: "Generate VisaScore"
  24. wait: 1500
  25. expect_text: "Please confirm the return declaration"
  26. screenshot: "ui-declaration-block"
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) ⏐ error: Failed to load resource: the server responded with a status of 400 (Bad Request)
CORE TC-U14 Complete user story: sign in → 7-step application → document upload → payment → Final Score ui · ui · VR-2.2 · 51227ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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: "01-home"
  9. tap: "Start New Application"
  10. expect_text: "Step 1 of 7"
  11. fill: {"placeholder": "Application Title", "value": "Full Flow 20260712043709"}
  12. fill: {"placeholder": "Passport Number", "value": "F0437099"}
  13. fill: {"placeholder": "Name (as in passport)", "value": "Full Flow Tester"}
  14. fill: {"placeholder": "Place of Issue", "value": "Mumbai"}
  15. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2020-01-15"}
  16. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2031-01-14"}
  17. tap: "Select Nationality"
  18. tap: "India"
  19. screenshot: "02-step1-passport"
  20. tap: "Save & Continue"
  21. expect_text: "Step 2 of 7"
  22. tap: "Select Destination Country"
  23. tap: "France"
  24. tap: "Done"
  25. tap: "Select Visa Type"
  26. tap: "Tourist / Visitor"
  27. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2026-08-11"}
  28. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2026-08-25"}
  29. fill: {"placeholder": "Trip Duration (days)", "value": "14"}
  30. tap: "Not yet"
  31. tap: "Confirmed"
  32. tap: "Not yet"
  33. tap: "Reserved"
  34. screenshot: "03-step2-trip"
  35. tap: "Save & Next"
  36. expect_text: "Step 3 of 7"
  37. fill: {"placeholder": "First Name", "value": "Full"}
  38. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "1990-05-20"}
  39. tap: "Select Gender"
  40. tap: "Male"
  41. tap: "Select Marital Status"
  42. tap: "Married"
  43. fill: {"placeholder": "Current City of Residence", "value": "Mumbai"}
  44. fill: {"placeholder": "State", "value": "Maharashtra"}
  45. fill: {"placeholder": "PIN / Postal Code", "value": "400001"}
  46. fill: {"placeholder": "Email", "value": "qa.20260712043709@visaready.test"}
  47. fill: {"placeholder": "Mobile", "value": "9876543298"}
  48. tap: "Select Highest Qualification"
  49. tap: "Postgraduate"
  50. tap: "Select User Type"
  51. tap: "Salaried"
  52. fill: {"placeholder": "Years in Current Role", "value": "4"}
  53. fill: {"placeholder": "Total Work Experience (years)", "value": "9"}
  54. screenshot: "04-step3-applicant"
  55. tap: "Save & Next"
  56. expect_text: "Step 4 of 7"
  57. tap: "Select Average Bank Balance"
  58. tap: "4× trip fund or above"
  59. toggle: 2
  60. tap: "Select Yearly Gross Income (last ITR)"
  61. tap: "Above ₹30 lakh"
  62. screenshot: "05-step4-financial"
  63. tap: "Save & Next"
  64. expect_text: "Step 5 of 7"
  65. toggle: 0
  66. toggle: 1
  67. toggle: 2
  68. screenshot: "06-step5-travel-history"
  69. tap: "Save & Next"
  70. expect_text: "Step 6 of 7"
  71. toggle: 3
  72. screenshot: "07-step6-declaration"
  73. tap: "Save & Next"
  74. expect_text: "Step 7 of 7"
  75. tap: "Generate VisaScore"
  76. wait: 3500
  77. expect_text: "done ✓"
  78. screenshot: "08-step7-lite-score"
  79. tap: "Continue to Documents"
  80. expect_text: "Upload Document"
  81. screenshot: "09-documents-list"
  82. tap: "Upload Document"
  83. expect_text: "Document Type"
  84. tap: "Select Application"
  85. tap: "Full Flow 20260712043709"
  86. tap: "Select Document Type"
  87. tap: "Passport"
  88. fill: {"placeholder": "Document Name", "value": "Passport scan 043709"}
  89. upload_file: {"nth": 0, "path": "/home/usr1/code2/spec-studio/qa/visaready/assets/sample-doc.png"}
  90. expect_text: "uploaded:"
  91. screenshot: "10-document-uploaded"
  92. tap: "Upload"
  93. expect_text: "Passport scan 043709"
  94. screenshot: "11-documents-after-upload"
  95. goto: "/"
  96. tap: "Full Flow 20260712043709"
  97. expect_text: "Application Progress"
  98. tap: "Documents Complete"
  99. wait: 900
  100. tap: "Payment Received"
  101. wait: 900
  102. tap: "Generate Final Score"
  103. wait: 4500
  104. screenshot: "12-application-scored"
  105. goto: "/"
  106. expect_text: "Verified score"
  107. screenshot: "13-final-score-card"
  108. tap: "Verified score"
  109. expect_text: "Score Improvement"
  110. screenshot: "14-score-screen"
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) ⏐ error: Failed to load resource: the server responded with a status of 403 (Forbidden)
CORE TC-U14-AND Complete user story: sign in → 7-step application → document upload → payment → Final Score [Android device] android · android · VR-2.2 · 68867ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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: "01-home"
  9. tap: "Start New Application"
  10. expect_text: "Step 1 of 7"
  11. fill: {"placeholder": "Application Title", "value": "Full Flow 20260712043709"}
  12. fill: {"placeholder": "Passport Number", "value": "F0437099"}
  13. fill: {"placeholder": "Name (as in passport)", "value": "Full Flow Tester"}
  14. fill: {"placeholder": "Place of Issue", "value": "Mumbai"}
  15. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2020-01-15"}
  16. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2031-01-14"}
  17. tap: "Select Nationality"
  18. tap: "India"
  19. screenshot: "02-step1-passport"
  20. tap: "Save & Continue"
  21. expect_text: "Step 2 of 7"
  22. tap: "Select Destination Country"
  23. tap: "France"
  24. tap: "Done"
  25. tap: "Select Visa Type"
  26. tap: "Tourist / Visitor"
  27. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "2026-08-11"}
  28. fill: {"placeholder": "YYYY-MM-DD", "nth": 1, "value": "2026-08-25"}
  29. fill: {"placeholder": "Trip Duration (days)", "value": "14"}
  30. tap: "Not yet"
  31. tap: "Confirmed"
  32. tap: "Not yet"
  33. tap: "Reserved"
  34. screenshot: "03-step2-trip"
  35. tap: "Save & Next"
  36. expect_text: "Step 3 of 7"
  37. fill: {"placeholder": "First Name", "value": "Full"}
  38. fill: {"placeholder": "YYYY-MM-DD", "nth": 0, "value": "1990-05-20"}
  39. tap: "Select Gender"
  40. tap: "Male"
  41. tap: "Select Marital Status"
  42. tap: "Married"
  43. fill: {"placeholder": "Current City of Residence", "value": "Mumbai"}
  44. fill: {"placeholder": "State", "value": "Maharashtra"}
  45. fill: {"placeholder": "PIN / Postal Code", "value": "400001"}
  46. fill: {"placeholder": "Email", "value": "qa.20260712043709@visaready.test"}
  47. fill: {"placeholder": "Mobile", "value": "9876543298"}
  48. tap: "Select Highest Qualification"
  49. tap: "Postgraduate"
  50. tap: "Select User Type"
  51. tap: "Salaried"
  52. fill: {"placeholder": "Years in Current Role", "value": "4"}
  53. fill: {"placeholder": "Total Work Experience (years)", "value": "9"}
  54. screenshot: "04-step3-applicant"
  55. tap: "Save & Next"
  56. expect_text: "Step 4 of 7"
  57. tap: "Select Average Bank Balance"
  58. tap: "4× trip fund or above"
  59. toggle: 2
  60. tap: "Select Yearly Gross Income (last ITR)"
  61. tap: "Above ₹30 lakh"
  62. screenshot: "05-step4-financial"
  63. tap: "Save & Next"
  64. expect_text: "Step 5 of 7"
  65. toggle: 0
  66. toggle: 1
  67. toggle: 2
  68. screenshot: "06-step5-travel-history"
  69. tap: "Save & Next"
  70. expect_text: "Step 6 of 7"
  71. toggle: 3
  72. screenshot: "07-step6-declaration"
  73. tap: "Save & Next"
  74. expect_text: "Step 7 of 7"
  75. tap: "Generate VisaScore"
  76. wait: 3500
  77. expect_text: "done ✓"
  78. screenshot: "08-step7-lite-score"
  79. tap: "Continue to Documents"
  80. expect_text: "Upload Document"
  81. screenshot: "09-documents-list"
  82. tap: "Upload Document"
  83. expect_text: "Document Type"
  84. tap: "Select Application"
  85. tap: "Full Flow 20260712043709"
  86. tap: "Select Document Type"
  87. tap: "Passport"
  88. fill: {"placeholder": "Document Name", "value": "Passport scan 043709"}
  89. upload_file: {"nth": 0, "path": "/home/usr1/code2/spec-studio/qa/visaready/assets/sample-doc.png"}
  90. expect_text: "uploaded:"
  91. screenshot: "10-document-uploaded"
  92. tap: "Upload"
  93. expect_text: "Passport scan 043709"
  94. screenshot: "11-documents-after-upload"
  95. goto: "/"
  96. tap: "Full Flow 20260712043709"
  97. expect_text: "Application Progress"
  98. tap: "Documents Complete"
  99. wait: 900
  100. tap: "Payment Received"
  101. wait: 900
  102. tap: "Generate Final Score"
  103. wait: 4500
  104. screenshot: "12-application-scored"
  105. goto: "/"
  106. expect_text: "Verified score"
  107. screenshot: "13-final-score-card"
  108. tap: "Verified score"
  109. expect_text: "Score Improvement"
  110. screenshot: "14-score-screen"
CORE TC-APK01 Native APK: install → launch → OTP login → dashboard (installed app, no browser) android · android · VR-4.2 · 30712ms
  1. install APK
  2. launch app
  3. login screen shows
  4. screenshot login
  5. enter email
  6. tap Send code
  7. code prompt shows
  8. enter OTP
  9. tap Verify
  10. dashboard greeting
  11. score card present
  12. journey card present
  13. screenshot dashboard
TC-A01 OTP request succeeds for a new email with a resend timer auth · api · VR-4.2 · 8ms
  1. POST /api/auth/request-otp
TC-A02 Correct OTP signs the user in and creates a customer account auth · api · VR-4.2 · 16ms
  1. POST /api/auth/request-otp
  2. POST /api/auth/verify-otp
TC-A03 Wrong OTP is rejected auth · api · VR-4.2 · 15ms
  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 · 7ms
  1. POST /api/auth/verify-otp
TC-A05 Empty identifier is rejected with a helpful message auth · api · VR-4.2 · 4ms
  1. POST /api/auth/request-otp
TC-A06 Session token identifies the signed-in customer on /auth/me auth · api · VR-4.2 · 5ms
  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 · 12ms
  1. POST /api/auth/request-otp
TC-M03 Document checklist master is seeded masters · api · VR-4.14 · 10ms
  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 · 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 · 4ms
  1. POST /api/application
TC-V05 GSTIN format is validated when provided validation · api · VR-4.9 · 5ms
  1. POST /api/application
TC-V06 Passport expiry must be after the issue date (cross-field) validation · api · VR-4.7 · 3ms
  1. POST /api/application
TC-C01 Applications are searchable by title crud · api · · 8ms
  1. GET /api/application?q=QA%20Strong%2020260712043709
TC-C02 List pagination respects the limit crud · api · · 8ms
  1. GET /api/application?page=1&limit=2
TC-C03 Application fields can be updated (PATCH) crud · api · · 29ms
  1. PATCH /api/application/161
  2. GET /api/application/161
TC-C04 Deleting an application removes it from lists (soft delete) crud · api · · 40ms
  1. POST /api/application
  2. DELETE /api/application/168
  3. GET /api/application?q=QAScratch20260712043709
TC-C05 Fetching a non-existent application returns 404 crud · api · · 4ms
  1. GET /api/application/999999
TC-D01 Customer can attach a document to their application documents · api · VR-4.14 · 11ms
  1. POST /api/document
TC-D02 Document can be verified (uploaded → verified) documents · api · VR-4.14 · 14ms
  1. POST /api/document/91/transition
  2. GET /api/document/91
TC-D03 Admin can flag a document documents · api · VR-4.14 · 37ms
  1. POST /api/document
  2. PATCH /api/document/92
  3. POST /api/document/92/transition
  4. GET /api/document/92
TC-D04 Customer cannot flag documents (admin-only transition) documents · api · VR-4.14 · 18ms
  1. POST /api/document
  2. POST /api/document/93/transition
TC-P01 Admin can register an agency payment · api · VR-4.5 · 9ms
  1. POST /api/agency
TC-P02 Admin approves the agency (KYC → active) payment · api · VR-4.5 · 19ms
  1. POST /api/agency/32/transition
TC-P03 Admin issues a promo code allocated to the agency payment · api · VR-4.15 · 9ms
  1. POST /api/promo_code
TC-P04 Valid promo waives the fee and issues an invoice payment · api · VR-4.15 · 79ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
  3. GET /api/payment/119
TC-P05 Unknown promo code is rejected with guidance payment · api · VR-4.15 · 23ms
  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 · 16ms
  1. POST /api/payment
  2. POST /api/flows/apply_promo/run
TC-P07 Successful payment triggers automatic invoice issuance payment · api · VR-4.15 · 1032ms
  1. POST /api/payment/121/transition
  2. GET /api/payment/121
TC-R01 Customer cannot approve agencies (admin-only lifecycle) rbac · api · VR-4.5 · 16ms
  1. POST /api/agency
  2. POST /api/agency/33/transition
TC-R02 Flows cannot be triggered anonymously rbac · api · · 2ms
  1. POST /api/flows/generate_final_score/run
TC-R03 SIT header-auth backdoor works for admin (must be OFF outside SIT) rbac · api · · 3ms
  1. GET /api/auth/me
TC-I01 Signed-in users can upload files (storage slot → R2) integrations · api · · 154ms
  1. POST /api/upload
TC-I02 Anonymous users cannot upload files integrations · api · · 4ms
  1. POST /api/upload
TC-F01 Customer can create their applicant profile profile · api · VR-4.6 · 13ms
  1. POST /api/applicant_profile
TC-F02 Duplicate profile email is rejected cleanly (unique) profile · api · VR-4.6 · 6ms
  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-W04 Workflow: agency code is validated — valid code maps, unknown code errors workflow · api · VR-4.13 · 71ms
  1. PATCH /api/application/167
  2. POST /api/flows/map_agency_code/run
  3. PATCH /api/application/167
  4. POST /api/flows/map_agency_code/run
TC-W05 Workflow: multi-applicant — co-applicant attaches to the application workflow · api · VR-4.7a · 35ms
  1. PATCH /api/application/165
  2. POST /api/co_applicant
  3. GET /api/co_applicant?filter[application]=165
TC-W06 Workflow: failed payment can be retried and still issues an invoice workflow · api · VR-4.15 · 67ms
  1. POST /api/payment
  2. POST /api/payment/122/transition
  3. POST /api/payment/122/transition
  4. GET /api/payment/122
TC-W07 Workflow: promo redemption increments its usage counter workflow · api · VR-4.15 · 5ms
  1. GET /api/promo_code/65
TC-W08 Workflow: expired promo code is refused workflow · api · VR-4.15 · 41ms
  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 · 24ms
  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 · 17ms
  1. POST /api/promo_code
  2. POST /api/payment
  3. POST /api/flows/apply_promo/run
TC-W12 Workflow: improving the profile and regenerating raises the final score workflow · api · VR-5.3 · 230ms
  1. POST /api/application
  2. POST /api/flows/generate_lite_score/run
  3. POST /api/application/169/transition
  4. POST /api/application/169/transition
  5. POST /api/flows/generate_final_score/run
  6. GET /api/application/169
  7. PATCH /api/application/169
  8. POST /api/flows/regenerate_score/run
  9. GET /api/application/169
TC-W13 Workflow: flagged document — customer cannot clear the flag, agent can workflow · api · VR-4.14 · 26ms
  1. POST /api/document/92/transition
  2. POST /api/document/92/transition
  3. GET /api/document/92
TC-W14 Workflow: admin analytics reports run and group correctly workflow · api · VR-5.x · 8ms
  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 · 1668ms
  1. POST /api/upload
  2. POST /api/document
  3. POST /api/document/94/transition
  4. GET /api/document/94
TC-U01 Email OTP login lands on the personalised dashboard ui · ui · VR-4.2 · 3044ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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-U02 Wrong OTP shows an inline error ui · ui · VR-4.2 · 2956ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.ui2.20260712043709@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-U03 Dashboard shows score card, journeys, recent apps and explore links ui · ui · VR-2.2 · 3057ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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. screenshot: "dashboard"
TC-U04 Profile tab opens the applicant profile form ui · ui · VR-4.6 · 3788ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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-U05 Customer does not see admin/agent-only navigation ui · ui · · 5872ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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 · 3778ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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-U07 Explore links include the Terms & Consent page ui · ui · VR-4.4 · 2905ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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 · · 5221ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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-U01-AND Email OTP login lands on the personalised dashboard [Android device] android · android · VR-4.2 · 6924ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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-U03-AND Dashboard shows score card, journeys, recent apps and explore links [Android device] android · android · VR-2.2 · 6655ms
  1. goto: "/"
  2. fill: {"placeholder": "you@example.com", "value": "qa.20260712043709@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. screenshot: "dashboard"

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