Skip to content

feat: add maestro E2E test app#1654

Draft
ajpallares wants to merge 17 commits intomainfrom
e2e-tests-app
Draft

feat: add maestro E2E test app#1654
ajpallares wants to merge 17 commits intomainfrom
e2e-tests-app

Conversation

@ajpallares
Copy link
Copy Markdown
Contributor

@ajpallares ajpallares commented Feb 27, 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 (not just logged) for Maestro screenshot capture
  • Widget Key identifiers for test targeting
  • Includes a README and committed Podfile.lock

Counterpart PRs: react-native-purchases#1635, purchases-capacitor#699, cordova-plugin-purchases#857, purchases-unity#836, purchases-kmp#708

Follow-up PRs (stacked)

  • #1698 — Maestro test flows (YAML)
  • #1699 — CircleCI jobs to run the tests

@ajpallares ajpallares added the pr:feat A new feature label Feb 27, 2026
@ajpallares ajpallares added pr:other and removed pr:feat A new feature labels Feb 27, 2026
ajpallares and others added 3 commits March 25, 2026 12:32
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Generated iOS project with bundle ID com.revenuecat.maestro.e2e using
flutter create. Added Podfile for CocoaPods-based plugin dependencies.
Updated .gitignore to exclude Flutter ephemeral iOS files.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Replace non-existent Purchases.customerInfoStream with the correct
addCustomerInfoUpdateListener/removeCustomerInfoUpdateListener API.
Also add missing iOS Flutter xcconfig and AppFrameworkInfo.plist files
that are required for building.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
ajpallares and others added 7 commits March 25, 2026 16:28
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Made-with: Cursor
The StoreKitConfiguration.storekit file was on disk but not registered
as a PBXFileReference in project.pbxproj, so Xcode couldn't find it
at runtime. Also fix the scheme identifier path.

Made-with: Cursor
The identifier is relative to the .xcodeproj directory, so it needs
the ../ prefix to reach the sibling StoreKitConfiguration.storekit.

Made-with: Cursor
- Use path: references for purchases_flutter and purchases_ui_flutter
  so E2E tests exercise the local branch code instead of pub.dev
- Add dependency_overrides for purchases_flutter to resolve transitive
  dependency conflict from purchases_ui_flutter
- Commit ios/Podfile.lock for reproducible CI builds
- Add try/catch to presentPaywall for diagnosable test failures
- Add README with build/run instructions and API key setup

Made-with: Cursor
ajpallares and others added 6 commits March 30, 2026 17:14
- Show errors in a visible Text widget with Key('error-message') instead of
  only debugPrint, so Maestro can capture failures in screenshots
- Add Key identifiers to entitlements label and paywall button

Made-with: Cursor
- Add .catchError() to getCustomerInfo() to surface errors in the UI
  instead of producing an unhandled exception

Made-with: Cursor
## Summary
- Pin all `uses:` references in GitHub Actions workflows to full SHA hashes
- Prevents supply chain attacks via tag mutation or typosquatting

## Context
- https://rosesecurity.dev/2026/03/20/typosquatting-trivy.html
- Generated with [`pinact`](https://github.com/suzuki-shunsuke/pinact)

## Test plan
- [ ] Verify CI passes with pinned references
- [ ] Spot-check that pinned SHAs match expected release tags

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: only updates GitHub Actions `uses:` references to pinned commit SHAs, with no runtime code or business logic changes. Main risk is accidental pinning to an incorrect commit causing workflow behavior changes.
> 
> **Overview**
> Pins GitHub Actions `uses:` references to immutable commit SHAs in the `issue-notifications` and `lock` workflows (replacing `@v2`/`@v2.0.1` tags) to harden CI against tag mutation and typosquatting.
> 
> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 16ae2a6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…1701)

Bumps
[fastlane-plugin-revenuecat_internal](https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal)
from `9a6911b` to `f11fe40`.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal/commit/f11fe4027ace451efa36c1bf6f4fc1742f5025d6"><code>f11fe40</code></a>
Add merge queue support to merge_pr action (<a
href="https://redirect.github.com/RevenueCat/fastlane-plugin-revenuecat_internal/issues/120">#120</a>)</li>
<li>See full diff in <a
href="https://github.com/RevenueCat/fastlane-plugin-revenuecat_internal/compare/9a6911be3659cd14fe62ada4cbae3a2f8792691c...f11fe4027ace451efa36c1bf6f4fc1742f5025d6">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk dependency-only change; the main impact is on CI/release
tooling via the updated fastlane plugin and its transitive gem versions.
> 
> **Overview**
> Bumps the `fastlane-plugin-revenuecat_internal` git dependency to
revision `f11fe40`.
> 
> Refreshes `Gemfile.lock` with minor version updates to transitive
gems, including `nokogiri` (`1.19.1` → `1.19.2`) and `mime-types-data`
(`3.2026.0303` → `3.2026.0317`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
95d82ca. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…kage

- Update AGP to 8.13.2 and Kotlin to 1.8.22 (matching purchase_tester)
- Upgrade Gradle wrapper from 8.12 to 8.14.4
- Move MainActivity to com.revenuecat.automatedsdktests package to match
  the namespace declared in build.gradle.kts

Made-with: Cursor
purchases_ui_flutter requires FlutterFragmentActivity instead of
FlutterActivity to present paywalls.

Made-with: Cursor
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