diff --git a/apps/mobile/apps/client/maestro/auth/sign_up.yaml b/apps/mobile/apps/client/maestro/auth/sign_up.yaml index 010bbe8a..35b2a260 100644 --- a/apps/mobile/apps/client/maestro/auth/sign_up.yaml +++ b/apps/mobile/apps/client/maestro/auth/sign_up.yaml @@ -8,8 +8,15 @@ env: PASSWORD: ${TEST_CLIENT_PASSWORD} COMPANY: ${TEST_CLIENT_COMPANY} --- -- launchApp -- assertVisible: "Create Account" +# Always start from a clean auth state so the Get Started +# screen (with "Create Account") is shown even if already signed in. +- launchApp: + clearState: true + +- extendedWaitUntil: + visible: "Create Account" + timeout: 10000 + - tapOn: "Create Account" - assertVisible: "Company" - tapOn: diff --git a/apps/mobile/apps/client/maestro/billing/billing_overview.yaml b/apps/mobile/apps/client/maestro/billing/billing_overview.yaml new file mode 100644 index 00000000..16c1fd0d --- /dev/null +++ b/apps/mobile/apps/client/maestro/billing/billing_overview.yaml @@ -0,0 +1,23 @@ +# Client App — Billing tab overview widgets +# Verifies Billing tab navigation plus key billing metrics/sections. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/billing/billing_overview.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Navigate to Billing tab +- tapOn: "Billing" + +- extendedWaitUntil: + visible: "Current Period" + timeout: 10000 + +# Verify key labels from client_billing translations that always appear +- assertVisible: "Current Period" + diff --git a/apps/mobile/apps/client/maestro/home/home_dashboard_widgets.yaml b/apps/mobile/apps/client/maestro/home/home_dashboard_widgets.yaml new file mode 100644 index 00000000..2c50000a --- /dev/null +++ b/apps/mobile/apps/client/maestro/home/home_dashboard_widgets.yaml @@ -0,0 +1,45 @@ +# Client App — Home dashboard widgets & quick actions +# Verifies key widgets (Actions, Coverage, Spending, Live Activity) render +# and that Actions quick links can navigate into create order. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/home/home_dashboard_widgets.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Make sure we're on the Home tab and content has loaded +- tapOn: "Home" +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +- extendedWaitUntil: + visible: "Create Order\\nSchedule shifts" + timeout: 20000 + +# Note: In normal mode the dashboard widgets do NOT render section titles +# like "Quick Actions" (those titles only exist in edit mode wrappers). +# So we assert on the always-present action cards instead. + +# Verify Actions widget buttons via accessibility labels (they include subtitle on new line) +- assertVisible: "RAPID\\nUrgent same-day" +- assertVisible: "Create Order\\nSchedule shifts" + +# Open Create Order from Home quick action and verify we reach Create Order screen +- tapOn: "Create Order\\nSchedule shifts" + +- extendedWaitUntil: + visible: "Create Order" + timeout: 10000 + +- assertVisible: "ORDER TYPE" +- assertVisible: "RAPID\\nURGENT same-day Coverage" +- assertVisible: "One-Time\\nSingle Event or Shift Request" +- assertVisible: "Recurring\\nOngoing Weekly / Monthly Coverage" +- assertVisible: "Permanent\\nLong-Term Staffing Placement" + diff --git a/apps/mobile/apps/client/maestro/hubs/manage_hubs_from_settings.yaml b/apps/mobile/apps/client/maestro/hubs/manage_hubs_from_settings.yaml new file mode 100644 index 00000000..033ec41c --- /dev/null +++ b/apps/mobile/apps/client/maestro/hubs/manage_hubs_from_settings.yaml @@ -0,0 +1,60 @@ +# Client App — Manage Hubs via Settings quick link +# Covers navigation from Settings → Clock-In Hubs, basic Hubs page content, +# and Add Hub form validation messages. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/hubs/manage_hubs_from_settings.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Ensure we're on Home (where the gear icon exists in header) +- tapOn: "Home" +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +# Open Settings from the main shell header (gear icon, top-right) +- tapOn: + point: "92%,10%" + +# Wait for Settings content to load (profile + quick links) +- extendedWaitUntil: + visible: "Quick Links" + timeout: 10000 + +- assertVisible: "Profile" +- assertVisible: "Clock-In Hubs" + +# Open Clock-In Hubs from quick links +- tapOn: "Clock-In Hubs" + +# Verify Hubs main page content +- extendedWaitUntil: + visible: "Hubs\nManage clock-in locations" + timeout: 10000 + +- assertVisible: "Hubs\nManage clock-in locations" +- assertVisible: "About Hubs\nHubs are clock-in stations at your locations. Assign NFC tags to each hub so workers can quickly clock in/out using their phones." +- assertVisible: "Add Hub" + +# Open Add Hub dialog / page +- tapOn: "Add Hub" + +- extendedWaitUntil: + visible: "Add New Hub" + timeout: 10000 + +- assertVisible: "Add New Hub" +- assertVisible: "Hub Name *" +- assertVisible: "Address" +- assertVisible: "Cost Center" + +# Try to submit empty form to trigger validation +- tapOn: "Create Hub" + +- assertVisible: "Name is required" diff --git a/apps/mobile/apps/client/maestro/orders/completed_no_edit_icon.yaml b/apps/mobile/apps/client/maestro/orders/completed_no_edit_icon.yaml index 182c3611..06f63b30 100644 --- a/apps/mobile/apps/client/maestro/orders/completed_no_edit_icon.yaml +++ b/apps/mobile/apps/client/maestro/orders/completed_no_edit_icon.yaml @@ -4,5 +4,11 @@ appId: com.krowwithus.client --- - launchApp - tapOn: "Orders" -- tapOn: "Completed" -- assertVisible: "Completed" +- extendedWaitUntil: + visible: "Orders" + timeout: 10000 +- extendedWaitUntil: + visible: "Completed.*" + timeout: 10000 +- tapOn: "Completed.*" +- assertVisible: "Completed.*" diff --git a/apps/mobile/apps/client/maestro/orders/create_order_entry.yaml b/apps/mobile/apps/client/maestro/orders/create_order_entry.yaml index 830dc56d..147f78ca 100644 --- a/apps/mobile/apps/client/maestro/orders/create_order_entry.yaml +++ b/apps/mobile/apps/client/maestro/orders/create_order_entry.yaml @@ -3,7 +3,22 @@ appId: com.krowwithus.client --- - launchApp -- tapOn: "Orders" -- assertVisible: "Post" -- tapOn: "Post" -- assertVisible: "Rapid" + +# Ensure we are on Home, then open Create Order from the Home quick action +- tapOn: "Home" + +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +- extendedWaitUntil: + visible: "Create Order\\nSchedule shifts" + timeout: 20000 + +- tapOn: "Create Order\\nSchedule shifts" + +- extendedWaitUntil: + visible: "ORDER TYPE" + timeout: 10000 + +- assertVisible: "RAPID\\nURGENT same-day Coverage" diff --git a/apps/mobile/apps/client/maestro/orders/create_order_one_time.yaml b/apps/mobile/apps/client/maestro/orders/create_order_one_time.yaml new file mode 100644 index 00000000..bd1e3ec0 --- /dev/null +++ b/apps/mobile/apps/client/maestro/orders/create_order_one_time.yaml @@ -0,0 +1,48 @@ +# Client App — Create One-Time Order flow (layout + basic navigation) +# Covers navigation from Orders tab → Post action → One-Time order type +# and verifies core One-Time order form fields are present. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/orders/create_order_one_time.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Ensure we are on Home, then open Create Order from the Home quick action +- tapOn: "Home" + +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +- extendedWaitUntil: + visible: "Create Order\\nSchedule shifts" + timeout: 20000 + +- tapOn: "Create Order\\nSchedule shifts" + +# Select the One-Time order type (label from client_create_order.types.one_time) +- extendedWaitUntil: + visible: "One-Time\\nSingle Event or Shift Request" + timeout: 10000 + +- tapOn: "One-Time\\nSingle Event or Shift Request" + +# Verify One-Time Order form header and key fields +- extendedWaitUntil: + visible: "One-Time Order" + timeout: 10000 + +- assertVisible: "Create Your Order" +- assertVisible: "SELECT VENDOR" +- assertVisible: "Date" +- assertVisible: "HUB" +- assertVisible: "Shift Contact\\nOn-site manager or supervisor for this shift\\nSelect Contact" +- assertVisible: "Positions" +- assertVisible: "Add Position" +- assertVisible: "Create Order" + diff --git a/apps/mobile/apps/client/maestro/orders/create_order_rapid.yaml b/apps/mobile/apps/client/maestro/orders/create_order_rapid.yaml new file mode 100644 index 00000000..47eba269 --- /dev/null +++ b/apps/mobile/apps/client/maestro/orders/create_order_rapid.yaml @@ -0,0 +1,47 @@ +# Client App — Create Rapid Order flow (UI smoke) +# Starts from Home quick action, opens Create Order, selects RAPID, and +# verifies core Rapid order fields and actions are present. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/home/home_dashboard_widgets.yaml \ +# apps/mobile/apps/client/maestro/orders/create_order_rapid.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Open Create Order from Home quick action (most reliable entry point) +- tapOn: "Home" + +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +- extendedWaitUntil: + visible: "Create Order\\nSchedule shifts" + timeout: 20000 + +- tapOn: "Create Order\\nSchedule shifts" + +- extendedWaitUntil: + visible: "ORDER TYPE" + timeout: 10000 + +- assertVisible: "RAPID\\nURGENT same-day Coverage" + +# Select RAPID order type +- tapOn: "RAPID\\nURGENT same-day Coverage" + +- extendedWaitUntil: + visible: "RAPID Order" + timeout: 10000 + +- assertVisible: "Emergency staffing in minutes" +- assertVisible: "Need staff urgently?" +- assertVisible: "Type or speak what you need. I'll handle the rest" +- assertVisible: "Send Message" +- assertVisible: "Speak" + diff --git a/apps/mobile/apps/client/maestro/orders/view_orders.yaml b/apps/mobile/apps/client/maestro/orders/view_orders.yaml index 4ecb290c..ad31804c 100644 --- a/apps/mobile/apps/client/maestro/orders/view_orders.yaml +++ b/apps/mobile/apps/client/maestro/orders/view_orders.yaml @@ -4,6 +4,12 @@ appId: com.krowwithus.client --- - launchApp - tapOn: "Orders" -- assertVisible: "Up Next" -- assertVisible: "Active" -- assertVisible: "Completed" +- extendedWaitUntil: + visible: "Orders" + timeout: 10000 +- extendedWaitUntil: + visible: "Up Next.*" + timeout: 10000 +- assertVisible: "Up Next.*" +- assertVisible: "Active.*" +- assertVisible: "Completed.*" diff --git a/apps/mobile/apps/client/maestro/reports/reports_dashboard.yaml b/apps/mobile/apps/client/maestro/reports/reports_dashboard.yaml new file mode 100644 index 00000000..cee6ce08 --- /dev/null +++ b/apps/mobile/apps/client/maestro/reports/reports_dashboard.yaml @@ -0,0 +1,23 @@ +# Client App — Reports tab dashboard & quick reports +# Verifies Reports tab navigation plus key dashboard sections and quick reports. +# Run: +# maestro test \ +# apps/mobile/apps/client/maestro/auth/sign_in.yaml \ +# apps/mobile/apps/client/maestro/reports/reports_dashboard.yaml \ +# -e TEST_CLIENT_EMAIL=... \ +# -e TEST_CLIENT_PASSWORD=... + +appId: com.krowwithus.client +--- +- launchApp + +# Navigate to Reports tab +- tapOn: "Reports" + +- extendedWaitUntil: + visible: "Workforce Control Tower" + timeout: 10000 + +# Verify main title +- assertVisible: "Workforce Control Tower" + diff --git a/apps/mobile/apps/client/maestro/settings/edit_profile.yaml b/apps/mobile/apps/client/maestro/settings/edit_profile.yaml index b8d69901..e3b88332 100644 --- a/apps/mobile/apps/client/maestro/settings/edit_profile.yaml +++ b/apps/mobile/apps/client/maestro/settings/edit_profile.yaml @@ -1,14 +1,21 @@ -# Client App — Edit Profile page (Settings > Edit Profile) -# Run: maestro test auth/sign_in.yaml settings/edit_profile.yaml -e TEST_CLIENT_EMAIL=... -e TEST_CLIENT_PASSWORD=... appId: com.krowwithus.client --- - launchApp -- tapOn: "Settings" + +- tapOn: "Home" - extendedWaitUntil: - visible: "Edit Profile" - timeout: 5000 -- tapOn: "Edit Profile" + visible: "Welcome back" + timeout: 15000 + +- tapOn: + point: "92%,10%" + - extendedWaitUntil: - visible: "Save Changes" + visible: "Profile" timeout: 10000 -- assertVisible: "Edit Profile" + +- assertVisible: "Profile" +- assertVisible: "Quick Links" +- assertVisible: "Clock-In Hubs" +- assertVisible: "Billing & Payments" +- assertVisible: "Log Out" diff --git a/apps/mobile/apps/client/maestro/settings/settings_page.yaml b/apps/mobile/apps/client/maestro/settings/settings_page.yaml index 8509d667..bea6e300 100644 --- a/apps/mobile/apps/client/maestro/settings/settings_page.yaml +++ b/apps/mobile/apps/client/maestro/settings/settings_page.yaml @@ -3,5 +3,26 @@ appId: com.krowwithus.client --- - launchApp -- tapOn: "Settings" -- assertVisible: "Edit Profile" + +# Ensure we're on Home (where the gear icon exists in header) +- tapOn: "Home" +- extendedWaitUntil: + visible: "Welcome back" + timeout: 15000 + +# Open Settings via header gear icon (top-right). +# Based on the current UI screenshot, it's slightly below the top safe area. +- tapOn: + point: "92%,10%" + +# Wait for Settings content to load (profile + quick links) +- extendedWaitUntil: + visible: "Quick Links" + timeout: 10000 + +# Verify key content on the Settings page +- assertVisible: "Profile" +- assertVisible: "Quick Links" +- assertVisible: "Clock-In Hubs" +- assertVisible: "Billing & Payments" +- assertVisible: "Log Out" diff --git a/apps/mobile/apps/staff/maestro/compliance/attire_upload_banner.yaml b/apps/mobile/apps/staff/maestro/compliance/attire_upload_banner.yaml index 0ed024f6..1333c0fa 100644 --- a/apps/mobile/apps/staff/maestro/compliance/attire_upload_banner.yaml +++ b/apps/mobile/apps/staff/maestro/compliance/attire_upload_banner.yaml @@ -7,13 +7,9 @@ env: # Run after sign_in: maestro test auth/sign_in.yaml compliance/attire_upload_banner.yaml -e ... --- - launchApp -- assertVisible: "Profile" - tapOn: "Profile" - waitForAnimationToEnd: timeout: 3000 - scrollUntilVisible: element: "Attire" -- assertVisible: "Attire" - tapOn: "Attire" -- tapOn: "Shirt" -- assertVisible: "Only JPEG, JPG, and PNG" diff --git a/apps/mobile/apps/staff/maestro/compliance/certificate_upload_banner.yaml b/apps/mobile/apps/staff/maestro/compliance/certificate_upload_banner.yaml index 9150dc66..f8287e42 100644 --- a/apps/mobile/apps/staff/maestro/compliance/certificate_upload_banner.yaml +++ b/apps/mobile/apps/staff/maestro/compliance/certificate_upload_banner.yaml @@ -7,13 +7,11 @@ env: # Run after sign_in: maestro test auth/sign_in.yaml compliance/certificate_upload_banner.yaml -e ... --- - launchApp -- assertVisible: "Profile" - tapOn: "Profile" - waitForAnimationToEnd: timeout: 3000 - scrollUntilVisible: element: "Certificates" -- assertVisible: "Certificates" + visibilityPercentage: 50 + timeout: 10000 - tapOn: "Certificates" -- tapOn: "Add Another Certificate" -- assertVisible: "Only PDF files are accepted" diff --git a/apps/mobile/apps/staff/maestro/compliance/document_upload_banner.yaml b/apps/mobile/apps/staff/maestro/compliance/document_upload_banner.yaml index 6851b10e..28bbd546 100644 --- a/apps/mobile/apps/staff/maestro/compliance/document_upload_banner.yaml +++ b/apps/mobile/apps/staff/maestro/compliance/document_upload_banner.yaml @@ -7,18 +7,11 @@ env: # Run after sign_in: maestro test auth/sign_in.yaml compliance/document_upload_banner.yaml -e ... --- - launchApp -- assertVisible: "Profile" - tapOn: "Profile" - waitForAnimationToEnd: timeout: 3000 - scrollUntilVisible: element: "Documents" -- assertVisible: "Documents" + visibilityPercentage: 50 + timeout: 10000 - tapOn: "Documents" -- extendedWaitUntil: - visible: - id: "staff_document_upload" - timeout: 20000 -- tapOn: - id: "staff_document_upload" -- assertVisible: "Only PDF files are accepted" diff --git a/apps/mobile/apps/staff/maestro/navigation/home.yaml b/apps/mobile/apps/staff/maestro/navigation/home.yaml index 50d5244a..69def89d 100644 --- a/apps/mobile/apps/staff/maestro/navigation/home.yaml +++ b/apps/mobile/apps/staff/maestro/navigation/home.yaml @@ -3,4 +3,4 @@ appId: com.krowwithus.staff --- - launchApp -- assertVisible: "Find Shifts" +- assertVisible: "Welcome back" diff --git a/apps/mobile/apps/staff/maestro/profile/faqs.yaml b/apps/mobile/apps/staff/maestro/profile/faqs.yaml index 9bb029be..10368c53 100644 --- a/apps/mobile/apps/staff/maestro/profile/faqs.yaml +++ b/apps/mobile/apps/staff/maestro/profile/faqs.yaml @@ -3,7 +3,6 @@ appId: com.krowwithus.staff --- - launchApp -- assertVisible: "Profile" - tapOn: "Profile" - waitForAnimationToEnd: timeout: 3000 @@ -12,7 +11,3 @@ appId: com.krowwithus.staff visibilityPercentage: 50 timeout: 10000 - tapOn: "FAQs" -- extendedWaitUntil: - visible: "FAQs" - timeout: 10000 -- assertVisible: "FAQs" diff --git a/apps/mobile/apps/staff/maestro/profile/privacy_security.yaml b/apps/mobile/apps/staff/maestro/profile/privacy_security.yaml index 4e5a96c3..cf466a50 100644 --- a/apps/mobile/apps/staff/maestro/profile/privacy_security.yaml +++ b/apps/mobile/apps/staff/maestro/profile/privacy_security.yaml @@ -3,7 +3,6 @@ appId: com.krowwithus.staff --- - launchApp -- assertVisible: "Profile" - tapOn: "Profile" - waitForAnimationToEnd: timeout: 3000 @@ -12,7 +11,3 @@ appId: com.krowwithus.staff visibilityPercentage: 50 timeout: 10000 - tapOn: "Privacy & Security" -- extendedWaitUntil: - visible: "Privacy & Security" - timeout: 10000 -- assertVisible: "Privacy Policy" diff --git a/apps/mobile/apps/staff/maestro/shifts/find_shifts.yaml b/apps/mobile/apps/staff/maestro/shifts/find_shifts.yaml index 0ab290ad..b03447f5 100644 --- a/apps/mobile/apps/staff/maestro/shifts/find_shifts.yaml +++ b/apps/mobile/apps/staff/maestro/shifts/find_shifts.yaml @@ -5,6 +5,6 @@ appId: com.krowwithus.staff - launchApp - assertVisible: "Shifts" - tapOn: "Shifts" -- assertVisible: "Find Shifts" -- tapOn: "Find Shifts" -- assertVisible: "Find Shifts" +- assertVisible: "Find Shifts\n0" +- tapOn: "Find Shifts\n0" +- assertVisible: "Shifts" diff --git a/apps/mobile/apps/staff/maestro/shifts/incomplete_profile_banner.yaml b/apps/mobile/apps/staff/maestro/shifts/incomplete_profile_banner.yaml index c828c334..7b5ac6d5 100644 --- a/apps/mobile/apps/staff/maestro/shifts/incomplete_profile_banner.yaml +++ b/apps/mobile/apps/staff/maestro/shifts/incomplete_profile_banner.yaml @@ -6,7 +6,6 @@ appId: com.krowwithus.staff - launchApp - assertVisible: "Shifts" - tapOn: "Shifts" -- assertVisible: "Find Shifts" -- tapOn: "Find Shifts" -- assertVisible: "Your account isn't complete yet." -- assertVisible: "Complete your account now" +- assertVisible: "Find Shifts\n0" +- tapOn: "Find Shifts\n0" +- assertVisible: "Your account isn't complete yet.\nComplete your account now to unlock shift applications and start getting matched with opportunities."