Skip to content

Skip test cases list in maestro tests using launch arguments#1714

Merged
ajpallares merged 35 commits into
mainfrom
pallares/maestro-launch-args
Apr 15, 2026
Merged

Skip test cases list in maestro tests using launch arguments#1714
ajpallares merged 35 commits into
mainfrom
pallares/maestro-launch-args

Conversation

@ajpallares
Copy link
Copy Markdown
Member

@ajpallares ajpallares commented Apr 8, 2026

Summary

  • Pass e2e_test_flow as a Maestro launchApp argument so the app navigates directly to the target test case screen, bypassing the Test Cases list
  • Uses a MethodChannel to bridge the launch argument from native (iOS UserDefaults / Android intent extras) to Dart
  • Makes maestro tests faster by skipping the list navigation step
  • The Test Cases list is preserved for manual/local usage

Related PRs

Follows the same pattern as the iOS SDK's maestro app (purchases-ios/Examples/rc-maestro).


Note

Low Risk
Changes are limited to the Maestro E2E test harness app and its test flow YAML, adding a small native↔Dart MethodChannel bridge and startup routing logic; low impact outside automated tests.

Overview
Adds support for passing an e2e_test_flow launch argument from Maestro into the Flutter MaestroTestApp via a new native MethodChannel (com.revenuecat.maestro/launch_args) on both Android (intent extra) and iOS (UserDefaults).

On startup, the app now looks up the matching testCases entry by a new flowKey and navigates directly to that test case screen, otherwise falling back to the existing Test Cases list for manual runs. The Maestro purchase_through_paywall.yaml flow is updated to launch the app with the new argument and skip list navigation.

Reviewed by Cursor Bugbot for commit 8e21103. Bugbot is set up for automated code reviews on this repo. Configure here.

Made-with: Cursor
The default Flutter widget test references MyApp which doesn't exist
in this project (the app class is MaestroTestApp).

Made-with: Cursor
- Lower Gradle JVM from 8G/4G to 4G/2G (sufficient for a minimal test app)
- Simplify README setup: flutter pub get is all that's needed

Made-with: Cursor
- Add `mounted` guard before every setState after an async gap
- Remove unused Widget Key identifiers (Maestro uses text selectors)
- Add flutter_lints to dev_dependencies (analysis_options.yaml referenced it)
- Remove leftover flutter create TODO comments from build.gradle.kts
- Remove CocoaPods from README prerequisites (flutter build handles it)

Made-with: Cursor
These steps were only used for debugging CI failures and add
unnecessary clutter to the CI report.

Made-with: Cursor
Both iOS and Android Test Store dialogs use the same text, so the
regex patterns are unnecessary. Use exact strings like the native
iOS SDK's maestro tests do.

Made-with: Cursor
Replace manual flutter precache + pod install + xcodebuild with
the idiomatic `flutter build ios --debug --simulator`, which handles
all intermediate steps automatically.

Made-with: Cursor
Fail fast with a clear error if RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE
is not set, instead of silently replacing the placeholder with an empty
string and crashing at runtime.

Made-with: Cursor
@ajpallares ajpallares force-pushed the add-maestro-e2e-test-ci-job branch from 028102c to 0fe57e2 Compare April 8, 2026 12:42
Pass e2e_test_flow as a launchApp argument so the app navigates
directly to the target test case screen, making tests faster.
The Test Cases list is preserved for manual/local usage.

Made-with: Cursor
@ajpallares ajpallares force-pushed the pallares/maestro-launch-args branch from 802197e to 7c3d105 Compare April 10, 2026 08:50
The map values were never used — only .containsKey() was called,
then the routing hardcoded the same string comparison anyway.
Also catch MissingPluginException specifically with a debugPrint
for diagnosability.

Made-with: Cursor
ajpallares added a commit to RevenueCat/react-native-purchases that referenced this pull request Apr 13, 2026
## Summary
- Pass `e2e_test_flow` as a Maestro `launchApp` argument so the app
navigates directly to the target test case screen, bypassing the Test
Cases list
- Reads the argument via `initialProps` on iOS (UserDefaults) and
Android (intent extras)
- Makes maestro tests faster by skipping the list navigation step
- The Test Cases list is preserved for manual/local usage

## Related PRs
- RevenueCat/purchases-kmp#796
- RevenueCat/purchases-flutter#1714
- RevenueCat/purchases-capacitor#757
- RevenueCat/cordova-plugin-purchases#919
- RevenueCat/purchases-unity#897

Follows the same pattern as the iOS SDK's maestro app
(`purchases-ios/Examples/rc-maestro`).

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
ajpallares and others added 7 commits April 15, 2026 10:59
The test app no longer uses CocoaPods (removed in PR1), so there's
no need to install it for the Maestro E2E tests.

Made-with: Cursor
Extract test case definitions to test_cases.dart and use them for
both the TestCasesScreen list and the launch-arg routing. Adding a
new test case is now a single entry in test_cases.dart.

Made-with: Cursor
- Remove Podfile and Podfile.lock (project already uses SPM via
  FlutterGeneratedPluginSwiftPackage; zero CocoaPods refs in pbxproj)
- Remove Pods #include? from Debug/Release xcconfig
- Add enable-swift-package-manager: true to pubspec.yaml
- Extract test case definitions to test_cases.dart for extensibility
  (single source of truth for title, flowKey, and screen widget)
- Refactor TestCasesScreen to build from the shared list

Made-with: Cursor
Avoids eagerly constructing all screen widgets upfront — the widget
is only created when the user navigates to it.

Made-with: Cursor
Resolve conflict in test_cases.dart: keep flowKey from PR4 and
builder function from PR1, update main.dart to use builder().

Made-with: Cursor
Only e2e-tests context is needed, matching purchases-ios.

Made-with: Cursor
Fail fast if the placeholder was not replaced, matching KMP.

Made-with: Cursor
@ajpallares ajpallares marked this pull request as ready for review April 15, 2026 10:56
@ajpallares ajpallares requested a review from a team as a code owner April 15, 2026 10:56
ajpallares added a commit that referenced this pull request Apr 15, 2026
## Summary

Adds a Maestro E2E test app under `e2e-tests/MaestroTestApp/` — a
minimal Flutter app with two screens used by automated Maestro flows to
verify the RevenueCat purchase integration.

- Two screens: "Test Cases" list and "Purchase through paywall"
(presents a RevenueCat V2 paywall and displays entitlement status)
- Bundle ID `com.revenuecat.automatedsdktests`
- API key placeholder (`MAESTRO_TESTS_REVENUECAT_API_KEY`) replaced at
CI time via `sed`
- Local SDK resolution via `path:` references + `dependency_overrides`
(same mechanism as `revenuecat_examples/purchase_tester`)
- iOS plugins resolved via Swift Package Manager
(`FlutterGeneratedPluginSwiftPackage`); CocoaPods only carries the
Flutter engine
- Errors from `getCustomerInfo` and `presentPaywall` are surfaced in the
UI for debugging failed Maestro flows

Counterpart PRs:
[react-native-purchases#1635](RevenueCat/react-native-purchases#1635),
[purchases-capacitor#699](RevenueCat/purchases-capacitor#699),
[cordova-plugin-purchases#857](RevenueCat/cordova-plugin-purchases#857),
[purchases-unity#836](RevenueCat/purchases-unity#836),
[purchases-kmp#708](RevenueCat/purchases-kmp#708)

### Follow-up PRs (stacked)
- [#1698](#1698) —
Maestro test flows (YAML)
- [#1699](#1699) —
CircleCI jobs to run the tests
- [#1714](#1714) —
Launch argument routing to skip test list

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Adds a new, isolated test-only Flutter project with standard
iOS/Android scaffolding and a simple paywall purchase flow; it does not
modify the SDK runtime code paths.
> 
> **Overview**
> Introduces a new Flutter app in `e2e-tests/MaestroTestApp` intended
for Maestro E2E automation, including a test-case list screen and a
purchase flow that calls `RevenueCatUI.presentPaywall()` and displays
active `pro` entitlement state.
> 
> Adds full iOS/Android project scaffolding (manifests, Gradle/Xcode
configs, app IDs) plus local `path:` dependencies on
`purchases_flutter`/`purchases_ui_flutter`, and documents CI-time API
key injection via the `MAESTRO_TESTS_REVENUECAT_API_KEY` placeholder.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
cb1f2f4. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Base automatically changed from add-maestro-e2e-test-ci-job to main April 15, 2026 11:03
Resolve conflicts keeping launch-args feature additions
(MethodChannel bridges, flowKey routing, direct launchApp arguments).

Made-with: Cursor
@ajpallares ajpallares enabled auto-merge (squash) April 15, 2026 11:05
@ajpallares ajpallares merged commit ba21368 into main Apr 15, 2026
17 checks passed
@ajpallares ajpallares deleted the pallares/maestro-launch-args branch April 15, 2026 11:42
RCGitBot added a commit that referenced this pull request Apr 17, 2026
**This is an automatic release.**

## RevenueCat SDK
### 🐞 Bugfixes
* [EXTERNAL] Fix Wasm incompatibility in web error processing (#1684)
contributed by @brunovsiqueira (#1722) via Toni Rico (@tonidero)
### 📦 Dependency Updates
* [AUTOMATIC BUMP] Updates purchases-hybrid-common to 18.1.0 (#1726) via
RevenueCat Git Bot (@RCGitBot)
* [Android
10.2.0](https://github.com/RevenueCat/purchases-android/releases/tag/10.2.0)
* [iOS
5.68.0](https://github.com/RevenueCat/purchases-ios/releases/tag/5.68.0)

### 🔄 Other Changes
* Add retry mechanism to Maestro e2e tests (#1723) via Antonio Pallares
(@ajpallares)
* Bump fastlane-plugin-revenuecat_internal from `20911d1` to `a1eed48`
(#1725) via dependabot[bot] (@dependabot[bot])
* Skip test cases list in maestro tests using launch arguments (#1714)
via Antonio Pallares (@ajpallares)
* Add CircleCI job for maestro E2E tests (#1699) via Antonio Pallares
(@ajpallares)
* Add maestro E2E test for purchase through paywall (#1698) via Antonio
Pallares (@ajpallares)
* Add maestro E2E test app (#1654) via Antonio Pallares (@ajpallares)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk release bookkeeping: primarily version bumps and
changelog/version-matrix updates, with no functional logic changes in
the plugin code beyond reporting the new version string.
> 
> **Overview**
> Updates the SDKs to **v`10.0.1`** by bumping version identifiers
across `pubspec.yaml`, Android Gradle configs, and iOS/macOS podspecs
(including the runtime-reported plugin version strings).
> 
> Refreshes release documentation (`CHANGELOG.md`,
`CHANGELOG-LATEST.md`, `VERSIONS.md`) to include the `10.0.1` notes
(Wasm web error-processing fix) and the dependency bump to
`purchases-hybrid-common` `18.1.0` (Android `10.2.0`, iOS `5.68.0`).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
ff0bb5e. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
ajpallares added a commit to RevenueCat/cordova-plugin-purchases that referenced this pull request Apr 20, 2026
## Summary

Passes `e2e_test_flow` as a Maestro `launchApp` argument so the app
navigates directly to the target test case screen, bypassing the Test
Cases list.

### Changes:
- Adds a local `cordova-plugin-launch-args` Cordova plugin with iOS
(reads UserDefaults) and Android (reads intent extras) implementations
to bridge the argument to the JS layer
- Updates `app.js` to use `LaunchArgs.getTestFlow()` with the
`TEST_CASES` registry for routing (same pattern as Flutter's `testCases`
list and KMP's `testFlowScreenMap`)
- When no `e2e_test_flow` is set, falls back to showing the Test Cases
list screen
- Makes maestro tests faster by skipping the list navigation step

## Related PRs
- RevenueCat/react-native-purchases#1722
- RevenueCat/purchases-kmp#796
- RevenueCat/purchases-flutter#1714
- RevenueCat/purchases-capacitor#757
- RevenueCat/purchases-unity#897

Follows the same pattern as the iOS SDK's maestro app
(`purchases-ios/Examples/rc-maestro`).

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
ajpallares added a commit to RevenueCat/purchases-capacitor that referenced this pull request Apr 27, 2026
## Summary
- Pass `e2e_test_flow` as a Maestro `launchApp` argument so the app
navigates directly to the target test case screen, bypassing the Test
Cases list
- Adds a local `LaunchArgsPlugin` Capacitor plugin on both iOS (reads
UserDefaults) and Android (reads intent extras) to bridge the argument
to the web layer
- Makes maestro tests faster by skipping the list navigation step
- The Test Cases list is preserved for manual/local usage

## Related PRs
- RevenueCat/react-native-purchases#1722
- RevenueCat/purchases-kmp#796
- RevenueCat/purchases-flutter#1714
- RevenueCat/cordova-plugin-purchases#919
- RevenueCat/purchases-unity#897

Follows the same pattern as the iOS SDK's maestro app
(`purchases-ios/Examples/rc-maestro`).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants