From 303f0e03ff50c4f77cf3fbfe3120c53d2127461d Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Wed, 26 Aug 2026 15:56:15 +0200 Subject: [PATCH 1/4] chore(e2e): Bump E2E tests to React Native 0.87.0 Co-Authored-By: Claude Opus 4.8 --- .github/workflows/e2e-v2.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-v2.yml b/.github/workflows/e2e-v2.yml index e17528d79a..52a89948d3 100644 --- a/.github/workflows/e2e-v2.yml +++ b/.github/workflows/e2e-v2.yml @@ -232,7 +232,7 @@ jobs: strategy: fail-fast: false # keeps matrix running if one fails matrix: - rn-version: ["0.71.19", "0.86.2"] + rn-version: ["0.71.19", "0.87.0"] rn-architecture: ["legacy", "new"] platform: ["android", "ios"] build-type: ["production"] @@ -245,7 +245,7 @@ jobs: runs-on: macos-15-xlarge # Use Xcode 26 (macos-26) for newer RN versions - platform: ios - rn-version: "0.86.2" + rn-version: "0.87.0" runs-on: macos-26-xlarge - platform: android runs-on: ubuntu-24.04 @@ -385,7 +385,7 @@ jobs: strategy: fail-fast: false # keeps matrix running if one fails matrix: - rn-version: ["0.86.2"] + rn-version: ["0.87.0"] rn-architecture: ["legacy", "new"] platform: ["android", "ios"] build-type: ["production"] From f20d2d79790b00babd4d80ec41d3ed3e8693585a Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Thu, 27 Aug 2026 10:05:19 +0200 Subject: [PATCH 2/4] ci(e2e): Use Node 22 for RN 0.87 E2E jobs RN 0.87.0 dropped Node 20 from its supported `engines` (0.86.2 allowed `^20.19.4`, 0.87.0 requires `^22.13.0 || ^24.3.0 || >= 26.0.0`), so the E2E jobs must run on Node 22. The `react-native-build` matrix still includes 0.71.19, which stays on Node 20 via a matrix expression to avoid regressing the legacy build onto an untested Node. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/e2e-v2.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-v2.yml b/.github/workflows/e2e-v2.yml index 52a89948d3..4e76b77ecb 100644 --- a/.github/workflows/e2e-v2.yml +++ b/.github/workflows/e2e-v2.yml @@ -315,7 +315,7 @@ jobs: if: ${{ steps.platform-check.outputs.skip != 'true' }} with: package-manager-cache: false - node-version: 20 + node-version: ${{ startsWith(matrix.rn-version, '0.71') && '20' || '22' }} cache: "yarn" cache-dependency-path: yarn.lock @@ -446,7 +446,7 @@ jobs: if: ${{ steps.platform-check.outputs.skip != 'true' }} with: package-manager-cache: false - node-version: 20 + node-version: 22 cache: "yarn" cache-dependency-path: yarn.lock From 3f2823c344f6534c6ed3f4320c47a1cf785c49e6 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 28 Aug 2026 15:25:28 +0200 Subject: [PATCH 3/4] fix(e2e): Offset readiness screen below status bar for RN 0.87 edge-to-edge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RN 0.87 enables edge-to-edge by default, drawing app content behind the system status bar. The injected E2E readiness screen rendered its "E2E Tests Ready" header at y≈0, fully occluded by the status-bar window, so Maestro's assertVisible dropped it from the hierarchy and every Android flow failed at launch. Pad the root View by StatusBar.currentHeight (Android-only; 0 on iOS) so the header clears the status bar. Verified on a physical Pixel 8 Pro (arm64, edgeToEdgeEnabled=true): the readiness Maestro flow now passes and the header renders at y=113. Co-Authored-By: Claude Opus 4.8 --- dev-packages/e2e-tests/src/EndToEndTests.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/src/EndToEndTests.tsx b/dev-packages/e2e-tests/src/EndToEndTests.tsx index e044dac2bc..b0fec06b7e 100644 --- a/dev-packages/e2e-tests/src/EndToEndTests.tsx +++ b/dev-packages/e2e-tests/src/EndToEndTests.tsx @@ -1,6 +1,6 @@ import * as Sentry from '@sentry/react-native'; import * as React from 'react'; -import { Text, View } from 'react-native'; +import { StatusBar, Text, View } from 'react-native'; const E2E_TESTS_READY_TEXT = 'E2E Tests Ready'; @@ -67,7 +67,11 @@ const EndToEndTestsScreen = (): React.JSX.Element => { ]; return ( - + // RN 0.87 enables edge-to-edge by default, drawing content behind the + // status bar. Offset by its height so "E2E Tests Ready" (and the rest of + // the harness UI) stays visible to Maestro's assertVisible. StatusBar + // .currentHeight is Android-only; falls back to 0 on iOS. + {isReady ? E2E_TESTS_READY_TEXT : 'Loading...'} {error} {eventId ? {eventId} : No event ID} From b0c7da12cba314b28fd6ad08f29320c1ffc3f745 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 28 Aug 2026 16:10:09 +0200 Subject: [PATCH 4/4] fix(e2e): Dismiss keyboard before screenshot scroll in Android feedback flow Under RN 0.87 edge-to-edge the open soft keyboard occludes 'Take a screenshot' on CI's shorter viewport, so scrollUntilVisible could never reveal it. Dismiss the keyboard first, mirroring the pre-submit step already used later in the same flow. Co-Authored-By: Claude Opus 4.8 --- .../e2e-tests/maestro/feedback/captureFlow-android.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev-packages/e2e-tests/maestro/feedback/captureFlow-android.yml b/dev-packages/e2e-tests/maestro/feedback/captureFlow-android.yml index a48e577110..2609b8fb9e 100644 --- a/dev-packages/e2e-tests/maestro/feedback/captureFlow-android.yml +++ b/dev-packages/e2e-tests/maestro/feedback/captureFlow-android.yml @@ -30,6 +30,11 @@ jsEngine: graaljs - tapOn: "What's the bug? What did you expect?" - inputText: 'This is a test feedback message with a screenshot from CI e2e tests' +# Hide keyboard by tapping on a non-tappable element. Under RN 0.87 edge-to-edge +# the open keyboard occludes 'Take a screenshot' on shorter viewports (e.g. the +# CI emulator), so dismiss it before scrolling — mirrors the pre-submit step below. +- tapOn: 'Email' + # Take screenshot - scrollUntilVisible: element: