Add maestro E2E test for purchase through paywall#1698
Conversation
b266f9e to
82563b8
Compare
c01f963 to
691052f
Compare
Made-with: Cursor
109b156 to
6e0b11d
Compare
691052f to
48841a6
Compare
The default Flutter widget test references MyApp which doesn't exist in this project (the app class is MaestroTestApp). Made-with: Cursor
48841a6 to
32f4b13
Compare
- 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
deeccff to
f947270
Compare
- 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
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
f947270 to
596dc19
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 2cae89b. Configure here.
| name: Confirm purchase - Test Store Purchase Alert | ||
|
|
||
| --- | ||
| - assertVisible: "Test Store Purchase" |
There was a problem hiding this comment.
Missing extended wait before purchase dialog assertion
Medium Severity
confirm_purchase.yaml uses assertVisible: "Test Store Purchase" which has a default 7-second timeout. The main test flow consistently uses extendedWaitUntil with 15000ms timeouts for all async transitions (app launch, entitlements loading, post-purchase entitlement update), but the purchase confirmation dialog — which appears after an async purchase initiation — only gets the default 7-second wait. In CI environments or slower devices, the system purchase dialog may take longer than 7 seconds to appear after tapping "Continue," causing flaky failures.
Reviewed by Cursor Bugbot for commit 2cae89b. Configure here.
- 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
Made-with: Cursor
Avoids eagerly constructing all screen widgets upfront — the widget is only created when the user navigates to it. Made-with: Cursor
## 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 -->
## Summary - Adds two separate CircleCI workflows triggered by the `maestro_e2e_tests` schedule: - `maestro-e2e-tests-ios`: runs on macOS executor, builds the test app for iOS simulator via `flutter build ios --debug --simulator`, runs Maestro tests - `maestro-e2e-tests-android`: runs on `android:2024.11.1` machine image, creates an Android emulator, builds a debug APK via `flutter build apk --debug`, runs Maestro tests - Adds Fastlane lanes with upfront API key validation (`UI.user_error!` if env var is missing): - `run_maestro_e2e_tests_ios`: replaces API key placeholder, builds with Flutter, installs on simulator, runs Maestro - `build_maestro_app_android` / `run_maestro_e2e_tests_android`: replaces API key placeholder, builds APK, installs via adb, runs Maestro - Both lanes use `$RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE` from the `e2e-tests` CircleCI context - Test results stored as JUnit artifacts Depends on #1698 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > CI pipeline changes add new scheduled iOS/Android emulator runs and Fastlane scripting that mutates the E2E test app at build time; main risk is increased CI flakiness or misconfigured secrets causing failures rather than product impact. > > **Overview** > Adds Maestro end-to-end testing to CircleCI by introducing new `run-maestro-e2e-tests-ios` and `run-maestro-e2e-tests-android` jobs that build and run a dedicated Flutter test app on an iOS simulator and an Android emulator, then upload JUnit results as artifacts. > > Wires these jobs into the main `test` workflow (using the `e2e-tests` context) and also adds dedicated scheduled workflows (`maestro_e2e_tests`) to run iOS/Android E2E suites independently. > > Extends the `Fastfile` with lanes to build/install the Maestro test app and execute `maestro test`, including validation of `RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE` and replacing an API-key placeholder before running the suite. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit b01d19b. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
**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 -->


Summary
config.yamlfor Maestro test executionutils/confirm_purchase.yamlutility that handles test store purchase confirmation on both iOS and AndroidDepends on #1654
Note
Low Risk
Adds new Maestro E2E test YAMLs and a shared purchase-confirmation flow; no production code paths are changed. Risk is limited to test flakiness due to UI text/timeouts and store confirmation dialogs.
Overview
Adds a Maestro E2E flow that drives the app through purchase via the V2 paywall (select yearly, continue, confirm purchase) and asserts entitlements change from
nonetopro.Introduces a shared
utils/confirm_purchase.yamlstep for handling the test-store purchase confirmation dialog, plus aconfig.yamlto run all flows undere2e_tests/*with fail-fast execution.Reviewed by Cursor Bugbot for commit 48b6b03. Bugbot is set up for automated code reviews on this repo. Configure here.