From 8756906c72b2377e346e3c103a2feed7d346fa5e Mon Sep 17 00:00:00 2001 From: Bretton <36870434+BrettM86@users.noreply.github.com> Date: Thu, 16 Jul 2026 04:02:37 -0700 Subject: [PATCH] test(qa): add Section D (communities) Maestro flows to the regression suite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - d1_admin_panel: admin account sees the admin panel on the Communities tab; Create Community and Change Profile Pic subpages open and the labeled in-app Back arrow returns to the menu. - d2_community_from_chip: a post's community handle navigates to the community feed; header, stats, Feed/About tabs, sort chips and the About tab all render. - d3_join_leave: join flips the button, For You reflects the membership, leave reverts; self-normalizes and ends unsubscribed. - d4_discovery_guest: discovery browse sections, search results / no-results / clear recovery, and the See-all list — exercised signed out via the landing page's "Explore communities" link because the admin test account gets the admin panel instead of the discovery screen. Suite order: d1-d3 run signed in after the c-flows; d4 runs signed out after a2_signout_landing. Full suite passes 15/15. Co-Authored-By: Claude Fable 5 --- .maestro/config.yaml | 9 ++- .maestro/d1_admin_panel.yaml | 50 ++++++++++++++++ .maestro/d2_community_from_chip.yaml | 55 ++++++++++++++++++ .maestro/d3_join_leave.yaml | 87 ++++++++++++++++++++++++++++ .maestro/d4_discovery_guest.yaml | 76 ++++++++++++++++++++++++ 5 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 .maestro/d1_admin_panel.yaml create mode 100644 .maestro/d2_community_from_chip.yaml create mode 100644 .maestro/d3_join_leave.yaml create mode 100644 .maestro/d4_discovery_guest.yaml diff --git a/.maestro/config.yaml b/.maestro/config.yaml index a8fb58a..e119029 100644 --- a/.maestro/config.yaml +++ b/.maestro/config.yaml @@ -1,8 +1,11 @@ # Maestro workspace config for the QA loop regression suite. # Flows are stateful (login/signout) — run them in this order. -# Section B and C flows require a signed-in session, so they run after +# Section B, C and D flows require a signed-in session, so they run after # a1_login_session (which ends signed in) and before a2_signout_landing. # c3 additionally depends on comments seeded by c2. +# d4_discovery_guest requires a signed-OUT state (the admin test account +# sees the admin panel instead of the discovery screen), so it runs after +# a2_signout_landing. executionOrder: continueOnFailure: false flowsOrder: @@ -15,5 +18,9 @@ executionOrder: - c1_post_detail - c2_comment_reply_collapse - c3_comment_vote_sort + - d1_admin_panel + - d2_community_from_chip + - d3_join_leave - a2_signout_landing + - d4_discovery_guest - a3_wrong_password diff --git a/.maestro/d1_admin_panel.yaml b/.maestro/d1_admin_panel.yaml new file mode 100644 index 0000000..fd05a6c --- /dev/null +++ b/.maestro/d1_admin_panel.yaml @@ -0,0 +1,50 @@ +# Section D — check 5 (admin panel): as an admin account (mari is in +# kAdminHandles) the Communities tab shows the admin panel and both subpages +# (Create Community, Change Profile Pic) open without crashing; the in-app +# "Back" arrow returns to the admin menu. Assumes a signed-in session. +# KNOWN QUIRK: the SYSTEM back button switches to the Home tab from anywhere +# in the shell (CreatePostScreen's PopScope in the IndexedStack) — use the +# in-app Back arrow, not `- back`, inside the admin panel. +appId: social.coves.dev +--- +- launchApp: + stopApp: true +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 30000 +# Let the semantics tree settle after the splash (see a1 flow note) +- waitForAnimationToEnd: + timeout: 5000 +- retry: + maxRetries: 2 + commands: + - tapOn: "Communities" + - extendedWaitUntil: + visible: "Admin Tools" + timeout: 15000 +- takeScreenshot: build/maestro/d1_admin_menu +# Create Community subpage renders its form +- tapOn: "Create Community[\\s\\S]*" +- extendedWaitUntil: + visible: "Display Name" + timeout: 10000 +- takeScreenshot: build/maestro/d1_admin_create +# In-app back arrow (labeled "Back") returns to the admin menu +- tapOn: "Back" +- extendedWaitUntil: + visible: "Admin Tools" + timeout: 10000 +# Change Profile Pic subpage loads the community list +- tapOn: "Change Profile Pic[\\s\\S]*" +- extendedWaitUntil: + visible: "Select Community" + timeout: 15000 +- extendedWaitUntil: + visible: "[\\s\\S]*@c-[\\s\\S]*" + timeout: 15000 +- takeScreenshot: build/maestro/d1_admin_profilepic +# In-app back arrow (labeled "Back") returns to the menu +- tapOn: "Back" +- extendedWaitUntil: + visible: "Admin Tools" + timeout: 10000 diff --git a/.maestro/d2_community_from_chip.yaml b/.maestro/d2_community_from_chip.yaml new file mode 100644 index 0000000..ceeb788 --- /dev/null +++ b/.maestro/d2_community_from_chip.yaml @@ -0,0 +1,55 @@ +# Section D — checks 3 + 6: tapping a post's community handle in the home +# feed navigates to that community's feed screen; the header (avatar, display +# name, handle, subscriber/member stats), Feed/About tabs, and sort chips all +# render; the About tab shows stats and info. Assumes a signed-in session. +appId: social.coves.dev +--- +- launchApp: + stopApp: true +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 30000 +# Let the semantics tree settle after the splash (see a1 flow note), then +# retry the tap in case the first read hit a stale/empty tree. +- waitForAnimationToEnd: + timeout: 5000 +- retry: + maxRetries: 2 + commands: + - extendedWaitUntil: + visible: "Feed post in [\\s\\S]*" + timeout: 15000 + # The community handle row inside the post card is its own tappable node + - tapOn: + text: "!science@coves.social" + index: 0 + # Community feed screen header renders (display name + stats) + - extendedWaitUntil: + visible: "[\\s\\S]*Science[\\s\\S]*" + timeout: 15000 +- assertVisible: "[\\s\\S]*Subscribers[\\s\\S]*" +- assertVisible: "[\\s\\S]*About[\\s\\S]*" +- assertVisible: "[\\s\\S]*Hot[\\s\\S]*" +# Community feed shows posts from that community. NOTE: the "Feed post in +# ..." semantics label is added by the HOME feed wrapper (feed_page.dart); +# community-feed post cards expose raw merged text, so match a seeded title. +- extendedWaitUntil: + visible: "[\\s\\S]*NASA delays[\\s\\S]*" + timeout: 15000 +- takeScreenshot: build/maestro/d2_community_feed +# About tab: description/stats/info sections render +- tapOn: "About" +- extendedWaitUntil: + visible: "[\\s\\S]*Community Stats[\\s\\S]*" + timeout: 10000 +- assertVisible: "[\\s\\S]*Visibility[\\s\\S]*" +- takeScreenshot: build/maestro/d2_community_about +# Back to the Feed tab, then leave the community screen +- tapOn: "Feed" +- extendedWaitUntil: + visible: "[\\s\\S]*Hot[\\s\\S]*" + timeout: 10000 +- back +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 15000 diff --git a/.maestro/d3_join_leave.yaml b/.maestro/d3_join_leave.yaml new file mode 100644 index 0000000..189222e --- /dev/null +++ b/.maestro/d3_join_leave.yaml @@ -0,0 +1,87 @@ +# Section D — check 4: joining a community flips the button state, the +# For You feed reflects the new membership, and leaving reverts both. +# Self-normalizes if a previous run left mari subscribed. Ends with mari +# subscribed to nothing (an assumption baked into b5's comments). +# NOTE: subscriber counts in the header lag the toggle (appview indexes the +# PDS record via the firehose), so this flow asserts button state and feed +# membership effects, not counts. +appId: social.coves.dev +--- +- launchApp: + stopApp: true +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 30000 +- waitForAnimationToEnd: + timeout: 5000 +# Open the science community from a post's community handle +- retry: + maxRetries: 2 + commands: + - extendedWaitUntil: + visible: "Feed post in [\\s\\S]*" + timeout: 15000 + - tapOn: + text: "!science@coves.social" + index: 0 + - extendedWaitUntil: + visible: "[\\s\\S]*Science[\\s\\S]*" + timeout: 15000 +- extendedWaitUntil: + visible: "Join|Joined" + timeout: 15000 +# Normalize: if a previous run left us subscribed, leave first +- runFlow: + when: + visible: "Joined" + commands: + - tapOn: "Joined" + - extendedWaitUntil: + visible: "Join" + timeout: 15000 +# Join: button flips to Joined +- tapOn: "Join" +- extendedWaitUntil: + visible: "Joined" + timeout: 15000 +- takeScreenshot: build/maestro/d3_joined +# Membership effect: For You now carries the community's posts. +# Retry with pull-to-refresh to absorb firehose indexing lag. +- back +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 15000 +- tapOn: "For You feed[\\s\\S]*" +- retry: + maxRetries: 3 + commands: + - swipe: + start: 50%, 30% + end: 50%, 80% + duration: 400 + - extendedWaitUntil: + visible: "Feed post in [\\s\\S]*" + timeout: 10000 +- takeScreenshot: build/maestro/d3_foryou_member +# Leave: button reverts to Join +- retry: + maxRetries: 2 + commands: + - tapOn: + text: "!science@coves.social" + index: 0 + - extendedWaitUntil: + visible: "[\\s\\S]*Science[\\s\\S]*" + timeout: 15000 +- extendedWaitUntil: + visible: "Joined" + timeout: 15000 +- tapOn: "Joined" +- extendedWaitUntil: + visible: "Join" + timeout: 15000 +- takeScreenshot: build/maestro/d3_left +- back +- extendedWaitUntil: + visible: "Discover feed.*|For You feed[\\s\\S]*" + timeout: 15000 diff --git a/.maestro/d4_discovery_guest.yaml b/.maestro/d4_discovery_guest.yaml new file mode 100644 index 0000000..119bf54 --- /dev/null +++ b/.maestro/d4_discovery_guest.yaml @@ -0,0 +1,76 @@ +# Section D — checks 1 + 2 + 5 (guest): the discovery screen renders its +# browse sections and search, search shows results / no-results / recovers on +# clear, and the "See all" screen renders the full community list. +# PRECONDITION: signed out (run after a2_signout_landing). Reaches the +# discovery screen via the landing page's "Explore communities" link, since +# the admin test account (mari) sees the admin panel instead when signed in. +# Leaves the app signed out. +appId: social.coves.dev +--- +- launchApp +- extendedWaitUntil: + visible: "Sign in" + timeout: 30000 +- waitForAnimationToEnd: + timeout: 5000 +- tapOn: "Explore communities" +- extendedWaitUntil: + visible: "Discover feed.*" + timeout: 30000 +- tapOn: "Communities" +# Let the semantics tree settle after the tab switch (see a1 flow note) +- waitForAnimationToEnd: + timeout: 5000 +# Check 1: browse sections render (no "Your Communities" when signed out) +- retry: + maxRetries: 2 + commands: + - extendedWaitUntil: + visible: "Popular[\\s\\S]*" + timeout: 15000 + - extendedWaitUntil: + visible: "Recently Created" + timeout: 15000 +# Hero cards (Popular) and list tiles (Recently Created) render communities +- extendedWaitUntil: + visible: "[\\s\\S]*community[\\s\\S]*" + timeout: 15000 +- takeScreenshot: build/maestro/d4_discovery_sections +# Check 2: search returns results +- tapOn: "Explore communities..." +- inputText: "science" +- extendedWaitUntil: + visible: "[0-9]+ results?[\\s\\S]*" + timeout: 15000 +- assertVisible: "[\\s\\S]*Science[\\s\\S]*community[\\s\\S]*" +- takeScreenshot: build/maestro/d4_search_results +# Check 2: no-results state +- tapOn: "Clear search" +- inputText: "zzzqxv" +- extendedWaitUntil: + visible: "No communities match[\\s\\S]*" + timeout: 15000 +- takeScreenshot: build/maestro/d4_search_noresults +# Check 2: clearing the query restores the browse sections +- tapOn: "Clear search" +- hideKeyboard +- extendedWaitUntil: + visible: "Popular[\\s\\S]*" + timeout: 15000 +# Check 5: See all -> full paginated list screen renders and scrolls +- tapOn: "[\\s\\S]*See all Popular[\\s\\S]*" +- extendedWaitUntil: + visible: "Popular Communities" + timeout: 15000 +- extendedWaitUntil: + visible: "[\\s\\S]*community[\\s\\S]*" + timeout: 15000 +- swipe: + start: 50%, 80% + end: 50%, 30% + duration: 400 +- takeScreenshot: build/maestro/d4_see_all +- back +- extendedWaitUntil: + visible: "Popular[\\s\\S]*" + timeout: 15000 -- 2.51.2