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 127.0.0.1. - 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: "127.0.0.1:4096" - hideKeyboard - takeScreenshot: positive-S4_server_url_entered - tapOn: id: "connect-submit-button" # Quick Connect fires up to 3 sequential/parallel network calls before the # dot renders (testConnection's health(), then addConnection's parallel # project.current() + path.get()), and each individual fetch is capped by # src/lib/sdk.ts REQUEST_TIMEOUT_MS = 30_000. A 20s wait here raced that # 30s client-side timeout and flaked in CI (first real run, #82) even # though the mock server was up and reachable. 40s gives the app's own # timeout room to complete; this still asserts the real thing, just with a # wait that isn't shorter than the code path it's waiting on. - extendedWaitUntil: visible: id: "connection-status-dot" timeout: 40000 - 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" # The USER's message must still be in the transcript after the reply lands. # Regression guard: any message.updated event strips optimistic temp- # messages (src/stores/sessions.ts handleEvent), so if the server never # persisted/broadcast the user's message, it would vanish here. - assertVisible: id: "chat-bubble-user" - assertVisible: text: "Hello from the activation e2e test" - takeScreenshot: positive-S8_reply_received