testcases

This commit is contained in:
2026-03-06 17:19:12 +05:30
parent b43e28e09d
commit 91cedf54c9
22 changed files with 1100 additions and 9 deletions

View File

@@ -22,21 +22,30 @@ maestro/
view_orders.yaml
completed_no_edit_icon.yaml # #492
create_order_entry.yaml
create_order_rapid.yaml
rapid_to_one_time_draft_submit_e2e.yaml
create_order_one_time_e2e.yaml
edit_active_order_e2e.yaml
edit_active_order_verify_updated_e2e.yaml
hubs/
create_hub_e2e.yaml
manage_hubs_from_settings.yaml
edit_hub_e2e.yaml
delete_hub_e2e.yaml
billing/
billing_overview.yaml
invoice_details_smoke.yaml
invoice_approval_e2e.yaml
reports/
reports_dashboard.yaml
spend_report_export_smoke.yaml
home/
home_dashboard_widgets.yaml
tab_bar_roundtrip.yaml
settings/
settings_page.yaml
edit_profile.yaml
edit_profile_save_e2e.yaml
logout_flow.yaml
```
@@ -56,6 +65,13 @@ maestro/
make test-e2e-client # Auth only
make test-e2e-client-extended # Auth + nav + orders + settings
make test-e2e-client-happy-path # Auth + hubs + create order E2E + billing + reports + logout (#572)
make test-e2e-client-smoke # Deterministic smoke suite
make test-e2e-client-hubs-e2e # Hubs manage + edit + delete
make test-e2e-client-billing-smoke # Billing overview + invoice details/empty state
make test-e2e-client-reports-smoke # Reports dashboard + export placeholder
make test-e2e-client-settings-e2e # Settings + edit profile save + logout
make test-e2e-client-orders-smoke # Orders smoke (RAPID → One-Time draft)
make test-e2e-client-orders-data # Orders data-dependent (edit active order)
# Direct
maestro test apps/mobile/apps/client/maestro/auth/sign_in.yaml \

View File

@@ -0,0 +1,42 @@
# Client App — Billing: open invoice details (smoke)
# Purpose:
# - Validates Billing tab loads
# - If invoices exist, opens an invoice and verifies invoice actions (e.g. Download PDF)
# - If no invoices exist, verifies the empty-state copy is shown
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/billing/invoice_details_smoke.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Billing"
- extendedWaitUntil:
visible: "Current Period"
timeout: 10000
# If there are invoices ready, open one and verify details actions (optional)
- tapOn: "Invoice Ready"
optional: true
- extendedWaitUntil:
visible: "Download Invoice PDF"
timeout: 10000
optional: true
- assertVisible: "Download Invoice PDF"
optional: true
# Otherwise, validate deterministic empty states (still a valid smoke outcome)
- assertVisible: "No invoices ready yet"
optional: true
- assertVisible: "No Invoices for the selected period"
optional: true
# Always end by asserting we are still in Billing context
- assertVisible: "Current Period"

View File

@@ -0,0 +1,80 @@
# Client App — E2E: Delete Hub (create → details → delete)
# Purpose:
# - Creates a hub
# - Opens Hub Details and deletes it
# - Verifies deletion confirmation and success
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/hubs/delete_hub_e2e.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Home"
- extendedWaitUntil:
visible: "Welcome back"
timeout: 15000
# Open Settings via header gear icon (top-right)
- tapOn:
point: "92%,10%"
- extendedWaitUntil:
visible: "Clock-In Hubs"
timeout: 10000
- tapOn: "Clock-In Hubs"
- extendedWaitUntil:
visible: "Hubs\nManage clock-in locations"
timeout: 15000
# Create a hub for this test run (deterministic)
- tapOn: "Add Hub"
- extendedWaitUntil:
visible: "Add New Hub"
timeout: 10000
- tapOn: "Hub Name *"
- inputText: "E2E Hub Delete"
- hideKeyboard
- tapOn:
point: "50%,60%"
- inputText: "345 Park Avenue, New York, NY"
- hideKeyboard
- tapOn:
point: "50%,88%"
- extendedWaitUntil:
visible: "Hubs\nManage clock-in locations"
timeout: 20000
- scrollUntilVisible:
element: "E2E Hub Delete"
visibilityPercentage: 50
timeout: 15000
- tapOn: "E2E Hub Delete"
- extendedWaitUntil:
visible: "E2E Hub Delete"
timeout: 10000
# Delete action is the destructive bottom button on details page
- assertVisible: "Delete"
- tapOn: "Delete"
- extendedWaitUntil:
visible: "Confirm Hub Deletion"
timeout: 10000
- tapOn: "Delete"
- extendedWaitUntil:
visible: "Hub deleted successfully"
timeout: 15000

View File

@@ -0,0 +1,86 @@
# Client App — E2E: Edit Hub (create → details → edit)
# Purpose:
# - Ensures hubs list is reachable from Settings
# - Creates a hub (if needed for the test run)
# - Opens Hub Details, edits hub name, verifies success
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/hubs/edit_hub_e2e.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Home"
- extendedWaitUntil:
visible: "Welcome back"
timeout: 15000
# Open Settings via header gear icon (top-right)
- tapOn:
point: "92%,10%"
- extendedWaitUntil:
visible: "Clock-In Hubs"
timeout: 10000
- tapOn: "Clock-In Hubs"
- extendedWaitUntil:
visible: "Hubs\nManage clock-in locations"
timeout: 15000
# Create a hub for this test run (deterministic)
- tapOn: "Add Hub"
- extendedWaitUntil:
visible: "Add New Hub"
timeout: 10000
- tapOn: "Hub Name *"
- inputText: "E2E Hub Edit"
- hideKeyboard
# Address field uses an autocomplete widget; focus it via a safe coordinate
- tapOn:
point: "50%,60%"
- inputText: "345 Park Avenue, New York, NY"
- hideKeyboard
- tapOn:
point: "50%,88%"
- extendedWaitUntil:
visible: "Hubs\nManage clock-in locations"
timeout: 20000
- scrollUntilVisible:
element: "E2E Hub Edit"
visibilityPercentage: 50
timeout: 15000
- tapOn: "E2E Hub Edit"
# Hub details page uses the hub name as the app bar title
- extendedWaitUntil:
visible: "E2E Hub Edit"
timeout: 10000
- assertVisible: "Edit Hub"
- tapOn: "Edit Hub"
- extendedWaitUntil:
visible: "Edit Hub"
timeout: 10000
# Append suffix to avoid needing to clear the field
- tapOn: "Hub Name *"
- inputText: " Updated"
- hideKeyboard
- tapOn: "Save Changes"
- extendedWaitUntil:
visible: "Hub updated successfully"
timeout: 15000

View File

@@ -0,0 +1,66 @@
# Client App — E2E: Edit Active Order and verify update confirmation
# Purpose:
# - Opens an active order edit sheet
# - Adjusts workers count (+1)
# - Confirms save
# - Verifies the "Order Updated!" confirmation UI appears
#
# Prerequisite:
# User must have at least one active, uncompleted order.
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/orders/edit_active_order_verify_updated_e2e.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- assertVisible: "Home"
- tapOn: "Home"
- waitForAnimationToEnd:
timeout: 3000
# Wait for active orders to load and ensure we have an OPEN order
- scrollUntilVisible:
element: "OPEN"
visibilityPercentage: 50
timeout: 15000
# Tap edit on the active order card (prefer ID; fallback to a safe point)
- tapOn:
id: "edit_order_button"
point: "85%,25%"
- extendedWaitUntil:
visible: "Edit One-Time Order"
timeout: 15000
- scrollUntilVisible:
element: "WORKERS"
visibilityPercentage: 50
timeout: 15000
- tapOn: "+"
- tapOn: "Review Positions"
- extendedWaitUntil:
visible: "Positions Breakdown"
timeout: 15000
- tapOn: "Confirm & Save"
# Verify the in-app confirmation appears
- extendedWaitUntil:
visible: "Order Updated!"
timeout: 20000
- assertVisible: "Your shift has been updated successfully."
- tapOn: "Back to Orders"
- extendedWaitUntil:
visible: "Orders"
timeout: 15000

View File

@@ -0,0 +1,48 @@
# Client App — E2E: Rapid order → parsed One-Time draft (submit)
# Purpose:
# - Validates the full RAPID happy path including submitting a message and
# landing on the One-Time order draft screen.
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/orders/rapid_to_one_time_draft_submit_e2e.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Home"
- extendedWaitUntil:
visible: "Welcome back"
timeout: 15000
- extendedWaitUntil:
visible: "Create Order\nSchedule shifts"
timeout: 20000
- tapOn: "Create Order\nSchedule shifts"
- extendedWaitUntil:
visible: "RAPID\nURGENT same-day Coverage"
timeout: 10000
- tapOn: "RAPID\nURGENT same-day Coverage"
- extendedWaitUntil:
visible: "RAPID Order"
timeout: 10000
# Use a predefined example message so the Rapid flow has valid input.
- tapOn: ".*Need 2 cooks ASAP.*"
- assertVisible: "Send Message"
- tapOn: "Send Message"
# Parsed result should navigate into a One-Time order draft screen.
# This depends on backend parsing; allow extra time for slower networks.
- extendedWaitUntil:
visible: "ORDER NAME"
timeout: 60000
- assertVisible: "Select Role"

View File

@@ -0,0 +1,42 @@
# Client App — Reports: Spend Report export (smoke)
# Purpose:
# - Opens Reports dashboard
# - Opens Spend Report
# - Triggers Export action and verifies placeholder export message
#
# Note: Export is currently placeholder-driven in UI strings.
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/reports/spend_report_export_smoke.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Reports"
- extendedWaitUntil:
visible: "Workforce Control Tower"
timeout: 10000
- scrollUntilVisible:
element: "Quick Reports"
visibilityPercentage: 50
timeout: 15000
- assertVisible: "Quick Reports"
- tapOn: "Spend Report"
- extendedWaitUntil:
visible: "Spend Report"
timeout: 10000
# Trigger export (may be a placeholder message)
- tapOn: "Export"
- extendedWaitUntil:
visible: "Exporting Spend Report \\(Placeholder\\)"
timeout: 10000

View File

@@ -0,0 +1,76 @@
# Client App — E2E: Edit Profile save (with re-open verification)
# Purpose:
# - Navigates Settings → Profile → Edit Profile
# - Saves a small change and verifies success message
# - Re-opens Edit Profile to validate the change is visible (basic persistence check)
#
# Run:
# maestro test \
# apps/mobile/apps/client/maestro/auth/sign_in.yaml \
# apps/mobile/apps/client/maestro/settings/edit_profile_save_e2e.yaml \
# -e TEST_CLIENT_EMAIL=... \
# -e TEST_CLIENT_PASSWORD=...
appId: com.krowwithus.client
---
- launchApp
- tapOn: "Home"
- extendedWaitUntil:
visible: "Welcome back"
timeout: 15000
# Open Settings via header gear icon (top-right)
- tapOn:
point: "92%,10%"
- extendedWaitUntil:
visible: "Profile"
timeout: 10000
- tapOn: "Profile"
- extendedWaitUntil:
visible: "Edit Profile"
timeout: 10000
- tapOn: "Edit Profile"
- extendedWaitUntil:
visible: "Edit Profile"
timeout: 10000
- assertVisible: "FIRST NAME"
- assertVisible: "LAST NAME"
- assertVisible: "PHONE NUMBER"
- assertVisible: "Save Changes"
# Append a suffix to first name (avoids needing to clear the field)
- tapOn: "FIRST NAME"
- inputText: " QA"
- hideKeyboard
- tapOn: "Save Changes"
- extendedWaitUntil:
visible: "Profile updated successfully"
timeout: 15000
# Re-open Edit Profile and confirm the suffix is visible somewhere in the form.
- launchApp
- tapOn: "Home"
- extendedWaitUntil:
visible: "Welcome back"
timeout: 15000
- tapOn:
point: "92%,10%"
- extendedWaitUntil:
visible: "Profile"
timeout: 10000
- tapOn: "Profile"
- extendedWaitUntil:
visible: "Edit Profile"
timeout: 10000
- tapOn: "Edit Profile"
- extendedWaitUntil:
visible: "Edit Profile"
timeout: 10000
- assertVisible: "QA"

View File

@@ -24,17 +24,25 @@ maestro/
documents_list.yaml
certificates_list.yaml
time_card.yaml
time_card_detail_smoke.yaml
bank_account.yaml
bank_account_fields_smoke.yaml
tax_forms.yaml
tax_forms_smoke.yaml
faqs.yaml
privacy_security.yaml
emergency_contact.yaml
attire.yaml
attire_validation_e2e.yaml
compliance/
document_upload_banner.yaml # #550
certificate_upload_banner.yaml # #551
attire_upload_banner.yaml # #552
document_upload_e2e.yaml
certificate_upload_e2e.yaml
shifts/
find_shifts.yaml
find_shifts_apply_smoke.yaml
clock_in_e2e.yaml
clock_out_e2e.yaml
incomplete_profile_banner.yaml # #549 (requires incomplete-profile user)
@@ -42,6 +50,7 @@ maestro/
set_availability_e2e.yaml
payments/
payments_view_e2e.yaml
payment_history_smoke.yaml
home/
benefits.yaml # #524
```
@@ -67,6 +76,11 @@ maestro/
make test-e2e-staff # Auth only
make test-e2e-staff-extended # Auth + nav + profile + compliance + shifts + benefits
make test-e2e-staff-happy-path # Auth + clock in/out + availability + document upload + payments + sign out (#572)
make test-e2e-staff-smoke # Deterministic smoke suite
make test-e2e-staff-profile-smoke # Profile smoke (timecard/bank/tax/attire validation)
make test-e2e-staff-payments-smoke # Payments smoke (earnings history)
make test-e2e-staff-shifts-smoke # Shifts smoke (find shifts; optionally apply)
make test-e2e-staff-compliance-e2e # Compliance E2E (document + certificate uploads)
# Direct
maestro test apps/mobile/apps/staff/maestro/auth/sign_in.yaml \

View File

@@ -0,0 +1,71 @@
# Staff App — E2E: Certificate Upload
# Purpose:
# - Opens Certificates
# - Uploads a PDF certificate and verifies success snackbar
#
# Prerequisite:
# - Push fixture.pdf to emulator/device before running:
# bash apps/mobile/apps/staff/maestro/compliance/push_fixture.sh
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/compliance/certificate_upload_e2e.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- tapOn: "Profile"
- waitForAnimationToEnd:
timeout: 3000
- scrollUntilVisible:
element: "Certificates"
visibilityPercentage: 50
timeout: 15000
- tapOn: "Certificates"
- extendedWaitUntil:
visible: "Certificates"
timeout: 15000
# Start upload (button can exist on cards or as an add-more CTA)
- tapOn: "Upload Certificate"
optional: true
- tapOn: "Add Another Certificate"
optional: true
- extendedWaitUntil:
visible: "Upload Certificate"
timeout: 10000
- assertVisible: "Certificate Name"
- tapOn: "Certificate Name"
- inputText: "E2E Food Handler Permit"
- hideKeyboard
- tapOn: "Certificate Issuer"
- inputText: "E2E Department"
- hideKeyboard
- scrollUntilVisible:
element: "Upload File"
visibilityPercentage: 50
timeout: 10000
- tapOn: "Upload File"
- extendedWaitUntil:
visible: "fixture.pdf"
timeout: 10000
- tapOn: "fixture.pdf"
- tapOn: "Save Certificate"
- extendedWaitUntil:
visible: "Certificate successfully uploaded and pending verification"
timeout: 20000

View File

@@ -0,0 +1,8 @@
#!/bin/bash
# Compatibility wrapper for older docs/flows that reference push_upload_fixture.sh.
# Preferred script name: push_fixture.sh
SCRIPT_DIR=$(dirname "$0")
bash "$SCRIPT_DIR/push_fixture.sh"

View File

@@ -0,0 +1,38 @@
# Staff App — Payments: history visible (smoke)
# Purpose:
# - Navigates to Earnings/Payments
# - Verifies Total Earnings loads and Recent Payments section is reachable
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/payments/payment_history_smoke.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- extendedWaitUntil:
visible: "Shifts"
timeout: 10000
# Try tab/button variants depending on profile
- tapOn:
id: "nav_payments"
optional: true
- tapOn: "Earnings"
optional: true
- extendedWaitUntil:
visible: "Total Earnings"
timeout: 15000
- scrollUntilVisible:
element: "Recent Payments"
visibilityPercentage: 50
timeout: 15000
- assertVisible: "Recent Payments"

View File

@@ -0,0 +1,54 @@
# Staff App — E2E: Attire capture attestation guard (deterministic)
# Purpose:
# - Opens Verify Attire from Profile
# - Opens a required attire item
# - Verifies Gallery/Camera actions are present
# - Tapping Gallery without attesting shows the expected warning snackbar
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/profile/attire_validation_e2e.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- tapOn: "Profile"
- waitForAnimationToEnd:
timeout: 3000
- scrollUntilVisible:
element: "Attire"
visibilityPercentage: 50
timeout: 15000
- tapOn: "Attire"
- extendedWaitUntil:
visible: "Verify Attire"
timeout: 15000
# Open a required attire item (label text can vary by environment, so we use a stable one)
- scrollUntilVisible:
element: "Black Pants"
visibilityPercentage: 50
timeout: 20000
centerElement: true
- tapOn: "Black Pants"
- extendedWaitUntil:
visible: "Reference Example"
timeout: 15000
- assertVisible: "Gallery"
- assertVisible: "Camera"
# Attestation is required before media access; the app should block and show a warning.
- tapOn: "Gallery"
- extendedWaitUntil:
visible: "Please attest that you own this item."
timeout: 10000
- assertVisible: "Please attest that you own this item."

View File

@@ -0,0 +1,36 @@
# Staff App — Bank Account fields (smoke)
# Purpose:
# - Opens Bank Account screen
# - Verifies presence of form fields when available
#
# Note: Depending on user state, the screen may show an "added" view rather than the add form.
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/profile/bank_account_fields_smoke.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- assertVisible: "Profile"
- tapOn: "Profile"
- waitForAnimationToEnd:
timeout: 3000
- scrollUntilVisible:
element: "Bank Account"
visibilityPercentage: 50
timeout: 15000
- tapOn: "Bank Account"
- extendedWaitUntil:
visible: "Bank Account"
timeout: 15000
# If add form is visible, validate key fields; otherwise just ensure page loaded.
- assertVisible: "Bank Account"

View File

@@ -0,0 +1,48 @@
# Staff App — Tax forms (smoke)
# Purpose:
# - Opens Tax Forms from Profile
# - Verifies the Tax Documents page title renders
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/profile/tax_forms_smoke.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- tapOn: "Profile"
- waitForAnimationToEnd:
timeout: 3000
- scrollUntilVisible:
element: "Tax Forms(\\n!)?"
visibilityPercentage: 50
timeout: 20000
centerElement: true
- tapOn: "Tax Forms(\\n!)?"
- extendedWaitUntil:
visible: "Why are these needed\\?"
timeout: 30000
- assertVisible: "Why are these needed\\?"
# The forms can render below the fold; scroll to them before asserting.
- scrollUntilVisible:
element: "[\\s\\S]*Form W-4[\\s\\S]*"
visibilityPercentage: 50
timeout: 15000
centerElement: true
- assertVisible: "[\\s\\S]*Form W-4[\\s\\S]*"
- scrollUntilVisible:
element: "[\\s\\S]*Form I-9[\\s\\S]*"
visibilityPercentage: 50
timeout: 15000
centerElement: true
- assertVisible: "[\\s\\S]*Form I-9[\\s\\S]*"

View File

@@ -0,0 +1,35 @@
# Staff App — Timecard details (smoke)
# Purpose:
# - Opens Timecard screen
# - Verifies key summary labels render
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/profile/time_card_detail_smoke.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- assertVisible: "Profile"
- tapOn: "Profile"
- waitForAnimationToEnd:
timeout: 3000
- scrollUntilVisible:
element: "Timecard"
visibilityPercentage: 50
timeout: 15000
- tapOn: "Timecard"
- extendedWaitUntil:
visible: "Hours Worked"
timeout: 15000
- assertVisible: "Timecard"
- assertVisible: "Hours Worked"
- assertVisible: "Total Earnings"

View File

@@ -41,14 +41,13 @@ appId: com.krowwithus.staff
direction: RIGHT
element: "Swipe to Check In"
# If an attire photo is required directly upon clocking-in
- optional:
visible: "Take Photo"
timeout: 5000
- tapOn: "Take Photo"
- extendedWaitUntil:
visible: "Attire photo captured!"
timeout: 10000
# If an attire photo is required directly upon clocking-in (optional)
- tapOn: "Take Photo"
optional: true
- extendedWaitUntil:
visible: "Attire photo captured!"
timeout: 10000
optional: true
# Verified clock in completion
- extendedWaitUntil:

View File

@@ -0,0 +1,45 @@
# Staff App — Find Shifts: open list and (optionally) apply
# Purpose:
# - Opens Shifts → Find Shifts
# - If jobs are available, taps APPLY NOW and verifies "Applying" dialog
# - If no jobs are available, verifies "No shifts found" empty state
#
# Run:
# maestro test \
# apps/mobile/apps/staff/maestro/auth/sign_in.yaml \
# apps/mobile/apps/staff/maestro/shifts/find_shifts_apply_smoke.yaml \
# -e TEST_STAFF_PHONE=... \
# -e TEST_STAFF_OTP=...
appId: com.krowwithus.staff
---
- launchApp
- assertVisible: "Shifts"
- tapOn: "Shifts"
# Open Find Shifts tab (count can vary; use regex)
- scrollUntilVisible:
element: "Find Shifts\\n.*"
visibilityPercentage: 50
timeout: 15000
- tapOn: "Find Shifts\\n.*"
- extendedWaitUntil:
visible: "Shifts"
timeout: 10000
# If jobs exist, APPLY NOW should be present (optional)
- tapOn: "APPLY NOW"
optional: true
- extendedWaitUntil:
visible: "Applying"
timeout: 10000
optional: true
- assertVisible: "Applying"
optional: true
# Otherwise, empty state may be visible (optional)
- assertVisible: "No shifts found"
optional: true