# Maestro UI Testing This directory contains Maestro UI tests for TabataFit. ## Prerequisites 1. Install Maestro CLI: ```bash brew tap mobile-dev-inc/tap brew install maestro ``` 2. Build and install the app on your simulator/device: ```bash # iOS npx expo run:ios # Android npx expo run:android ``` ## Running Tests ### Run All Tests ```bash npm run test:maestro:all ``` ### Run Individual Tests ```bash # Onboarding flow npm run test:maestro:onboarding # Program browsing npm run test:maestro:programs # Tab navigation npm run test:maestro:tabs # Paywall/subscription npm run test:maestro:paywall # Reset app state npm run test:maestro:reset ``` ### Run with Maestro CLI directly ```bash # Run specific flow maestro test .maestro/flows/onboarding.yaml # Run all flows maestro test .maestro/flows # Run with device selection maestro test --device "iPhone 15" .maestro/flows/onboarding.yaml ``` ## Test Flows | Flow | Description | Prerequisites | |------|-------------|---------------| | `onboarding.yaml` | Complete 6-step onboarding | Fresh install | | `program-browse.yaml` | Browse and select programs | Completed onboarding | | `tab-navigation.yaml` | Navigate between tabs | Completed onboarding | | `subscription.yaml` | Test paywall interactions | Fresh install | | `assessment.yaml` | Start assessment workout | Completed onboarding, not assessment | | `reset-state.yaml` | Reset app to fresh state | None | | `all-tests.yaml` | Run all test flows | None | ## Test IDs Key UI elements have `testID` props for reliable element selection: ### Onboarding - `onboarding-problem-cta` - Step 1 continue button - `barrier-{id}` - Barrier selection cards (no-time, low-motivation, no-knowledge, no-gym) - `onboarding-empathy-continue` - Step 2 continue button - `onboarding-solution-cta` - Step 3 continue button - `onboarding-wow-cta` - Step 4 continue button - `name-input` - Name text input - `level-{level}` - Fitness level buttons (beginner, intermediate, advanced) - `goal-{goal}` - Goal buttons (weight-loss, cardio, strength, wellness) - `frequency-{n}x` - Frequency buttons (2x, 3x, 5x) - `onboarding-personalization-continue` - Step 5 continue button - `plan-yearly` - Annual subscription card - `plan-monthly` - Monthly subscription card - `subscribe-button` - Subscribe CTA - `restore-purchases` - Restore purchases link - `skip-paywall` - Skip paywall link ### Home Screen - `program-card-{id}` - Program cards (upper-body, lower-body, full-body) - `program-{id}-cta` - Program CTA buttons - `assessment-card` - Assessment workout card ## Writing New Tests 1. Add `testID` prop to interactive elements in your component: ```tsx Click me ``` 2. Create a new YAML file in `.maestro/flows/`: ```yaml appId: com.millianlmx.tabatafit name: My Test --- - assertVisible: "my-button" - tapOn: "my-button" ``` 3. Add npm script to `package.json`: ```json "test:maestro:mytest": "maestro test .maestro/flows/my-test.yaml" ``` ## CI/CD Integration For GitHub Actions, add: ```yaml - name: Run Maestro Tests run: | brew tap mobile-dev-inc/tap brew install maestro npm run test:maestro:all ``` ## Tips - Use `assertVisible` to wait for elements - Use `optional: true` for elements that may not exist - Use `extendedWaitUntil` for longer timeouts - Use `runFlow` to compose tests from smaller flows - Use `env` to parameterize tests ## Debugging ```bash # Verbose output maestro test --verbose .maestro/flows/onboarding.yaml # Take screenshot on failure maestro test --screenshot .maestro/flows/onboarding.yaml # Record video maestro record .maestro/flows/onboarding.yaml ``` ## Resources - [Maestro Documentation](https://maestro.mobile.dev/) - [Maestro CLI Reference](https://maestro.mobile.dev/cli) - [Element Selectors](https://maestro.mobile.dev/platform-support/react-native)