# Maestro E2E — Local Setup (Phase A) Phase A: lokales CLI, 0 Cost, kein Cloud-Account. Phase B (post-TestFlight): Maestro Cloud fuer CI-Reports + Multi-Device-Parallel — Entscheidung steht aus. --- ## 1. Maestro CLI installieren ```bash curl -Ls "https://get.maestro.mobile.dev" | bash ``` Danach Shell neu starten oder: ```bash export PATH="$PATH:$HOME/.maestro/bin" ``` Verify: ```bash maestro --version # Erwarteter Output: Maestro CLI 1.x.x ``` --- ## 2. App auf Device / Simulator bauen Maestro benoetigt eine laufende App-Installation. Expo Dev-Client oder Production-Build. ### iOS Simulator ```bash # Im rebreak-native Verzeichnis: cd apps/rebreak-native # Dev-Build auf Standard-Simulator (erster verfuegbarer): pnpm exec expo run:ios # Spezifischer Simulator (Name aus "xcrun simctl list devices"): pnpm exec expo run:ios --device "iPhone 15" ``` Alternativ via konsolidiertem Dev-Script: ```bash # Vollbuild auf iPhone via USB: bash apps/rebreak-native/dev.sh ios # WiFi-Modus (kein Kabel, Metro über LAN): bash apps/rebreak-native/dev.sh ios --wifi # Schneller JS-Reload ohne Native-Rebuild: bash apps/rebreak-native/dev.sh ios --no-build ``` ### Android Emulator Emulator muss vorher gestartet sein (`Android Studio -> Device Manager`). ```bash bash apps/rebreak-native/install-android.sh ``` Oder direkt: ```bash pnpm exec expo run:android ``` ### Bundle-ID `org.rebreak.app` (iOS + Android identisch) — steht so in `app.config.ts` und in den Flow-Headern als `appId: org.rebreak.app`. --- ## 3. Env-Vars setzen Flows benoetigen Test-User-Credentials. **Nie** hardcoden — immer als Env-Vars uebergeben. ### Option A: direktes `--env` Flag ```bash maestro test \ --env=E2E_TEST_USER=admin \ --env=E2E_TEST_PASSWORD= \ apps/rebreak-native/.maestro/auth/email-signin.yaml ``` ### Option B: Infisical Wrapper ```bash infisical run -- maestro test apps/rebreak-native/.maestro/auth/email-signin.yaml ``` Voraussetzung: Infisical-Projekt hat `E2E_TEST_USER` und `E2E_TEST_PASSWORD` als Secrets. Variablen die Flows erwarten: | Var | Beschreibung | |----------------------|-------------------------------------------------------| | `E2E_TEST_USER` | Username-Teil der E-Mail (ohne @rebreak.internal) | | `E2E_TEST_PASSWORD` | Passwort des Test-Users auf Staging | Wichtig: Der Backend-Server haengt `@rebreak.internal` automatisch an den Username. In den Flows steht deshalb `${E2E_TEST_USER}@rebreak.internal` als E-Mail-Input. ### Test-Account (aktueller Stand) - **`admin@rebreak.org`** — email-basierter Account, Passwort in Infisical als `E2E_TEST_PASSWORD` Dann: `E2E_TEST_USER=admin` - **`charioanouar@gmail.com`** — Google OAuth only, kein Passwort → kann NICHT fuer Maestro-Email-Login genutzt werden - **`claude-android-test@rebreak.internal`** — dedizierter CI-Test-Account (Erstellung via Service-Role noetig wenn nicht vorhanden) Empfehlung: `admin`-Account fuer lokale Flow-Tests nutzen. --- ## 4. Flows ausfuehren ### Einen einzelnen Flow ```bash maestro test apps/rebreak-native/.maestro/auth/signin.yaml \ --env=E2E_TEST_USER=claude-android-test \ --env=E2E_TEST_PASSWORD= ``` ### Alle Flows (sequenziell) ```bash maestro test apps/rebreak-native/.maestro/ ``` Mit ENV-Datei-Uebergabe: ```bash maestro test \ --env=E2E_TEST_USER=claude-android-test \ --env=E2E_TEST_PASSWORD= \ apps/rebreak-native/.maestro/ ``` ### Spezifische Subdirectory ```bash maestro test apps/rebreak-native/.maestro/auth/ ``` --- ## 5. Flow-Entwicklung: Maestro Studio Visual Flow-Builder im Browser — zeigt Screen-Snapshot + verfuegbare Elemente. ```bash # App muss laufen auf Device/Simulator: maestro studio ``` Browser oeffnet auf `http://localhost:9999`. Elemente anklicken, YAML auto-generieren, dann in `.maestro//.yaml` speichern. --- ## 6. Tipps fuer stabile Flows **Warte auf Animationen:** ```yaml - waitForAnimationToEnd: timeout: 4000 ``` Splash-Screen, Screen-Transitions und API-Calls brauchen Zeit. Faustregel: nach `launchApp` min. 5000ms, nach Navigation 2000-4000ms. **Flaky Tests debuggen:** ```bash # Output-Logs waehrend Run: maestro test --format junit --output report.xml apps/rebreak-native/.maestro/auth/signin.yaml # Screenshot bei Fehler: Maestro macht automatisch einen Screenshot im Fehlerfall. # Findet sich unter ~/.maestro/tests// ``` **Selektoren — Prioritaet:** 1. `id: ""` — stabielste Option. RN-Prop: `testID="mein-btn"`. 2. `text: "..."` — nur fuer statische, locale-unabhaengige Strings. 3. `point: "x%, y%"` — letzter Ausweg, bricht bei Screen-Size-Aenderungen. 4. Niemals `text:` fuer i18n-Strings (`t('...')`-Output) wenn Locale-Wechsel moeglich. **Device angeben (Multi-Device):** ```bash maestro test --device= apps/rebreak-native/.maestro/ # Device-IDs: `adb devices` (Android) / `xcrun simctl list` (iOS) ``` --- ## 7. App-State vor Test-Lauf `clearState: true` in jedem Flow-Header stellt sicher dass: - Auth-Session geleert ist - Kein persistierter State (MMKV / AsyncStorage) den Flow stoert - Jeder Flow von einem definierten Ausgangspunkt startet (Login-Screen) Test-User muss **vorab** auf dem Staging-Backend existieren: - Username: `claude-android-test` - E-Mail: `claude-android-test@rebreak.internal` - Account: email-confirmed, kein Admin-Flag - Erstellung: nur per Service-Role-Key + `auth.admin.createUser({ email_confirm: true })` (nicht im Flow selbst — Test-User ist persistent) --- ## 8. Flow-Uebersicht | Flow | Was wird geprueft | Stabil? | |---|---|---| | `auth/signin.yaml` | App startet, Login via Email+Pw, Home-Feed sichtbar | Ja (text-selektoren) | | `auth/email-signin.yaml` | Identisch — aktuelle Version mit besseren Kommentaren | Ja | | `urge/start-session.yaml` | SOS im Dropdown erreichbar, Lyra-Screen laedt | Koordinaten-Fallback | | `urge/sos-flow.yaml` | SOS → Lyra-Chat → "Atemübung" Chip → BreathingDrawer | LLM-abhaengig | | `community/post.yaml` | ComposeCard, Text-Input, Submit | Ja | | `community/create-post.yaml` | Identisch — aktuelle Version | Ja | | `profile/view-profile.yaml` | Profil-Navigation, ProfileHeader, StatsBar | Koordinaten-Fallback | | `profile/view-and-edit.yaml` | Profil → Edit → Nickname aendern → Speichern | Koordinaten-Fallback | | `profile/demographics.yaml` | DemographicsAccordion toggle, WheelPicker oeffnet | Text-selektoren | | `settings/dark-theme.yaml` | Settings → Theme → Dunkel | Native-Menu-Limitation | **Koordinaten-Fallback** = Flow nutzt `point: "x%, y%"` fuer Avatar-Button, weil kein `testID` vorhanden. Bricht wenn Header-Layout geaendert wird. Betroffene testIDs: `TODO_TESTIDS.md`. **Native-Menu-Limitation** = `@react-native-menu/menu` (UIMenu auf iOS) kann Maestro moeglicherweise nicht interagieren — Flow koennte an diesem Step haengen. Wenn `settings/dark-theme.yaml` immer an "Systemstandard" haengt: bekanntes Problem, kein Maestro-Bug, sondern iOS-Restriktion. --- ## 9. Phase B — Maestro Cloud (Zukunft, post-TestFlight) Was bei Cloud-Wechsel geaendert werden muss: 1. Maestro-Cloud-Account anlegen: `maestro cloud login` 2. CI-Run-Befehl aendern: `maestro cloud apps/rebreak-native/.maestro/` 3. ENV-Vars in CI-Secret-Store hinterlegen (GitHub Actions Secrets / Infisical CI-Integration) 4. Multi-Device-Matrix: `--device ios` / `--device android` separat schedulen 5. Report-URL aus Cloud-Output in PR-Kommentare posten (GitHub Actions Step) Bis dahin: lokaler CLI reicht fuer Pre-Release-Smoke-Tests.