Public demo BDD execution evidence
The feature-owned runnable suite is feature/outreach/app/test/src/bdd/outreach.feature.
It exercises the actual ten OutreachPage journeys with real button taps, text entry,
and Select popup option taps, then asserts business records and inventory. The same
controller instance is used when switching to the operations view. The suite also
checks ten invalid submissions: failed transactions leave the world unchanged and
editable values remain intact; missing consent and whitespace-only inquiry input
are blocked by disabled controls with their effective enabled state asserted.
The detailed requirements remain in feature/outreach/app/features/*.feature.
The executable suite covers representative main and invalid journeys rather than
claiming that twenty scenarios independently exhaust every acceptance criterion.
The feature-specific transaction and widget tests provide additional cancellation,
stock-conflict, reset, locale and responsive coverage.
Executed locally
| Evidence | Command (from the owning package) | Result |
|---|---|---|
| Feature BDD generation | dart run build_runner build in feature/outreach/app |
PASS: generated test/src/bdd/outreach.widget_test.dart; exit 0 |
| Runnable feature BDD | flutter test --no-pub test/src/bdd/outreach.widget_test.dart --reporter expanded |
PASS: 20 scenarios; exit 0 |
| BDD source analysis | dart analyze --format machine test/src/bdd |
PASS: 0 errors and 0 warnings |
| Application Patrol generation | dart run build_runner build in app/app |
PASS: generated integration_test/outreach/journeys.patrol_test.dart; exit 0 |
| Application Patrol source analysis | dart analyze --format machine integration_test/outreach |
PASS: 0 errors and 0 warnings |
| Actual application Patrol execution | Chrome, COB_RUNTIME_MODE=localOnly, WEB_URL_STRATEGY=hash |
PASS: 20/20, zero failed/skipped, 4m05s; exit 0; HTML and JSON captured |
| Actual console Patrol execution | Chrome, actual console startup, English/Arabic and surface changes | PASS: 3/3, zero failed/skipped, 16s; exit 0; HTML and JSON captured |
| App count guard | Recursive scenario discovery against actual Playwright JSON | PASS: 20/20 scenarios |
| Console count guard | Recursive scenario discovery against the actual Playwright JSON | PASS: 3/3 scenarios |
| Nonserver workspace regression | SKIP_SERVER=1 tool/dev/test_all.sh |
PASS: all 16 packages; exit 0 |
| Nested scenario count guard | python3 -m unittest tool/gates/tests/test_check_patrol_count.py |
PASS: 5 tests, including rejecting omitted nested scenarios |
Local execution logs are /tmp/outreach-bdd-generation.log,
/tmp/outreach-bdd-widget.log, /tmp/outreach-patrol-generation.log,
/tmp/outreach-patrol-run-verbose.log,
/tmp/outreach-console-patrol-run.log, /tmp/outreach-patrol-final-run.log,
and /tmp/outreach-patrol-analyze.log.
CI should retain equivalent logs as run artifacts.
Scenario-to-behavior mapping
| Demo | Main journey and assertions | Invalid action and preservation |
|---|---|---|
| Bus | Search, select departure and two seats, confirm; exactly one ticket, expected fare and occupied seats; same ticket in operations | Past date rejected; date text and business world unchanged |
| Golf | Tee time, lodging option and confirmation; tee unavailable, two rooms and four meals deducted; same reservation in operations | Lodging shortage rejects whole package; tee, room and meal inventories unchanged |
| Travel comparison | Choose two products, select departure, enter note and inquire; product/departure/comparison/note/total recorded | Zero budget rejected; original filter state and budget input retained |
| Travel chat | Select tour/date, begin chat, send a question and book; booking retains conversation context and message | Whitespace message rejected; draft and conversation retained |
| Exam study | Recommend curriculum, add three courses, consent and enroll; expected cart and tuition recorded | Missing consent rejected; curriculum selection retained |
| Baby subscription | Product, review, recurring consent and subscribe; active subscription and expected next date | Missing consent disables subscribe; reviewed options retained |
| Bedding | Product details, cart, confirmation and checkout; order and exact stock deduction | Whitespace inquiry disables send; inquiry text retained |
| Distillery | Session, confirmation and visit booking; expected remaining capacity | Past visit date rejected; date input and business world retained |
| English placement | Answer five practice items, choose recommended class and consultation slot; correct score, class and slot deduction | Advancing without an answer rejected; question and answers retained |
| Dining and gifts | Reserve room, enter gift message and order; separate room/order records, room blocked and gift stock deducted | Sunday delivery rejected; gift date, message, cart and inventory retained |
Shared steps and actual application execution
The pinned co_bdd parser recognizes the Scenario Outline heading but does not
expand Examples rows (feature_parser.dart, lines 185–243 at package ref
5b479112d5f4c017572b304656239983d9cfae92). Therefore every demo is an explicit
scenario using the same composite steps. This ensures twenty real test executions
instead of an unexpanded placeholder scenario. No generator output is edited by
hand.
The application-owned app/app/integration_test/outreach/journeys.feature uses
patrol-only. Its Given step boots the actual app/main.dart, navigates with
OutreachRoute, obtains the application's own outreachRuntime controller, and
resets that isolated scenario. Action and assertion steps are generated mirrors of the feature BDD
implementations. The Flutter web test compiler cannot resolve relative imports
into another package's test directory. sync_steps.py copies the six test-only
helpers into the application test boundary; sync_steps.py --check fails on any
drift. The CI Patrol job runs this check before executing browser tests. No test
helper is added to production libraries and no dependency cycle is introduced.
Patrol execution is separate from widget execution and from public URL smoke tests.
The Select popup contains an animated search caret. The test helper advances its
opening transition by a bounded frame duration, then clicks the actual option;
it does not call onChanged directly or wait for an impossible globally idle
caret frame. All other action and business assertions remain unchanged.
CI discovers Patrol files recursively and the count guard counts .feature
scenarios recursively. Empty target lists fail before launch, and the JSON report
must match all expected scenarios with no failures, flaky cases or skips. The
obsolete kernel login scenarios were retired when the application entry points
changed to these public demo journeys. The console now tests actual inventory,
English/Arabic changes and customer/operations switching.
Final browser artifacts: /tmp/outreach-patrol-final-report/index.html,
/tmp/outreach-patrol-final-report/results.json,
/tmp/outreach-console-patrol-report/index.html, and
/tmp/outreach-console-patrol-report/results.json. The recursive count guards
verified 20/20 app scenarios and 3/3 console scenarios against these actual reports.
The complete nonserver workspace regression completed with all 16 packages
passing (/tmp/outreach-workspace-tests.log). Existing platform-specific golden
suites report local skips; this result does not substitute for Linux golden
capture/compare evidence. The latest booking widget suite includes cancellation
and rebooking after customer/operations remount, preserving idempotence while
allowing a distinct new transaction.