Files
opencode-mobile/.maestro/flows/activation-positive.yaml
engineer 01dd0191b3 test(activation): add Maestro E2E coverage for the activation flow
Adds deterministic end-to-end coverage for first-open -> telemetry consent
-> server URL entry -> connect -> send first message -> receive reply,
targeting the 0%-7-day-retention investigation (GitHub issue #76).

- tests/fixtures/mock-opencode-server.ts: dependency-free HTTP+SSE stub
  matching the REAL client protocol (src/lib/sdk.ts) — REST + a single
  long-lived GET /global/event SSE stream, no WebSocket. Supports a
  --fail-auth mode that 401s every request to exercise the connect-time
  auth-failure class.
- .maestro/flows/activation-positive.yaml: consent -> quick connect ->
  new session -> send message -> assert streamed reply renders, with a
  screenshot at every step (positive-S1..S8).
- .maestro/flows/activation-negative-401.yaml: same setup against the
  --fail-auth server, asserts Quick Connect's existing "Connection Failed"
  alert is shown (not silently swallowed) and that the connection is not
  saved. Flags in comments that Advanced-mode Save (handleAdvancedSave)
  still has no testConnection() check and is a known, uncovered gap.
- testID props added (no restructuring) to the screens/components the
  flows drive: TelemetryConsentModal, connection/add.tsx, tabs/index.tsx,
  session/[id].tsx, MessageBubble.
- .github/workflows/activation-e2e.yml: new CI job — Android emulator via
  reactivecircus/android-emulator-runner, builds the debug-signed APK,
  starts both mock server instances, runs both Maestro flows, uploads
  screenshots via actions/upload-artifact. Kept separate from the existing
  vision-driven cua-smoke.yml, which needs a live server + LLM and isn't
  suited to tight deterministic regression assertions.
- .gitignore: Maestro takeScreenshot output is never committed.

Verified locally: mock server exercised standalone via curl (health,
project/current, path, session create, SSE event ordering, message
persistence) in both normal and --fail-auth modes; both Maestro flow
files validated as well-formed YAML; tsc --noEmit clean on all changed
files. No lint script exists in this repo (N/A). Full emulator execution
was not run — no Android SDK/emulator available in this environment.

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

75 lines
2.0 KiB
YAML

appId: cc.agentlabs.opencode
name: Activation - positive path (consent -> connect -> send -> reply)
---
# Positive activation flow: first launch -> telemetry consent -> quick connect
# to the mock opencode server (tests/fixtures/mock-opencode-server.ts, run
# normally on the port below) -> connected indicator -> new session -> send a
# message -> assert the streamed canned reply renders.
#
# The CI job starts `node tests/fixtures/mock-opencode-server.ts --port 4096`
# on the runner host BEFORE this flow runs. The Android emulator reaches the
# runner host via the standard emulator alias 10.0.2.2.
- launchApp:
clearState: true
- takeScreenshot: positive-S1_launch_consent_modal
- assertVisible:
id: "telemetry-consent-card"
- tapOn:
id: "telemetry-decline-button"
- assertVisible:
text: "No Connection"
- takeScreenshot: positive-S2_empty_state
- tapOn:
id: "add-connection-button"
- assertVisible:
id: "connect-ip-input"
- takeScreenshot: positive-S3_add_connection_form
- tapOn:
id: "connect-ip-input"
- inputText: "10.0.2.2"
- tapOn:
id: "connect-port-input"
- eraseText
- inputText: "4096"
- hideKeyboard
- takeScreenshot: positive-S4_server_url_entered
- tapOn:
id: "connect-submit-button"
- extendedWaitUntil:
visible:
id: "connection-status-dot"
timeout: 20000
- assertVisible:
id: "connection-status-dot"
- takeScreenshot: positive-S5_connected
- tapOn:
id: "new-session-fab"
- extendedWaitUntil:
visible:
id: "chat-message-input"
timeout: 15000
- takeScreenshot: positive-S6_session_opened
- tapOn:
id: "chat-message-input"
- inputText: "Hello from the activation e2e test"
- hideKeyboard
- takeScreenshot: positive-S7_message_typed
- tapOn:
id: "chat-send-button"
- extendedWaitUntil:
visible:
text: "Hello from the mock opencode server"
timeout: 20000
- assertVisible:
id: "chat-bubble-assistant"
- assertVisible:
text: "Hello from the mock opencode server"
- takeScreenshot: positive-S8_reply_received