Context
With the native harness in place (#30), Patrol now genuinely runs - and the
shipped test genuinely fails:
π Total: 1 β
Successful: 0 β Failed: 1
Expected: exactly one matching candidate
[<'e2e_home_content'>]: []
Which: means none were found but one was expected
app_e2e_test.dart:20
Evidence: run 32966672465.
integration_test/app_e2e_test.dart enters credentials, taps
e2e_login_submit, then asserts e2e_home_content. The sample auth flow posts
to BASE_URL. With no server the login call fails, the app stays on the login
screen, and the assertion cannot pass - in CI, and on any fresh clone.
This is a starter. Every fork inherits it. Shipping an E2E suite that is red by
construction trains people to ignore it, which is how the four-month-red main
in #11 happened.
Proposed shape
Split into two tests:
- Smoke, always runs, no backend. App boots, routes to login, renders
e2e_login_submit, and the form accepts input. This genuinely exercises the
whole native harness, app bootstrap, routing, and localization - it is not a
token test.
- Authenticated flow, opt-in. The existing auth to home assertions, with
skip: !bool.fromEnvironment('E2E_BACKEND'). Teams with a real API run
patrol test --dart-define=E2E_BACKEND=true. patrolTest supports skip:
(patrol 3.20.0 lib/src/common.dart:87).
Also in scope
integration_test/auth_flow_test.dart asserts e2e_home_content the same way
and has the same problem.
tool/golden/{stripped,no_tasks,no_feature_flags}/integration_test/ carry
counterparts of both files. Per CLAUDE.md, changing a file with a
tool/golden/* counterpart means updating that counterpart too, or
strip-smoke.yml breaks.
Acceptance criteria
- A
workflow_dispatch run of E2E Android on main reports Total: greater
than 0, Failed: 0, and the job concludes success with no backend
configured. Record the run id and paste the summary.
- The skipped authenticated test is visible as skipped, not silently absent:
the summary shows a non-zero Skipped: count.
- The smoke test asserts something real - at minimum that
e2e_login_submit renders. A test that only calls app.main() does not
count.
integration_test/auth_flow_test.dart is consistent with the same approach.
- All six
tool/golden/*/integration_test/*.dart counterparts are updated, and
the Strip + analyze + test check passes.
integration_test/README.md documents how to run the authenticated flow
(--dart-define=E2E_BACKEND=true) and states plainly that it is skipped by
default and why.
./scripts/dev/audit_template.sh exits 0.
Context
With the native harness in place (#30), Patrol now genuinely runs - and the
shipped test genuinely fails:
Evidence: run 32966672465.
integration_test/app_e2e_test.dartenters credentials, tapse2e_login_submit, then assertse2e_home_content. The sample auth flow poststo
BASE_URL. With no server the login call fails, the app stays on the loginscreen, and the assertion cannot pass - in CI, and on any fresh clone.
This is a starter. Every fork inherits it. Shipping an E2E suite that is red by
construction trains people to ignore it, which is how the four-month-red
mainin #11 happened.
Proposed shape
Split into two tests:
e2e_login_submit, and the form accepts input. This genuinely exercises thewhole native harness, app bootstrap, routing, and localization - it is not a
token test.
skip: !bool.fromEnvironment('E2E_BACKEND'). Teams with a real API runpatrol test --dart-define=E2E_BACKEND=true.patrolTestsupportsskip:(patrol 3.20.0
lib/src/common.dart:87).Also in scope
integration_test/auth_flow_test.dartassertse2e_home_contentthe same wayand has the same problem.
tool/golden/{stripped,no_tasks,no_feature_flags}/integration_test/carrycounterparts of both files. Per CLAUDE.md, changing a file with a
tool/golden/*counterpart means updating that counterpart too, orstrip-smoke.ymlbreaks.Acceptance criteria
workflow_dispatchrun of E2E Android onmainreportsTotal:greaterthan 0,
Failed: 0, and the job concludes success with no backendconfigured. Record the run id and paste the summary.
the summary shows a non-zero
Skipped:count.e2e_login_submitrenders. A test that only callsapp.main()does notcount.
integration_test/auth_flow_test.dartis consistent with the same approach.tool/golden/*/integration_test/*.dartcounterparts are updated, andthe Strip + analyze + test check passes.
integration_test/README.mddocuments how to run the authenticated flow(
--dart-define=E2E_BACKEND=true) and states plainly that it is skipped bydefault and why.
./scripts/dev/audit_template.shexits 0.