Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
59f5b82
test: add input text maestro subflow
kacperzolkiewski Jul 17, 2026
92195c2
test: run e2e tests with local maestro-runner
kacperzolkiewski Jul 20, 2026
43c1553
test: update screenshots for ios e2e tests
kacperzolkiewski Jul 30, 2026
aae77c7
test: fix doubleTapOn for android
kacperzolkiewski Jul 30, 2026
5043d7f
test: fix mention piopup tests on ios
kacperzolkiewski Jul 31, 2026
45cce94
fix: scroll and insert image tests
kacperzolkiewski Jul 31, 2026
96d11a8
test: fix enrichedText tests
kacperzolkiewski Jul 31, 2026
20605f6
fix: paragraph styles test
kacperzolkiewski Jul 31, 2026
19bf04c
fix: scrolling in ios tests
kacperzolkiewski Jul 31, 2026
86327b1
fix: image loading in tests
kacperzolkiewski Jul 31, 2026
d6a67a7
test: increase timeouts
kacperzolkiewski Jul 31, 2026
d67f51e
Merge branch 'main' into @kacperzolkiewski/feat-maestro-runner
kacperzolkiewski Jul 31, 2026
bb4aed2
Potential fix for pull request finding
kacperzolkiewski Jul 31, 2026
9a4402d
fix: update screenshots
kacperzolkiewski Jul 31, 2026
3f0d1d6
Merge branch '@kacperzolkiewski/feat-maestro-runner' of github.com:so…
kacperzolkiewski Jul 31, 2026
50cdd98
fix: e2e tests
kacperzolkiewski Aug 3, 2026
fe5fce3
fix: scrolling test
kacperzolkiewski Aug 3, 2026
dec087d
test: update screenshots to new maestro version
kacperzolkiewski Aug 3, 2026
797718f
fix: scrolling ios tests
kacperzolkiewski Aug 3, 2026
85578ac
chore: add e2e to CI
kacperzolkiewski Aug 3, 2026
5a29ed8
fix: tte error
kacperzolkiewski Aug 3, 2026
e2d7de5
fix: apply fixes
kacperzolkiewski Aug 3, 2026
a337911
fix: stderr
kacperzolkiewski Aug 3, 2026
02e4404
fix: use pixel_7
kacperzolkiewski Aug 3, 2026
3d04766
fix: update screenshots for pixel 7
kacperzolkiewski Aug 3, 2026
d2134f6
fix: update diffs not only on failure
kacperzolkiewski Aug 3, 2026
dfd833d
fix: add retry for e2e tests startup
kacperzolkiewski Aug 4, 2026
1ae1aa1
fix: driver retries
kacperzolkiewski Aug 4, 2026
fb36552
fix: increase adb timeout
kacperzolkiewski Aug 4, 2026
18840b3
fix: devicelab driver
kacperzolkiewski Aug 4, 2026
dd64985
fix: retry logic
kacperzolkiewski Aug 4, 2026
b2fcd11
fix: try to use reactivecircus/android-emulator-runner@v2
kacperzolkiewski Aug 4, 2026
0e5b54e
fix: uploading reports
kacperzolkiewski Aug 4, 2026
6d6d93e
fix: upload reports on ios
kacperzolkiewski Aug 4, 2026
4cb02b4
fix: pressing context menu buttons
kacperzolkiewski Aug 5, 2026
c7a304c
test: change threashold
kacperzolkiewski Aug 5, 2026
78848ad
fix: context menu buttons press
kacperzolkiewski Aug 5, 2026
a6739ff
fix: swiping in scrolling test
kacperzolkiewski Aug 5, 2026
37acdf7
fix: scrolling
kacperzolkiewski Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
223 changes: 223 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
name: E2E Tests
on:
push:
branches:
- main
pull_request:
branches:
- main
merge_group:
types:
- checks_requested

jobs:
changes:
runs-on: ubuntu-latest
outputs:
android: ${{ steps.filter.outputs.android }}
ios: ${{ steps.filter.outputs.ios }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Check file changes
uses: dorny/paths-filter@v3
id: filter
with:
filters: |
android:
- 'android/**'
- 'apps/example/android/**'
- 'apps/example/src/**'
- 'src/**'
- 'cpp/**'
- 'package.json'
- 'apps/example/package.json'
- 'react-native.config.js'
- 'babel.config.js'
- '.maestro/**'
ios:
- 'ios/**'
- 'apps/example/ios/**'
- 'apps/example/src/**'
- 'src/**'
- 'cpp/**'
- '*.podspec'
- 'package.json'
- 'apps/example/package.json'
- 'react-native.config.js'
- 'babel.config.js'
- '.maestro/**'

e2e-ios:
needs: [changes]
if: needs.changes.outputs.ios == 'true'
runs-on: macos-latest
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Restore cocoapods
id: cocoapods-cache
uses: actions/cache/restore@v4
with:
path: |
**/ios/Pods
key: ${{ runner.os }}-cocoapods-${{ hashFiles('apps/example/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-cocoapods-

- name: Install cocoapods
if: steps.cocoapods-cache.outputs.cache-hit != 'true'
run: |
cd apps/example/ios
pod install
env:
NO_FLIPPER: 1

- name: Cache cocoapods
if: steps.cocoapods-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
**/ios/Pods
key: ${{ steps.cocoapods-cache.outputs.cache-key }}

- name: Restore Xcode DerivedData
uses: actions/cache/restore@v4
id: derived-data-cache
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ runner.os }}-derived-data-${{ hashFiles('ios/**', 'apps/example/ios/**', 'cpp/**', 'src/**') }}
restore-keys: |
${{ runner.os }}-derived-data-

- name: Install maestro-runner
run: |
curl -fsSL https://open.devicelab.dev/install/maestro-runner | bash
echo "$HOME/.maestro-runner/bin" >> $GITHUB_PATH

- name: Start Metro
run: yarn example start &

- name: Run E2E tests
run: yarn test:e2e:ios

- name: Cache Xcode DerivedData
if: steps.derived-data-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: ~/Library/Developer/Xcode/DerivedData
key: ${{ steps.derived-data-cache.outputs.cache-primary-key }}

- name: Upload test artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: e2e-ios-artifacts
path: |
reports/
.maestro/enrichedInput/screenshots/android/*_diff.png
.maestro/enrichedText/screenshots/android/*_diff.png

e2e-android:
needs: [changes]
if: needs.changes.outputs.android == 'true'
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Install JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Install maestro-runner
run: |
curl -fsSL https://open.devicelab.dev/install/maestro-runner | bash
echo "$HOME/.maestro-runner/bin" >> $GITHUB_PATH

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/wrapper
~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('apps/example/android/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: AVD cache
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-api-36-x86_64

- name: Create AVD and generate snapshot for caching
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 36
target: google_apis_playstore
arch: x86_64
profile: pixel_7
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim
disable-animations: false
enable-hw-keyboard: true
script: echo "Generated AVD snapshot for caching."

- name: Start Metro
run: yarn example start &

- name: Run E2E tests
id: e2e-tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 36
target: google_apis_playstore
arch: x86_64
profile: pixel_7
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim
disable-animations: true
disable-spellchecker: true
enable-hw-keyboard: true
script: EMULATOR_SERIAL=emulator-5554 .maestro/scripts/run-tests-ci-android.sh
env:
JAVA_OPTS: '-XX:MaxHeapSize=6g'

- name: Upload test artifacts
if: ${{ !cancelled() && (steps.e2e-tests.outcome == 'success' || steps.e2e-tests.outcome == 'failure') }}
uses: actions/upload-artifact@v4
with:
name: e2e-android-artifacts
if-no-files-found: warn
path: |
reports/
.maestro/enrichedInput/screenshots/android/*_diff.png
.maestro/enrichedText/screenshots/android/*_diff.png
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ nitrogen/

# Maestro screenshot diffs
.maestro/**/*_diff.png
reports/

# Claude skills
.claude/skills/*-internal.md
15 changes: 12 additions & 3 deletions .maestro/enrichedInput/flows/checkbox_toggle.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,22 @@ appId: swmansion.enriched.example

- tapOn:
id: "toolbar-checkbox-list"
- inputText: "Item one"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Item one"
- pressKey: Enter
- inputText: "Item two"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Item two"
- pressKey: Enter

- pressKey: Backspace
- inputText: "Plain text"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Plain text"
- pressKey: Enter

- tapOn:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ appId: swmansion.enriched.example
- tapOn:
id: "toolbar-code-block"

- inputText: "Hello example.com"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Hello example.com"

- assertVisible:
id: "toolbar-link"
Expand Down
5 changes: 4 additions & 1 deletion .maestro/enrichedInput/flows/codeblock_style_blocking.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ appId: swmansion.enriched.example
- tapOn:
id: "toolbar-code-block"

- inputText: "ABC example.com"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "ABC example.com"

- assertVisible:
id: "toolbar-bold"
Expand Down
25 changes: 20 additions & 5 deletions .maestro/enrichedInput/flows/conflicting_paragraph_merge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,20 @@ appId: swmansion.enriched.example

- tapOn:
id: "toolbar-code-block"
- inputText: "Code text"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Code text"
- pressKey: Enter

- tapOn:
id: "toolbar-code-block"
- tapOn:
id: "toolbar-heading-1"
- inputText: "H1"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "H1"

# Position cursor at start of H1 line
- tapOn:
Expand All @@ -30,7 +36,10 @@ appId: swmansion.enriched.example
- runFlow:
commands:
- pressKey: Backspace
- inputText: " "
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: " "

- tapOn:
id: "editor-input"
Expand All @@ -42,14 +51,20 @@ appId: swmansion.enriched.example

- tapOn:
id: "toolbar-inline-code"
- inputText: "Inline code"
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: "Inline code"

- tapOn:
id: "editor-input"
point: "5%, 75%"

- pressKey: Backspace
- inputText: " "
- runFlow:
file: '../../subflows/input_text.yaml'
env:
TEXT: " "

- runFlow:
file: "../subflows/capture_or_assert_screenshot.yaml"
Expand Down
Loading
Loading