Testing and quality gates
Run the complete Flutter, parser, Android, and device validation workflow.
Local quality gate
cd salli_app
flutter pub get
dart format --output=none --set-exit-if-changed .
flutter analyze --no-fatal-infos
flutter test
dart run tool/sms_pilot_report.dart
flutter build apk --debug
Check the exit code of each command directly. Do not pipe a critical command through a truncating utility that hides failure.
Test layers
| Layer | Examples |
|---|---|
| Domain | Money, Safe to Spend, rollover, goals, runway, seettu, analytics |
| Data | Drift schema/migrations, backup, receipt extraction, attachments, rates |
| SMS | filters, senders, templates, classifier, dedup, background, unmatched queue |
| Application | hydration, serialized writes, reactive finance, widget snapshot |
| Widgets | onboarding, Home, Activity, editor, budgets, accounts, settings, reports |
| Contracts | privacy copy, accessibility, modal behavior, bottom insets, CI workflow |
| Device | receiver, permissions, notifications, widget, encrypted startup, OCR |
SMS without a SIM
- SMS Lab: paste a message and inspect parser/classifier evidence.
- Debug receiver:
tools/inject-sms.shexercises the native-to-Dart capture pipeline on a connected Android device. - Emulator SMS:
adb emu sms sendtests the genuine OS delivery path.
SMS Lab does not prove broadcast-receiver behavior. Debug injection does not prove carrier/SIM delivery.
Real evidence gate
Before beta, run the reviewed real fixture with:
dart run tool/sms_pilot_report.dart --require-real-evidence
A synthetic-only corpus must fail this stricter gate. The target is at least 90 reviewed, redacted samples across the complete P0 bank/format matrix.
Physical-device matrix
- low/mid Android device with permission on/off transitions;
- background/killed/reboot cases;
- widget private and visible states;
- physical iPhone for OCR and app lifecycle;
- English, Sinhala, and Tamil;
- light/dark/system appearance; and
- large text and screen-reader checks.