An Official Government Portal

FAS 2.0 — Test Scenarios (v5)

Walk through scenarios in your browser. Progress is saved on this device.

0 pass0 fail267 untested267 total

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

    1234567 and 123456789012345

    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}.pdf with 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 /citizen page

  • 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 4567 tel: 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 /unsubscribe and marks used_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, /admin from 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)