chahinebrini 417191c90a test(maestro): 6 E2E flows + setup-guide + testID-TODO
User-runnable lokal via maestro CLI oder Studio (GUI). Ahmed-agent built.

Neue flows (.maestro/):
- auth/email-signin.yaml (admin@rebreak.org login via env-vars, NOT hardcoded)
- profile/view-and-edit.yaml (avatar tap → edit → save → verify)
- profile/demographics.yaml (accordion → fill 3 fields → verify save)
- settings/dark-theme.yaml (Settings → Theme → Dark → verify)
- urge/sos-flow.yaml (start SOS → atemübung → finish → rating)
- community/create-post.yaml (compose → publish)

SETUP.md ergänzt: install, prerequisites, env-vars, troubleshooting.

TODO_TESTIDS.md (17 missing testIDs, 7 high-prio):
- AppHeader: header-avatar-btn (alle flows betroffen, aktuell coordinate-fallback)
- urge: sos-send-btn (SOS-flow blocked ohne)
- profile/edit: nickname-input, save-btn

GH-Actions template (.github/workflows/maestro-cloud.yml) — NICHT aktiv,
braucht User-OK + EAS-secrets.

User runs:
  maestro test apps/rebreak-native/.maestro/auth/email-signin.yaml \
    --env=E2E_TEST_USER=admin --env=E2E_TEST_PASSWORD=<from Infisical>
  maestro studio  # GUI

Stolperfalle: charioanouar (Google OAuth) funktioniert nicht — admin-account
nutzen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 15:45:53 +02:00

95 lines
3.1 KiB
YAML

# urge/sos-flow.yaml
# Tests: Login → Header dropdown → SOS → Lyra chat screen loads → breathing exercise
# triggered → session ends → feedback rating drawer appears.
# Pre-requisite: App installed. Test-user exists on staging. Staging backend running.
# Groq API key configured (SOS streams via /api/coach/sos-stream).
# Env-Vars: E2E_TEST_USER, E2E_TEST_PASSWORD
# Expected outcome: Lyra chat input visible after SOS screen loads.
# Breathing drawer opens when "Atemübung" chip is tapped.
#
# TIMING NOTE: SOS screen boots RiveAvatar + streams first Lyra message via Groq.
# Timeout of 12s post-navigation is intentional — cold LLM response on staging.
#
# BLOCKER: Avatar button in AppHeader has no testID → coordinate fallback (93%, 6%).
# SOS-entry Pressable in HeaderDropdownMenu has no testID → text "SOS" selector works
# because "SOS" only appears inside the open dropdown.
appId: org.rebreak.app
---
- launchApp:
clearState: true
- waitForAnimationToEnd:
timeout: 5000
# --- Auth ---
- assertVisible:
text: "E-Mail"
- tapOn:
text: "E-Mail"
- inputText: ${E2E_TEST_USER}@rebreak.internal
- tapOn:
text: "Passwort"
- inputText: ${E2E_TEST_PASSWORD}
- tapOn:
text: "Anmelden"
- waitForAnimationToEnd:
timeout: 10000
- assertVisible:
text: "ReBreak"
# Open Header dropdown
- tapOn:
point: "93%, 6%"
- waitForAnimationToEnd:
timeout: 2000
# t('appHeader.sosLabel') = "SOS" (de.json) — red text, top of dropdown
- assertVisible:
text: "SOS"
- tapOn:
text: "SOS"
# SOS screen loads: RiveAvatar renders + Lyra streaming starts.
# Boot takes 6-12s on staging (Groq cold start + audio pre-cache).
- waitForAnimationToEnd:
timeout: 12000
# Chat input: placeholder = t('coach.placeholder') = "Was beschäftigt dich?" (de.json).
# This placeholder ONLY exists on the SOS/Urge screen.
- assertVisible:
text: "Was beschäftigt dich?"
# Type a message to trigger Lyra response + chip suggestions
- tapOn:
text: "Was beschäftigt dich?"
- inputText: "Ich habe gerade einen starken Drang."
- tapOn:
text: "Was beschäftigt dich?"
# After typing, a send button should appear (Ionicons send icon, no text/testID).
# Tap on the text input area then look for the send button via coordinates.
# FRAGILE — needs testID="sos-send-btn" on the send Pressable. See TODO_TESTIDS.md.
# Instead of sending (which triggers another streaming round-trip),
# we verify the chip row is visible if Lyra has already responded.
# If this is the first message, wait for Lyra's response + chip appearance.
- waitForAnimationToEnd:
timeout: 15000
# After Lyra responds, chipSet changes from 'start' to dynamic chips.
# "Atemübung" is a chip in CHIP_SETS.start (sosConstants.ts) — always shown first.
# Text is hardcoded in sosConstants.ts, not i18n.
# If visible: tap to open BreathingDrawer.
- assertVisible:
text: "Atemübung"
- tapOn:
text: "Atemübung"
- waitForAnimationToEnd:
timeout: 3000
# BreathingDrawer opens as a bottom sheet. Header text is hardcoded
# "Atemübung" in Breathing.tsx — safe to assert.
- assertVisible:
text: "Atemübung"