FAS 2.0 — Test Scenarios (v5)
Walk through scenarios in your browser. Progress is saved on this device.
SP — Singpass / MyInfo (Mock)
- SP.1Positive
Banner visible when nothing verified
- Steps
New session, step 1
- Expected
"Save time — prefill with Singpass" banner shows
- SP.2Positive
Banner hidden after prefill
- Steps
Complete Singpass flow
- Expected
Banner disappears (
verifiedCount > 0)
- SP.3Positive
QR → scanned → consent → success flow
- Steps
Open modal, wait
- Expected
Auto transitions: 4 s to scanned, 1.2 s to consent; user clicks Consent → success
- SP.4Positive
QR expiry countdown
- Steps
Open modal
- Expected
120 s countdown visible, decrements each second
- SP.5Negative
Escape key closes modal
- Steps
Open modal, press Esc
- Expected
Modal dismisses; no fields prefilled
- SP.6Positive
Persona picker
- Steps
Pick each demo persona
- Expected
Fields prefilled per persona payload
- SP.7Positive
Consent screen lists 8 scopes
- Steps
Reach consent stage
- Expected
All 8 scopes shown (name/NRIC, DOB/gender/nationality, address, contact, marital/family, employment, income NOA, HDB ownership)
- SP.8Positive
Verified badge
- Steps
After prefill
- Expected
Blue "Verified by Singpass" badge on every prefilled field
- SP.9Positive
Unlock verified field
- Steps
Click lock icon on a verified field
- Expected
Badge removed; field becomes editable
- SP.10Positive
Household not prefilled
- Steps
Complete Singpass
- Expected
household[]remains empty
- SP.11Edge
Re-trigger prefill overwrites
- Steps
Run Singpass twice with different personas
- Expected
Fields update to second persona
S1 — Step 1: Personal Particulars
- S1.1Positive
All valid Singapore Citizen
- Steps
Fill all required with valid NRIC
S1234567D, valid SG mobile, valid email- Expected
Next succeeds → step 2
- S1.2Positive
Valid PR
- Steps
Citizenship = "Singapore PR", everything else valid
- Expected
Next succeeds
- S1.3Positive
Student requires school
- Steps
Student status = "Full-time Student", school = "NUS"
- Expected
Validates
- S1.4Negative
fullName
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.5Negative
nric
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.6Negative
dob
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.7Negative
gender
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.8Negative
nationality
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.9Negative
citizenship
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.10Negative
maritalStatus
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.11Negative
highestQualification
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.12Negative
studentStatus
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.13Negative
countryCode
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.14Negative
mobile
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.15Negative
email
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.16Negative
preferredContact
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.17Negative
preferredLanguage
- Steps
Negative — required field empties (BR-001 to BR-018)
- Expected
"Required"
- S1.18Negative
NRIC bad checksum
- Steps
S1234567A- Expected
"Please enter a valid NRIC number."
- S1.19Negative
NRIC wrong prefix
- Steps
A1234567J- Expected
Invalid NRIC
- S1.20Negative
NRIC short
- Steps
S123J- Expected
Invalid NRIC
- S1.21Negative
NRIC FIN valid
- Steps
F1234567N(recompute valid letter)- Expected
Accepted
- S1.22Negative
NRIC M-series valid/invalid
- Steps
Valid M vs random M
- Expected
Validated by M-series checksum
- S1.23Negative
DOB in future
- Steps
tomorrow
- Expected
"Date of birth cannot be in the future."
- S1.24Negative
DOB very old
- Steps
1900-01-01
- Expected
Accepted (age auto-calc shows)
- S1.25Negative
Citizenship = Foreigner
- Steps
Select Foreigner
- Expected
Inline + red eligibility block; Next blocked; "Exit Application" / "Contact Support" actions
- S1.26Negative
Student = Full-time but school empty
- Steps
studentStatus = Full-time, school blank
- Expected
"Required" on school
- S1.27Negative
Student = "Not a Student"
- Steps
school field hidden
- Expected
No school validation runs
- S1.28Negative
Email malformed
- Steps
foo@bar,foo bar@x.com,@x.com- Expected
"Please enter a valid email address."
- S1.29Negative
SG mobile invalid prefix
- Steps
12345678- Expected
"Please enter a valid mobile number…"
- S1.30Negative
SG mobile valid
- Steps
91234567,81234567,61234567- Expected
Accepted
- S1.31Negative
SG mobile wrong length
- Steps
9123456(7 digits)- Expected
Invalid
- S1.32Negative
MY mobile 9–10 digits
- Steps
123456789,1234567890- Expected
Accepted
- S1.33Negative
MY mobile 8 digits
- Steps
12345678- Expected
Invalid
- S1.34Negative
ID mobile 9–12 digits
- Steps
123456789,123456789012- Expected
Accepted
- S1.35Negative
Other country code length 7–15
- Steps
1234567and123456789012345- Expected
Accepted; outside range invalid
- S1.36Negative
Mobile contains letters
- Steps
9abc4567- Expected
Invalid (digits only)
- S1.37Positive
NRIC history lookup (on blur, after checksum passes)
- Steps
"Resume draft" navigates to step 3
- Expected
Blue banner with ref + last edited
- S1.38Positive
NRIC history lookup (on blur, after checksum passes)
- Steps
Informational only
- Expected
Red banner — "Duplicate submissions are not allowed."
- S1.39Positive
NRIC history lookup (on blur, after checksum passes)
- Steps
Proceed allowed
- Expected
Grey banner with grant details
- S1.40Positive
NRIC history lookup (on blur, after checksum passes)
- Steps
Informational only
- Expected
Amber warning re: active grant
- S1.41Positive
NRIC history lookup (on blur, after checksum passes)
- Steps
None
- Expected
Green: "No existing applications…"
S2 — Step 2: Residential & Housing
- S2.1Positive
All fields valid, mailing same as residential
- Steps
Positive
- Expected
Next succeeds
- S2.2Positive
Mailing different
- Steps
Positive
- Expected
Toggle off → mailing fields appear → fill all → Next succeeds
- S2.3Positive
OneMap auto-fill happy path
- Steps
Positive
- Expected
Type valid SG postal
238801, click Auto-fill
- S2.4Negative
postal
- Steps
Negative — required
- Expected
"Required"
- S2.5Negative
blockNo
- Steps
Negative — required
- Expected
"Required"
- S2.6Negative
streetName
- Steps
Negative — required
- Expected
"Required"
- S2.7Negative
floorNo
- Steps
Negative — required
- Expected
"Required"
- S2.8Negative
unitNo
- Steps
Negative — required
- Expected
"Required"
- S2.9Negative
housingType
- Steps
Negative — required
- Expected
"Required"
- S2.10Negative
ownership
- Steps
Negative — required
- Expected
"Required"
- S2.11Negative
mailing fields when checkbox unchecked
- Steps
Negative — required
- Expected
"Required" on each mailing field
- S2.12Negative
Postal not 6 digits
- Steps
12345,1234567- Expected
"Enter a valid 6-digit postal code"
- S2.13Negative
Postal non-numeric
- Steps
12A456- Expected
Field rejects letters (maxLength + numeric only)
- S2.14Negative
Floor with letters
- Steps
12A- Expected
"Enter digits only (e.g. 12)"
- S2.15Negative
Floor > 3 digits
- Steps
1234- Expected
Field rejects (maxLength 3)
- S2.16Negative
Unit with symbol
- Steps
12-A,#345- Expected
"Letters/numbers only…"
- S2.17Negative
Unit > 5 chars
- Steps
12ABCD- Expected
Field rejects (maxLength 5)
- S2.18Negative
Mailing postal invalid when toggled
- Steps
mailing not 6 digits
- Expected
"Enter a valid 6-digit postal code"
- S2.19Positive
Auto-fill button disabled when postal not 6 digits
- Steps
OneMap
- Expected
Type
12345
- S2.20Positive
OneMap returns empty
- Steps
OneMap
- Expected
Use
000000
- S2.21Positive
OneMap API failure
- Steps
OneMap
- Expected
Mock network error
- S2.22Positive
Enter key in postal triggers lookup
- Steps
OneMap
- Expected
Press Enter
- S2.23Positive
residentialAddress auto-compose
- Steps
Composed address
- Expected
Fill all sub-fields
- S2.24Positive
mailingAddress auto-compose
- Steps
Composed address
- Expected
Same for mailing
S3 — Step 3: Employment & Income
- S3.1Positive
Employed full happy path
- Steps
Positive
- Expected
Status=Employed, type=Full Time, work=Active, gross=5000
- S3.2Positive
Self-employed
- Steps
Positive
- Expected
Status=Self-employed + all required
- S3.3Positive
Retired
- Steps
Positive
- Expected
Status=Retired
- S3.4Positive
Unemployed clears fields
- Steps
Positive
- Expected
Switch to Unemployed
- S3.5Positive
Non-employment income only
- Steps
Positive
- Expected
Unemployed + rental 800 + allowance 200
- S3.6Negative
employmentStatus empty
- Steps
Negative
- Expected
"Required"
- S3.7Negative
employmentType empty (non-Unemployed)
- Steps
Negative
- Expected
"Required"
- S3.8Negative
workStatus empty (non-Unemployed)
- Steps
Negative
- Expected
"Required"
- S3.9Negative
grossIncome empty (non-Unemployed)
- Steps
Negative
- Expected
"Required"
- S3.10Negative
BR-203: Employed + grossIncome = 0
- Steps
Negative
- Expected
"Monthly income must be greater than 0 for employed applicants."
- S3.11Negative
BR-203: Employed + grossIncome negative
- Steps
Negative
- Expected
Same error (number input min 0 also blocks)
- S3.12Negative
Non-numeric income
- Steps
Negative
- Expected
Field rejects
- S3.13Negative
Total income auto-calc with household
- Steps
Negative
- Expected
Add 2 household members with incomes 1000 + 500 not Unemployed/Student
- S3.14Negative
Household Student/Unemployed excluded
- Steps
Negative
- Expected
Add student with income field hidden
S4 — Step 4: Monthly Expenses
- S4.1Positive
ownership = Owner shows mortgage Q
- Steps
Conditional mortgage
- Expected
hasMortgage required
- S4.2Positive
ownership = Co-Owner
- Steps
Conditional mortgage
- Expected
Same as Owner
- S4.3Positive
ownership = Tenant
- Steps
Conditional mortgage
- Expected
Mortgage Q hidden; not validated
- S4.4Positive
ownership = Staying With Family / Others
- Steps
Conditional mortgage
- Expected
Mortgage Q hidden
- S4.5Positive
hasMortgage = Yes, amount empty
- Steps
Conditional mortgage
- Expected
"Enter the monthly mortgage amount."
- S4.6Positive
hasMortgage = Yes, amount = 0
- Steps
Conditional mortgage
- Expected
Same error (must be > 0)
- S4.7Positive
hasMortgage = No clears amount
- Steps
Conditional mortgage
- Expected
Switch from Yes→No
- S4.8Positive
loanType empty
- Steps
Loans
- Expected
"Please select a loan type, or choose None if you have no other loans."
- S4.9Positive
loanType = None
- Steps
Loans
- Expected
loanAmount cleared; no further loan validation
- S4.10Positive
loanType ≠ None, loanAmount empty/0
- Steps
Loans
- Expected
"Enter the monthly loan amount (must be greater than 0)."
- S4.11Positive
Switch loanType from Personal→None
- Steps
Loans
- Expected
loanAmount auto-cleared
- S4.12Positive
All expense fields filled
- Steps
Total expenses auto-calc
- Expected
Total = sum of mortgage(if Yes) + rental + utilities + medical + education + loan + other
- S4.13Positive
Negative numbers blocked
- Steps
Total expenses auto-calc
- Expected
Field min 0
- S4.14Positive
All optional expenses blank
- Steps
Total expenses auto-calc
- Expected
Total = 0 + any mortgage
S5 — Step 5: Health Information (Applicant Only)
- S5.1Positive
hasMedicalCondition = No happy path
- Steps
- Expected
All medical sub-fields hidden; Next succeeds
- S5.2Positive
hasMedicalCondition empty
- Steps
- Expected
"Required"
- S5.3Positive
hasMedicalCondition = Yes, all sub-fields shown
- Steps
- Expected
disabilityType + mobilityStatus required
- S5.4Positive
disabilityType empty when Yes
- Steps
- Expected
"Required"
- S5.5Positive
mobilityStatus empty when Yes
- Steps
- Expected
"Required"
- S5.6Positive
Free text fields (medicalCondition, chronicIllness, medicalRemarks) optional
- Steps
- Expected
Empty allowed when Yes
- S5.7Positive
Switch Yes→No clears all sub-fields
- Steps
- Expected
Verify cleared
- S5.8Positive
disabilityType ≠ None or any condition text → advisory banner
- Steps
- Expected
"You may upload supporting medical/disability documents in Supporting Documents." appears
- S5.9Positive
All 8 disabilityType options selectable
- Steps
- Expected
Including "Others"
S6 — Step 6: Household Information
- S6.1Positive
applicant maritalStatus = Married, no household members
- Steps
Marital-status driven
- Expected
Top-level error "please input your spouse details"
- S6.2Positive
applicant maritalStatus = Single, Spouse option disabled in dropdown
- Steps
Marital-status driven
- Expected
Cannot select Spouse
- S6.3Positive
Add 2 spouses
- Steps
Marital-status driven
- Expected
Second one's relationship dropdown has Spouse disabled; if forced → "Only one spouse can be declared…"
- S6.4Positive
Set relationship=Spouse with empty maritalStatus
- Steps
Marital-status driven
- Expected
Auto-populates "Married"
- S6.5Positive
name
- Steps
Per-member required
- Expected
"Required"
- S6.6Positive
relationship
- Steps
Per-member required
- Expected
"Required"
- S6.7Positive
dob
- Steps
Per-member required
- Expected
"Required"
- S6.8Positive
gender
- Steps
Per-member required
- Expected
"Required"
- S6.9Positive
maritalStatus
- Steps
Per-member required
- Expected
"Required"
- S6.10Positive
employmentStatus
- Steps
Per-member required
- Expected
"Required"
- S6.11Positive
nric (non-Foreigner)
- Steps
Per-member required
- Expected
"NRIC is required."
- S6.12Positive
nric (Foreigner)
- Steps
Per-member required
- Expected
"Passport No. is required."
- S6.13Positive
livingTogether
- Steps
Per-member required
- Expected
"Required"
- S6.14Positive
monthlyIncome when status ≠ Unemployed/Student
- Steps
Per-member required
- Expected
"Required"
- S6.15Positive
hasMedicalCondition
- Steps
Per-member required
- Expected
"Required"
- S6.16Positive
disabilityType/mobilityStatus when hasMedicalCondition=Yes
- Steps
Per-member required
- Expected
"Required"
- S6.17Positive
NRIC invalid checksum
- Steps
Per-member format
- Expected
"Please enter a valid NRIC number."
- S6.18Positive
Passport No. (Foreigner)
- Steps
Per-member format
- Expected
Up to 20 chars alphanumeric accepted
- S6.19Positive
BR-203 on member income
- Steps
Per-member format
- Expected
Employed member with income 0 → "Monthly income must be greater than 0 for employed applicants."
- S6.20Positive
Spouse + applicant Single conflict
- Steps
Per-member format
- Expected
"A spouse cannot be added when applicant marital status is Single."
- S6.21Positive
Add unlimited members
- Steps
UX
- Expected
1, 5, 20 members supported
- S6.22Positive
Remove a member
- Steps
UX
- Expected
Row + all errors cleared
- S6.23Positive
Member nationality switch hides/shows passport label
- Steps
UX
- Expected
Foreigner shows "Passport No." else "NRIC"
- S6.24Positive
Member income hidden when Unemployed/Student
- Steps
UX
- Expected
Field disappears
- S6.25Positive
Occupation hidden when Student
- Steps
UX
- Expected
Field disappears
S7 — Step 7: Other Grants Declaration
- S7.1Positive
receivingAssistance empty
- Steps
- Expected
"Please answer whether you are receiving other assistance."
- S7.2Positive
receivingAssistance = No
- Steps
- Expected
Grants section hidden; Next succeeds
- S7.3Positive
Switch No→Yes
- Steps
- Expected
One empty grant row auto-added
- S7.4Positive
Yes + zero grants (force)
- Steps
- Expected
"Please add at least one grant."
- S7.5Positive
Grant name empty
- Steps
- Expected
"Required"
- S7.6Positive
Grant type empty
- Steps
- Expected
"Required"
- S7.7Positive
Grant agency empty
- Steps
- Expected
"Required"
- S7.8Positive
Grant description optional
- Steps
- Expected
Empty allowed
- S7.9Positive
Grant amount optional
- Steps
- Expected
Empty allowed
- S7.10Positive
Add multiple grants
- Steps
- Expected
Each validated independently
- S7.11Positive
Remove a grant
- Steps
- Expected
Row removed; errors recalculated
S8 — Step 8: Supporting Documents
- S8.1Positive
No documents uploaded
- Steps
Mandatory docs
- Expected
"Missing Required Documents:" list with Front NRIC, Back NRIC, Applicant Photo
- S8.2Positive
Only Front NRIC uploaded
- Steps
Mandatory docs
- Expected
Missing Back NRIC + Applicant Photo listed
- S8.3Positive
All 3 mandatory uploaded
- Steps
Mandatory docs
- Expected
Validates
- S8.4Positive
Re-upload Front NRIC
- Steps
Mandatory docs
- Expected
Replaces existing file (single-slot)
- S8.5Positive
Conditional doc visibility
- Steps
Conditional doc visibility
- Expected
- S8.6Positive
Conditional doc visibility
- Steps
Conditional doc visibility
- Expected
- S8.7Positive
Conditional doc visibility
- Steps
Conditional doc visibility
- Expected
- S8.8Positive
Conditional doc visibility
- Steps
Conditional doc visibility
- Expected
- S8.9Positive
Conditional doc visibility
- Steps
Conditional doc visibility
- Expected
- S8.10Positive
hasOtherIncome + no upload + no checkbox
- Steps
Other income docs declaration
- Expected
"Please upload Other Income Supporting Documents, or tick the declaration below."
- S8.11Positive
Check noOtherIncomeDocs, leave reason blank
- Steps
Other income docs declaration
- Expected
"Please provide a reason for non-submission."
- S8.12Positive
Check + reason provided
- Steps
Other income docs declaration
- Expected
Validates
- S8.13Positive
Upload file → validation passes regardless of checkbox
- Steps
Other income docs declaration
- Expected
Positive
- S8.14Positive
Medical condition declared but no medical doc
- Steps
Medical docs gate
- Expected
"Please upload at least one of: Medical Certificate, Medical Report, or Specialist Memo."
- S8.15Positive
Upload one of the three
- Steps
Medical docs gate
- Expected
Validates
- S8.16Positive
Upload .pdf
- Steps
File upload constraints (BR-119–122)
- Expected
Accepted
- S8.17Positive
Upload .jpg / .jpeg / .png
- Steps
File upload constraints (BR-119–122)
- Expected
Accepted
- S8.18Positive
Upload .docx / .heic / .zip / .exe
- Steps
File upload constraints (BR-119–122)
- Expected
Toast: "{filename}: unsupported file type. Allowed: PDF, JPG, JPEG, PNG."
- S8.19Positive
Upload exactly 5 MB
- Steps
File upload constraints (BR-119–122)
- Expected
Accepted (boundary)
- S8.20Positive
Upload > 5 MB
- Steps
File upload constraints (BR-119–122)
- Expected
Toast: "{filename}: exceeds 5 MB limit…"
- S8.21Positive
Multi-file slot append
- Steps
File upload constraints (BR-119–122)
- Expected
Add 2nd, 3rd files to non-identity slots
- S8.22Positive
Image resized for AI vision
- Steps
File upload constraints (BR-119–122)
- Expected
Verify dataURL passed
- S8.23Positive
PDF > 5 MB
- Steps
File upload constraints (BR-119–122)
- Expected
Cannot upload; size-rejected
S9 — Step 9: Declaration
- S9.1Positive
sourceOfApplication empty
- Steps
Source of application
- Expected
"Required"
- S9.2Positive
Source = Walk In or Self Serviced Portal
- Steps
Source of application
- Expected
Referral fields hidden
- S9.3Positive
Source = Referred
- Steps
Source of application
- Expected
All 8 referral fields shown
- S9.4Positive
referralAgencyName
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.5Positive
referralOfficerName
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.6Positive
referralOfficerContact
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.7Positive
referralOfficerEmail
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.8Positive
referralServiceFor
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.9Positive
referralReferenceNo
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.10Positive
referralDescription
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.11Positive
referralReportedDate
- Steps
Referral required when Source=Referred (each empty)
- Expected
"Required"
- S9.12Positive
referralSocialReportName
- Steps
Referral required when Source=Referred (each empty)
- Expected
Optional (name only stored)
- S9.13Positive
All 3 checkboxes unchecked
- Steps
Declarations + signature
- Expected
"All declarations must be acknowledged"
- S9.14Positive
Only 2 of 3 checked
- Steps
Declarations + signature
- Expected
Same error
- S9.15Positive
All checked + signature filled
- Steps
Declarations + signature
- Expected
Validates
- S9.16Positive
Signature empty
- Steps
Declarations + signature
- Expected
"Required"
S10 — Step 10: Review & Submit
- S10.1Positive
All steps shown with Edit links
- Steps
Read-only summary + financial calcs
- Expected
Each Edit jumps to correct step
- S10.2Positive
Total income calc
- Steps
Read-only summary + financial calcs
- Expected
= grossIncome (if not Unemployed) + 4 non-employment + Σ member income (excluding Unemployed/Student)
- S10.3Positive
Total expenses calc
- Steps
Read-only summary + financial calcs
- Expected
= mortgage (if hasMortgage=Yes) + rental + utilities + medical + education + loan + other
- S10.4Positive
Net surplus negative shown red
- Steps
Read-only summary + financial calcs
- Expected
Total income < total expenses → red
- S10.5Positive
Per capita income
- Steps
Read-only summary + financial calcs
- Expected
= total income / (1 + household.length)
- S10.6Positive
Household size
- Steps
Read-only summary + financial calcs
- Expected
= 1 + household.length
- S10.7Positive
Married + no Spouse in household
- Steps
Married-no-spouse warning
- Expected
Amber non-blocking warning shown; Submit still works
- S10.8Positive
Step 1 missing field
- Steps
Final cross-step re-validation (clicking Submit at step 10)
- Expected
Redirect to step 1 + toast "Please complete Personal Particulars before submitting."
- S10.9Positive
Step 4 invalid mortgage
- Steps
Final cross-step re-validation (clicking Submit at step 10)
- Expected
Redirect to step 4 + matching toast
- S10.10Positive
Step 8 missing mandatory doc
- Steps
Final cross-step re-validation (clicking Submit at step 10)
- Expected
Redirect to step 8 + matching toast
- S10.11Positive
Step 9 declarations off
- Steps
Final cross-step re-validation (clicking Submit at step 10)
- Expected
Redirect to step 9 + toast
- S10.12Positive
All steps valid
- Steps
Final cross-step re-validation (clicking Submit at step 10)
- Expected
AiDocValidationModal opens
DOC — AI Document Validation Modal
- DOC.1Positive
Modal opens on Submit
- Steps
- Expected
Phase = "checking", animated checklist
- DOC.2Positive
Checklist labels tick every ~900 ms
- Steps
- Expected
Visual progression
- DOC.3Positive
Front/Back NRIC missing → local structural fail
- Steps
- Expected
Result entry status="missing", action button "Re-upload" → step 8
- DOC.4Positive
AI returns all ok
- Steps
- Expected
Phase=review, single "Submit Application" button (no confirm phase)
- DOC.5Positive
AI returns warn
- Steps
- Expected
Phase=review with ⚠️; button label "Proceed Anyway"
- DOC.6Positive
"Proceed Anyway"
- Steps
- Expected
Opens confirm phase → "Confirm & Submit"
- DOC.7Positive
AI server throws
- Steps
- Expected
Single warn entry: "The AI check could not complete. Please review your documents before submitting."
- DOC.8Positive
Re-upload from modal
- Steps
- Expected
Jumps to step 8; modal closes
- DOC.9Positive
Modal cannot be bypassed
- Steps
- Expected
No path to submit outside modal
SUB — Submission
- SUB.1Positive
First-time submit (id=null)
- Steps
- Expected
submitApplication({id:null, draft})
- SUB.2Positive
Submit after prior auto-save
- Steps
- Expected
applicationId passed (upsert)
- SUB.3Positive
Success
- Steps
- Expected
All 10 steps marked complete; toast "Application submitted successfully"; navigate
/success/{caseNumber}; draft reset 100 ms later
- SUB.4Positive
Failure
- Steps
- Expected
Toast "Submission failed. Please try again."; submitting flag resets; user stays on modal
- SUB.5Positive
Double-click Submit guard
- Steps
- Expected
Second click ignored while submitting
- SUB.6Positive
Duplicate NRIC seeded "pending"
- Steps
- Expected
Server-side guard expected; client banner already warned at step 1
- SUB.7Positive
Browser back during submit
- Steps
- Expected
Submission still completes; success page reachable
SUC — Success Page (`/success/$refId`)
- SUC.1Positive
Reference number displayed
- Steps
- Expected
From URL param
- SUC.2Positive
Timestamp shown
- Steps
- Expected
new Date().toLocaleString()
- SUC.3Positive
Applicant name
- Steps
- Expected
From
readDraftSnapshot()(may be empty post-reset)
- SUC.4Positive
Status text
- Steps
- Expected
"Submitted — Pending Review"
- SUC.5Positive
Download PDF
- Steps
- Expected
jsPDF generates
acknowledgement-{refId}.pdfwith ref/time/name/status
- SUC.6Positive
Post-submission messaging
- Steps
- Expected
24h SMS/email, officer contact, 14 working day outcome
- SUC.7Positive
Contact info visible
- Steps
- Expected
1800-222-0000 + support@fas.gov.sg
- SUC.8Positive
Refresh after reset
- Steps
- Expected
Page still renders from URL only
AI — FAS Assistant (Citizen)
- AI.1Positive
Floating button always visible
- Steps
- Expected
On every
/apply/*and/citizenpage
- AI.2Positive
Citizen welcome
- Steps
- Expected
"Hi! I can help you check eligibility, understand required documents and track your application status."
- AI.3Positive
Citizen suggested prompts
- Steps
- Expected
3 prompts: "Check my eligibility" / "Required documents" / "Track my application"
- AI.4Positive
Officer/manager/director/admin prompts
- Steps
- Expected
NOT shown on citizen routes
- AI.5Positive
Streaming reply
- Steps
- Expected
Text streams token-by-token
- AI.6Positive
Multi-turn memory in session
- Steps
- Expected
Follow-up references prior turn
- AI.7Positive
Off-topic ("write a poem")
- Steps
- Expected
Politely redirects to FAS scope
- AI.8Positive
429 rate-limited
- Steps
- Expected
Friendly retry message
- AI.9Positive
402 payment-required
- Steps
- Expected
Clear message; no crash
- AI.10Positive
Network drop mid-stream
- Steps
- Expected
Graceful error; option to retry
- AI.11Positive
Empty input
- Steps
- Expected
Send disabled
- AI.12Positive
Long markdown reply
- Steps
- Expected
Renders lists/headers; scroll works
- AI.13Positive
Reset chat
- Steps
- Expected
Clears messages
- AI.14Positive
Error-aware nudge
- Steps
- Expected
After first Next with errors, FAB turns red with count badge + tooltip "Tap me — I can explain what {N} field(s) expect."
- AI.15Positive
"Help me fix it" button
- Steps
- Expected
Opens chat with per-field explanations (label, raw error, help)
- AI.16Positive
Nudge dismiss on error-signature change
- Steps
- Expected
Move to next step → nudge resets
- AI.17Positive
Helpdesk escalation
- Steps
- Expected
After 10 user messages → helpdesk card with
9123 4567tel:link
- AI.18Positive
Assistant does NOT modify form fields
- Steps
- Expected
Advisory only
- AI.19Positive
Assistant has no draft access
- Steps
- Expected
Confirms it cannot read raw draft values
- AI.20Positive
Context sent
- Steps
- Expected
stepLabel, fieldErrors, interactionCount, role=citizen, routePath, screen
EMAIL — Email Triggers (Citizen-facing)
- EMAIL.1Positive
Acknowledgement email post-submission
- Steps
- Expected
Sent within 24 h (server-side trigger); arrives from verified domain
notify.capabilityailab.com
- EMAIL.2Positive
Email content correctness
- Steps
- Expected
Contains case number, applicant name, status, contact info
- EMAIL.3Positive
Unsubscribe link
- Steps
- Expected
Token-based; clicking lands on
/unsubscribeand marksused_at
- EMAIL.4Positive
Suppressed email
- Steps
- Expected
Bounced/unsubscribed address → no resend
- EMAIL.5Positive
Deliverability
- Steps
- Expected
Not flagged spam (SPF/DKIM/DMARC pass)
CROSS — Cross-cutting Citizen Portal
Document version: v5
Total scenarios: ~210
Coverage: All business rules (BR-001 through BR-203), all conditional logic, all required/optional matrices, all format validators, all upload constraints, full Singpass mock, AI Assistant + AI Doc Validation modal, submission + success + emails, plus negative + edge cases per step.
- CROSS.1Positive
Mobile viewport (375×667)
- Steps
- Expected
All 10 steps usable; stepper collapses; forms scroll
- CROSS.2Positive
Accessibility
- Steps
- Expected
All fields have labels; errors associated via aria-describedby; tab order logical
- CROSS.3Positive
Performance
- Steps
- Expected
Each step renders < 1.5 s on cold load
- CROSS.4Positive
Access boundary
- Steps
- Expected
Direct navigation to
/officer,/manager,/director,/adminfrom citizen = denied or redirect
- CROSS.5Positive
Resume after refresh on step 6
- Steps
- Expected
Draft hydrates; user lands on intended step
- CROSS.6Positive
Concurrent tabs
- Steps
- Expected
Last-write-wins on draft localStorage (known limitation)
