Files
opencode-mobile/.maestro/flows/activation-negative-401.yaml
engineer 7ca5d2eb19 test(activation): address code-review findings on E2E flows, mock, CI
Review fixes (REQUEST_CHANGES round 1):

1. HIGH activation-negative-401.yaml: after dismissing the "Connection
   Failed" alert the app stays on the Add-Connection modal
   (handleQuickConnect's failure branch never calls router.back()), so the
   old `text: "No Connection"` assertion (Sessions-tab empty state) could
   never pass. Now asserts connect-submit-button is still visible instead.

2. MEDIUM mock-opencode-server.ts: prompt_async now parses the request
   body, persists the USER's message, and broadcasts it (message.updated +
   message.part.updated) BEFORE the canned assistant reply — matching real
   server behavior. Without this, the app's handleEvent strips the
   optimistic temp- user message when the assistant's message.updated
   arrives and the sent message vanishes from the transcript.
   activation-positive.yaml now also asserts chat-bubble-user and the
   user's message text are visible after the reply lands, so that
   regression class is actually covered.

3. MEDIUM activation-e2e.yml: timeout-minutes 15 -> 60. The job runs the
   same npm install + prebuild + assembleRelease + emulator pipeline that
   cua-smoke.yml budgets 60 min for (emulator-boot-timeout alone is 10 min).

4. MEDIUM activation-e2e.yml: replicated cua-smoke.yml's "Purge stale
   generated sources" step — the Gradle cache key/restore-keys are shared
   with that workflow, so the stale-autolinking-tree failure mode
   (compileReleaseJavaWithJavac against the old package id) applies here too.

Verified locally: tsc --noEmit clean; npm test 81/81 pass; all three
touched YAML files parse valid; mock server exercised standalone —
full prompt cycle confirms GET /session/:id/message returns BOTH user
and assistant messages, SSE order is message.updated(user) ->
message.part.updated(user) -> busy -> message.updated(assistant) ->
message.part.updated(assistant) -> idle, user events carry the
sessionID/messageID fields handleEvent filters on, and --fail-auth
mode returns 401. Still no emulator run in this environment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NJKAQ6HAikWGQK7PGZ5Y4E
2026-07-16 17:19:46 -07:00

71 lines
2.5 KiB
YAML

appId: cc.agentlabs.opencode
name: Activation - negative path (connect-time 401 must surface a visible error)
---
# Negative activation flow — regression test for the GitHub issue #76 failure
# class: a connect-time 401 from the server must produce a visible, actionable
# error, never a silent failure.
#
# Quick Connect (app/connection/add.tsx handleQuickConnect) calls
# testConnection() -> client.global.health() BEFORE saving the connection.
# When that call fails (any thrown error, including a 401 API error), the
# screen runs probeConnection() and shows a native Alert titled
# "Connection Failed" with the underlying error text — this is the CURRENT,
# already-correct behavior we are locking in with this test.
#
# Known gap (see report): Advanced-mode "Save Connection" (handleAdvancedSave)
# does NOT call testConnection() at all — it saves the connection and
# navigates back regardless of server reachability, so a 401 there is
# currently silent. That gap is not covered by this flow (Quick Connect is the
# only entry point that already does the right thing) — flagged in the E2E
# report as follow-up work, not silently fixed here.
#
# The CI job starts `node tests/fixtures/mock-opencode-server.ts --port 4097
# --fail-auth` on the runner host BEFORE this flow runs, so every request the
# app makes to it (including /global/health) returns HTTP 401.
- launchApp:
clearState: true
- assertVisible:
id: "telemetry-consent-card"
- tapOn:
id: "telemetry-decline-button"
- takeScreenshot: negative-S1_consent_dismissed
- assertVisible:
text: "No Connection"
- tapOn:
id: "add-connection-button"
- takeScreenshot: negative-S2_add_connection_form
- tapOn:
id: "connect-ip-input"
- inputText: "10.0.2.2"
- tapOn:
id: "connect-port-input"
- eraseText
- inputText: "4097"
- hideKeyboard
- takeScreenshot: negative-S3_401_server_url_entered
- tapOn:
id: "connect-submit-button"
- extendedWaitUntil:
visible:
text: "Connection Failed"
timeout: 20000
- assertVisible:
text: "Connection Failed"
- assertVisible:
text: "401"
- takeScreenshot: negative-S4_visible_error_alert
# The connection must NOT have been silently saved: dismiss the alert and
# confirm we are still on the add-connection screen, not a fake "connected"
# screen. (handleQuickConnect's failure branch never calls router.back(), so
# the app stays on this modal — the Sessions-tab "No Connection" empty state
# is NOT visible here.)
- tapOn: "OK"
- assertVisible:
id: "connect-submit-button"
- takeScreenshot: negative-S5_still_on_add_connection_after_dismiss