Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
f8ce9f7
feat: add maestro E2E test app
ajpallares Feb 27, 2026
5cda4d6
fix: add iOS native project files for MaestroTestApp
ajpallares Feb 27, 2026
218eefe
fix: add empty yarn.lock for standalone MaestroTestApp project
ajpallares Feb 27, 2026
18d9a41
fix: pin react-native-screens to ~4.4.0 for RN 0.76 compat
ajpallares Feb 27, 2026
ef166de
fix: update MaestroTestApp .gitignore to match repo conventions
ajpallares Feb 27, 2026
0102aa8
fix: convert MaestroTestApp iOS to Swift AppDelegate
ajpallares Feb 27, 2026
73da28c
feat: add StoreKit configuration for iOS maestro E2E tests
ajpallares Mar 25, 2026
2a5d507
fix: add StoreKit config to Xcode project file references
ajpallares Mar 25, 2026
22530ca
fix: restore correct scheme identifier path for StoreKit config
ajpallares Mar 25, 2026
a231be2
fix: update bundle identifier to com.revenuecat.automatedsdktests
ajpallares Mar 25, 2026
5547354
fix: use correct StoreKit configuration from purchases-ios maestro app
ajpallares Mar 25, 2026
7d5ac03
fix: use removeCustomerInfoUpdateListener instead of listener.remove()
ajpallares Mar 30, 2026
f5276e7
fix: commit resolved yarn.lock for MaestroTestApp
ajpallares Mar 30, 2026
8234eb8
feat: add Android project for MaestroTestApp
ajpallares Mar 30, 2026
9c43d51
chore: remove StoreKit configuration file (using test store instead)
ajpallares Mar 30, 2026
75986fa
Improve Maestro test app: local deps, error handling, types, README
ajpallares Mar 30, 2026
57b3bf3
Use workspace + module-resolver for local deps, surface errors in UI,…
ajpallares Mar 30, 2026
e9d206f
Add error handling to getCustomerInfo, use blockList, regenerate Podf…
ajpallares Mar 30, 2026
86a3b0b
Refresh Podfile.lock (hermes-engine 0.76.6 → 0.76.9)
ajpallares Mar 30, 2026
dd68b80
Add react-native.config.js for native module auto-linking
ajpallares Mar 30, 2026
666833f
Add native module includes to Android settings.gradle
ajpallares Mar 30, 2026
e078ea8
Upgrade MaestroTestApp to React Native 0.78 and align Android toolchain
ajpallares Mar 30, 2026
501ef9f
Pin react-native-screens to ~4.11.0 and refresh lockfiles
ajpallares Mar 30, 2026
d61badc
Update root yarn.lock for react-native-screens ~4.11.0 pin
ajpallares Mar 30, 2026
cf0ccbc
Add @react-native-community/cli to MaestroTestApp devDependencies
ajpallares Mar 30, 2026
1a554ee
fix: make MaestroTestApp CI-ready with embedded JS bundle
ajpallares Apr 6, 2026
c91d3d7
fix: add fatalError for missing jsbundle and document SDK resolution
ajpallares Apr 6, 2026
87e8ba3
fix: don't commit Podfile.lock for MaestroTestApp
ajpallares Apr 6, 2026
82fa025
fix: re-commit Podfile.lock for MaestroTestApp
ajpallares Apr 6, 2026
79ca5af
fix: remove stale MaestroTestApp/yarn.lock
ajpallares Apr 6, 2026
795e8a7
fix: pin react-native to 0.78.3 for Xcode 26.4 compatibility
ajpallares Apr 6, 2026
6fc2caa
fix: bump react-native to 0.78.3 for Xcode 26.4 compatibility
ajpallares Apr 6, 2026
2bd0cb0
revert: undo Podfile.lock re-commitment and react-native version bumps
ajpallares Apr 6, 2026
8867ce7
chore: add MaestroTestApp pod install to bootstrap script
ajpallares Apr 8, 2026
2f04c19
fix: regenerate yarn.lock from main with MaestroTestApp workspace
ajpallares Apr 8, 2026
6a07bb5
feat: add maestro E2E test for purchase through paywall
ajpallares Feb 27, 2026
bc7a053
feat: update maestro tests to match iOS V2 paywall flow and add confi…
ajpallares Mar 25, 2026
8ce936b
refactor: simplify maestro tests to always use test store
ajpallares Mar 30, 2026
5cb2ea8
refactor: remove takeScreenshot steps from maestro tests
ajpallares Mar 30, 2026
d92bf51
fix: use regex in confirm_purchase.yaml to match both iOS and Android…
ajpallares Mar 30, 2026
454a543
fix: tighten confirm_purchase regex to match Test.*Purchase
ajpallares Mar 30, 2026
dcbdeea
refactor: use implicit Maestro timeouts for test store flow
ajpallares Apr 6, 2026
fb8e962
feat: add CircleCI job for maestro E2E tests
ajpallares Feb 27, 2026
93c55de
fix: add CircleCI context and narrow sed targeting
ajpallares Feb 27, 2026
8a6bdbe
fix: use e2e-tests context and production App Store API key for iOS m…
ajpallares Mar 25, 2026
a901d04
feat: split maestro e2e tests into separate iOS and Android workflows
ajpallares Mar 25, 2026
bea31ef
feat: pass MAESTRO_STORE env var to maestro tests in Fastlane lanes
ajpallares Mar 25, 2026
90a4a95
fix: use RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE for Android maestr…
ajpallares Mar 25, 2026
c2c4105
refactor: use test store for all maestro e2e tests (iOS and Android)
ajpallares Mar 30, 2026
e12bde1
Add Maestro e2e test jobs to build-test-hold-deploy PR workflow
ajpallares Mar 30, 2026
0402587
Fix Fastlane path resolution and Android emulator boot timing
ajpallares Mar 30, 2026
f851868
Use Xcode 26.3 and iPhone 17 simulator for Maestro iOS e2e tests
ajpallares Mar 30, 2026
bccdfed
Add install-dependencies step to Maestro CI jobs
ajpallares Mar 30, 2026
c9ea125
Disable immutable installs for Maestro Fastlane yarn install
ajpallares Mar 30, 2026
25f783b
Create test_output directory before maestro test report generation
ajpallares Mar 30, 2026
4443373
Delete Podfile.lock before pod install in iOS Maestro lane
ajpallares Mar 30, 2026
8a53203
Fix Android Maestro: reconnect ADB before install
ajpallares Mar 30, 2026
90b7b0d
Fix Maestro tests: use Release builds for pre-bundled JS
ajpallares Mar 30, 2026
915ea2a
Revert to Debug builds, add FORCE_BUNDLING, screenshots, and test out…
ajpallares Mar 30, 2026
f35e191
Add Android emulator recovery after long Gradle build
ajpallares Mar 30, 2026
62aea21
Refactor Android Maestro CI: use android orb, build before emulator
ajpallares Mar 30, 2026
227a06b
Add diagnostic logging for React Native iOS Maestro launch failure
ajpallares Mar 30, 2026
05751b0
refactor: remove diagnostic logging from iOS maestro lane
ajpallares Apr 6, 2026
3666e55
fix: use committed Podfile.lock instead of regenerating from scratch
ajpallares Apr 6, 2026
f1bd634
fix: use Xcode 26.4 and validate API key replacement
ajpallares Apr 6, 2026
d97e3a8
fix: use pod install --repo-update for fresh lockfile generation
ajpallares Apr 6, 2026
9f76019
fix: remove YARN_ENABLE_IMMUTABLE_INSTALLS=false from maestro lanes
ajpallares Apr 6, 2026
bd0b774
fix: clean Pods directory before pod install in iOS maestro lane
ajpallares Apr 6, 2026
bcead26
fix: restore YARN_ENABLE_IMMUTABLE_INSTALLS=false and clean Pods on CI
ajpallares Apr 6, 2026
b0b0878
fix: use Xcode 26.3 for iOS maestro tests
ajpallares Apr 6, 2026
b19bac4
Merge branch 'main' into e2e-tests-app
ajpallares Apr 9, 2026
403c2bb
Merge branch 'e2e-tests-app' into add-maestro-e2e-test
ajpallares Apr 9, 2026
2d71e7e
Merge branch 'add-maestro-e2e-test' into add-maestro-e2e-test-ci-job
ajpallares Apr 9, 2026
e1d8921
Merge branch 'main' into add-maestro-e2e-test
ajpallares Apr 9, 2026
9560325
Merge branch 'add-maestro-e2e-test' into add-maestro-e2e-test-ci-job
ajpallares Apr 9, 2026
a37ba1e
Merge branch 'main' into add-maestro-e2e-test-ci-job
ajpallares Apr 9, 2026
7e09e35
Merge branch 'main' into add-maestro-e2e-test-ci-job
ajpallares Apr 13, 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
90 changes: 90 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
version: 2.1
orbs:
rn: react-native-community/react-native@8.0.1
android: circleci/android@3.1.0
revenuecat: revenuecat/sdks-common-config@3.16.0

aliases:
Expand Down Expand Up @@ -288,6 +289,67 @@ jobs:
name: release
command: bundle exec fastlane release

run-maestro-e2e-tests-ios:
executor:
name: rn/macos
resource_class: m4pro.medium
xcode_version: '26.3'
steps:
- checkout
- install-ruby-3-2-0
- install-dependencies:
machine: "macos"
- revenuecat/install-gem-mac-dependencies:
cache-version: v2
- revenuecat/install-maestro
- run:
name: Boot iOS Simulator
command: |
xcrun simctl boot "iPhone 17" || true
xcrun simctl bootstatus "iPhone 17" -b
- run:
name: Run Maestro E2E Tests (iOS)
command: bundle exec fastlane run_maestro_e2e_tests_ios
no_output_timeout: 15m
- store_test_results:
path: fastlane/test_output
- store_artifacts:
path: fastlane/test_output

run-maestro-e2e-tests-android:
machine:
image: android:2024.11.1
resource_class: xlarge
steps:
- checkout
- run:
name: Install Ruby and Bundler
command: |
gem install bundler
bundle install
- install-dependencies:
machine: "unix"
- run:
name: Build Maestro app (Android)
command: bundle exec fastlane build_maestro_app_android
no_output_timeout: 15m
- android/create_avd:
avd_name: test-e2e
system_image: system-images;android-34;google_apis;x86_64
install: true
- android/start_emulator:
avd_name: test-e2e
post_emulator_launch_assemble_command: ""
- revenuecat/install-maestro
- run:
name: Run Maestro E2E Tests (Android)
command: bundle exec fastlane run_maestro_e2e_tests_android
no_output_timeout: 15m
- store_test_results:
path: fastlane/test_output
- store_artifacts:
path: fastlane/test_output

update-hybrid-common-versions:
description: "Creates a PR updating purchases-hybrid-common to latest release"
<<: *base-mac-job
Expand Down Expand Up @@ -321,6 +383,14 @@ workflows:
- expo_android
- expo_ios
- expo_web
- run-maestro-e2e-tests-ios:
context:
- maestro-e2e-tests
- e2e-tests
- run-maestro-e2e-tests-android:
context:
- maestro-e2e-tests
- e2e-tests

# Hold and deploy phase - only on release branches
- hold:
Expand Down Expand Up @@ -367,6 +437,26 @@ workflows:
jobs:
- revenuecat/automatic-bump

maestro-e2e-tests-ios:
when:
or:
- equal: ["maestro_e2e_tests", << pipeline.schedule.name >>]
jobs:
- run-maestro-e2e-tests-ios:
context:
- maestro-e2e-tests
- e2e-tests

maestro-e2e-tests-android:
when:
or:
- equal: ["maestro_e2e_tests", << pipeline.schedule.name >>]
jobs:
- run-maestro-e2e-tests-android:
context:
- maestro-e2e-tests
- e2e-tests

update-hybrid-common-versions:
when:
equal: [ upgrade-hybrid-common, << pipeline.parameters.action >> ]
Expand Down
31 changes: 31 additions & 0 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,37 @@ def check_no_git_tag_exists(version_number)
end
end

desc "Run maestro E2E tests on iOS"
lane :run_maestro_e2e_tests_ios do
Dir.chdir("../e2e-tests/MaestroTestApp") do
sh("sed -i '' 's/MAESTRO_TESTS_REVENUECAT_API_KEY/'\"$RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE\"'/g' App.tsx")
sh("grep -q MAESTRO_TESTS_REVENUECAT_API_KEY App.tsx && echo 'ERROR: API key placeholder was not replaced' && exit 1 || true")
sh("YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn install")
sh("rm -rf ios/Pods && cd ios && pod install --repo-update")
sh("FORCE_BUNDLING=1 xcodebuild -workspace ios/MaestroTestApp.xcworkspace -scheme MaestroTestApp -configuration Debug -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' -derivedDataPath build")
sh("xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MaestroTestApp.app")
end
sh("mkdir -p test_output")
sh("maestro test --format junit --output test_output/report.xml --test-output-dir test_output ../e2e-tests/maestro/")
end

desc "Build maestro E2E test app for Android"
lane :build_maestro_app_android do
Dir.chdir("../e2e-tests/MaestroTestApp") do
sh("sed -i 's/MAESTRO_TESTS_REVENUECAT_API_KEY/'\"$RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE\"'/g' App.tsx")
sh("grep -q MAESTRO_TESTS_REVENUECAT_API_KEY App.tsx && echo 'ERROR: API key placeholder was not replaced' && exit 1 || true")
sh("YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn install")
sh("cd android && ./gradlew assembleDebug")
end
end

desc "Run maestro E2E tests on Android (emulator must be running)"
lane :run_maestro_e2e_tests_android do
sh("adb install ../e2e-tests/MaestroTestApp/android/app/build/outputs/apk/debug/app-debug.apk")
sh("mkdir -p test_output")
sh("maestro test --format junit --output test_output/report.xml --test-output-dir test_output ../e2e-tests/maestro/")
end

private_lane :update_sample_podfile_lock_with_retry do |options|
pod_name = options[:pod_name]

Expand Down