diff --git a/.maestro/config.yaml b/.maestro/config.yaml index 0785137..8d157a8 100644 --- a/.maestro/config.yaml +++ b/.maestro/config.yaml @@ -10,6 +10,10 @@ # prerequisite adb push recipe in that flow's header comment). # f5_empty_profile is NOT in the order: it needs an adb-fired deep link # first (MainActivity has no VIEW intent filter) — see its header comment. +# g1_legal_gates is NOT in the order: it launches with clearState (fresh +# install), wiping the legal acceptances AND the signed-in session every +# stateful flow depends on. Run it standalone, then a1_login_session — +# see its header comment. executionOrder: continueOnFailure: false flowsOrder: @@ -34,6 +38,7 @@ executionOrder: - f2_author_profile - f3_edit_profile_persist - f4_avatar_gallery + - g3_report_dialog - a2_signout_landing - d4_discovery_guest - a3_wrong_password diff --git a/.maestro/g1_legal_gates.yaml b/.maestro/g1_legal_gates.yaml new file mode 100644 index 0000000..635af01 --- /dev/null +++ b/.maestro/g1_legal_gates.yaml @@ -0,0 +1,95 @@ +# Section G — checks 1 + 2: EULA and Community Guidelines gates on a fresh +# install: shown before anything else, un-accepted state persists across a +# restart, accepting requires scrolling the FULL document, each acceptance +# persists across a restart, and after both gates the landing screen shows. +# NOT in config.yaml's flowsOrder: `clearState` wipes ALL app data (legal +# acceptances AND the signed-in session), which would break every stateful +# flow that follows. Run standalone, then re-run a1_login_session to restore +# the signed-in-as-mari end state: +# maestro test .maestro/g1_legal_gates.yaml && \ +# maestro test .maestro/a1_login_session.yaml +appId: social.coves.dev +--- +# Fresh-install state: wipe app data so both gates are un-accepted. +- launchApp: + clearState: true +# Check 1: EULA gate is the first thing shown. +- extendedWaitUntil: + visible: "License Agreement" + timeout: 60000 +- assertVisible: "Scroll to read full agreement" +- assertVisible: "Accept & Continue" +# Un-accepted state persists across a restart (still gated after relaunch). +- stopApp +- launchApp +- extendedWaitUntil: + visible: "License Agreement" + timeout: 60000 +# Accept requires the full scroll: read to the last EULA section, then a +# few extra swipes to land on the hard bottom (the checkbox only unlocks +# within 40px of maxScrollExtent; the last heading becoming visible is not +# enough — that stayed-locked state is itself asserted by the failed 100% +# tap otherwise). +- scrollUntilVisible: + element: + text: "[\\s\\S]*22. Contact Information[\\s\\S]*" + direction: DOWN + timeout: 60000 + speed: 40 +- repeat: + times: 3 + commands: + - swipe: + start: 50%, 70% + end: 50%, 30% + duration: 500 +- waitForAnimationToEnd: + timeout: 3000 +# The scroll hint disappears only once the true bottom was reached. +- assertNotVisible: "Scroll to read full agreement" +- tapOn: "I have read and agree to the End User License Agreement" +- tapOn: "Accept & Continue" +# Check 2: Community Guidelines gate follows the EULA. +- extendedWaitUntil: + visible: "Community Guidelines" + timeout: 30000 +- assertVisible: "Scroll to read full guidelines" +# EULA acceptance persists across a restart; guidelines gate remains. +- stopApp +- launchApp +- extendedWaitUntil: + visible: "Community Guidelines" + timeout: 60000 +- assertNotVisible: "License Agreement" +- scrollUntilVisible: + element: + text: "[\\s\\S]*Thanks for being part of Coves![\\s\\S]*" + direction: DOWN + timeout: 60000 + speed: 40 +- repeat: + times: 3 + commands: + - swipe: + start: 50%, 70% + end: 50%, 30% + duration: 500 +- waitForAnimationToEnd: + timeout: 3000 +- assertNotVisible: "Scroll to read full guidelines" +- tapOn: "I have read and agree to the Community Guidelines" +- tapOn: "Accept & Continue" +# Both gates cleared: landing screen shows. +- extendedWaitUntil: + visible: "Sign in" + timeout: 30000 +- takeScreenshot: build/maestro/g1_gates_accepted +# Both acceptances persist across a final restart (no gate re-shown). +- stopApp +- launchApp +- extendedWaitUntil: + visible: "Sign in" + timeout: 60000 +- assertNotVisible: "License Agreement" +- assertNotVisible: "Scroll to read full guidelines" +- takeScreenshot: build/maestro/g1_gates_persisted diff --git a/.maestro/g3_report_dialog.yaml b/.maestro/g3_report_dialog.yaml new file mode 100644 index 0000000..eacac22 --- /dev/null +++ b/.maestro/g3_report_dialog.yaml @@ -0,0 +1,56 @@ +# Section G — check 3 (suite-safe half): the report dialog opens from a +# post's options menu, all reason categories render and are selectable, and +# Cancel dismisses without submitting. The actual SUBMIT path is exercised +# manually (it writes an admin_reports row on every run — verified server +# receipt in the 2026-07-16 Section G iteration, admin_reports id 13), so +# this flow deliberately stops at Cancel to keep the suite idempotent. +# Assumes a signed-in session (suite order: after a1). Target: the seeded +# NASA aggregator post (reporting is hidden on the viewer's own posts). +appId: social.coves.dev +--- +- launchApp: + stopApp: true +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 30000 +- extendedWaitUntil: + visible: "Feed post in [\\s\\S]*" + timeout: 30000 +# Open the NASA post detail (only one "More options" menu lives there, +# so the report entry point is unambiguous). +- scrollUntilVisible: + element: + text: "Feed post in [\\s\\S]*NASA delays[\\s\\S]*" + direction: DOWN + timeout: 20000 +- tapOn: + text: "Feed post in [\\s\\S]*NASA delays[\\s\\S]*" + index: 0 +- extendedWaitUntil: + visible: "NASA delays[\\s\\S]*" + timeout: 15000 +- tapOn: "More options" +- tapOn: "Report" +# Report dialog renders with every reason category +- extendedWaitUntil: + visible: "Report post" + timeout: 15000 +- assertVisible: "Why are you reporting this?" +- assertVisible: "Spam[\\s\\S]*" +- assertVisible: "Harassment[\\s\\S]*" +- assertVisible: "Doxing[\\s\\S]*" +- assertVisible: "Illegal Content[\\s\\S]*" +- assertVisible: "Child Safety[\\s\\S]*" +- assertVisible: "Other[\\s\\S]*" +- assertVisible: "Submit Report" +# Reasons are selectable +- tapOn: "Spam[\\s\\S]*" +- takeScreenshot: build/maestro/g3_report_reason_selected +# Cancel dismisses the dialog without submitting +- tapOn: "Cancel" +- assertNotVisible: "Why are you reporting this?" +- assertVisible: "NASA delays[\\s\\S]*" +- back +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 15000