1610 lines
47 KiB
Markdown
1610 lines
47 KiB
Markdown
# 🧪 KROW Workforce Platform - QA Testing Checklist
|
||
|
||
**Version:** 1.0
|
||
**Date:** February 1, 2026
|
||
**Coverage:** Client App + Staff App
|
||
**Purpose:** Manual QA and Regression Testing
|
||
|
||
---
|
||
|
||
## 📋 TABLE OF CONTENTS
|
||
|
||
1. [Feature-Level QA Checklist](#1️⃣-feature-level-qa-checklist)
|
||
- [Client App Features](#client-app-features)
|
||
- [Staff App Features](#staff-app-features)
|
||
2. [Cross-Application Test Scenarios](#2️⃣-cross-application-test-scenarios)
|
||
3. [Shared Infrastructure Validation](#3️⃣-shared-infrastructure-validation)
|
||
4. [Regression & Release Checklist](#4️⃣-regression--release-checklist)
|
||
|
||
---
|
||
|
||
## 1️⃣ FEATURE-LEVEL QA CHECKLIST
|
||
|
||
### CLIENT APP FEATURES
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-001: Authentication
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Launch app → Get Started → Sign In
|
||
- Launch app → Get Started → Sign Up
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Sign in with valid email and password displays home dashboard
|
||
- [ ] Sign up with business details creates account and navigates to home
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Invalid email format shows validation error
|
||
- [ ] Incorrect password shows authentication error
|
||
- [ ] Weak password in sign-up shows strength requirements
|
||
- [ ] Duplicate email in sign-up shows "already registered" error
|
||
- [ ] Empty fields show required field errors
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays during authentication
|
||
- [ ] OAuth redirect shows appropriate loading state
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-002: Home Dashboard
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Home tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Dashboard displays current day coverage widget
|
||
- [ ] Spending analytics widget shows correct totals
|
||
- [ ] Recent reorders display completed shift roles
|
||
- [ ] Quick action buttons navigate to correct features
|
||
- [ ] Drag-and-drop widget reordering works correctly
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty state shows "No data available" when no orders exist
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Empty coverage shows "No shifts today"
|
||
- [ ] Empty reorders shows "No recent orders"
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-003: Create Order
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Home → Create Order button
|
||
- Orders tab → + FAB button
|
||
- Order type → One-Time
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Order type selection displays.
|
||
- [ ] Hub selection shows list of business hubs
|
||
- [ ] Role selection displays vendor roles
|
||
- [ ] Position quantity can be incremented/decremented (min 1)
|
||
- [ ] Date picker displays correct calendar
|
||
- [ ] Time pickers show valid time ranges
|
||
- [ ] Break duration affects total hours calculation
|
||
- [ ] Cost preview calculates correctly (rate × positions × hours)
|
||
- [ ] Order submission creates order, shift, and shift roles
|
||
- [ ] Success confirmation displays after submission
|
||
- [ ] New order appears in View Orders list
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty hub field shows validation error
|
||
- [ ] Empty role field shows validation error
|
||
- [ ] Zero positions shows validation error
|
||
- [ ] Invalid date (past) shows validation error
|
||
- [ ] Start time after end time shows validation error
|
||
- [ ] Missing required fields prevent submission
|
||
- [ ] Backend validation errors display appropriately
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Hub list shows "No hubs" if none exist
|
||
- [ ] Role list shows "No roles" if none configured
|
||
- [ ] Loading spinner displays during submission
|
||
- [ ] Submission progress indicator updates
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-004: View Orders
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Orders tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Orders list displays orders for selected date
|
||
- [ ] Calendar date selection updates order list
|
||
- [ ] Each order card shows hub name and address
|
||
- [ ] Each order card shows shift time range
|
||
- [ ] Each order card shows role positions (filled/total)
|
||
- [ ] Each order card shows hourly rate and total cost
|
||
- [ ] Accepted applications section displays confirmed staff
|
||
- [ ] Staff names and photos display correctly
|
||
- [ ] Order list scrolls smoothly with many orders
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Invalid date selection shows error
|
||
|
||
- [ ] Missing staff data shows placeholder
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Empty date shows "No orders for this date"
|
||
- [ ] Empty accepted applications shows "No confirmed staff"
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-005: Coverage Monitoring
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Coverage tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Coverage overview displays current date
|
||
- [ ] Coverage stats show needed/confirmed/checked-in counts
|
||
- [ ] Shift cards display hub name and time range
|
||
- [ ] Worker cards show staff name and photo
|
||
- [ ] Check-in status indicators update correctly (late, en-route, checked-in)
|
||
- [ ] Late workers display with warning indicator
|
||
- [ ] Coverage progress bar updates correctly
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing worker photo shows default avatar
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching data
|
||
- [ ] Empty coverage shows "No shifts today"
|
||
- [ ] No workers show "No staff assigned"
|
||
|
||
**State Persistence:**
|
||
- [ ] Coverage data refreshes automatically every X minutes
|
||
- [ ] Manual refresh via pull-to-refresh gesture
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `listShiftRolesByBusinessAndDateRange` returns shift requirements
|
||
- [ ] `listStaffsApplicationsByBusinessForDay` returns staff status
|
||
- [ ] Attendance status correctly mapped from backend
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-006: Billing & Invoices
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Billing tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Current bill amount displays correctly
|
||
- [ ] Pending invoices list shows open invoices
|
||
- [ ] Invoice history shows paid invoices
|
||
- [ ] Savings amount displays correctly
|
||
- [ ] Spending breakdown shows costs by role
|
||
- [ ] Period filter (weekly/monthly) updates data
|
||
- [ ] Invoice detail view shows line items
|
||
- [ ] Invoice PDF download works (if implemented)
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Zero billing shows $0.00 (not error)
|
||
- [ ] Negative savings shows correctly
|
||
- [ ] Missing invoice data shows placeholder
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching data
|
||
- [ ] Empty pending invoices shows "No pending invoices"
|
||
- [ ] Empty history shows "No invoice history"
|
||
- [ ] Empty spending breakdown shows "No spending data"
|
||
|
||
**State Persistence:**
|
||
- [ ] Selected period persists after navigating away
|
||
- [ ] Billing data refreshes after returning from background
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `listInvoicesByBusinessId` returns invoice records
|
||
- [ ] `listShiftRolesByBusinessAndDatesSummary` returns spending aggregates
|
||
- [ ] Period date range correctly calculated
|
||
- [ ] Business ID correctly filtered
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-007: Hub Management
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Settings → Hubs
|
||
- Create Order → Add Hub button
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Hubs list displays all business hubs
|
||
- [ ] Hub cards show name and full address
|
||
- [ ] Add hub button opens creation form
|
||
- [ ] Google Places autocomplete suggests addresses
|
||
- [ ] Address selection auto-fills all address fields
|
||
- [ ] Hub name can be customized
|
||
- [ ] Hub creation adds to list immediately
|
||
- [ ] Hub deletion removes from list (with confirmation)
|
||
- [ ] Team entity auto-created for business if missing
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty hub name shows validation error
|
||
- [ ] Empty address shows validation error
|
||
- [ ] Invalid address format shows error
|
||
- [ ] Duplicate hub name shows warning
|
||
- [ ] Hub with active orders prevents deletion (validation error)
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching hubs
|
||
- [ ] Empty hubs list shows "No hubs configured"
|
||
- [ ] Address autocomplete shows loading during search
|
||
- [ ] Hub creation shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Hub list refreshes after creation/deletion
|
||
- [ ] Hub data persists across app sessions
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getBusinessesByUserId` retrieves business ID
|
||
- [ ] `getTeamsByOwnerId` checks for existing team
|
||
- [ ] `createTeam` creates team if missing
|
||
- [ ] `getTeamHubsByTeamId` fetches hub list
|
||
- [ ] `createTeamHub` creates hub with geocoded data
|
||
- [ ] `deleteTeamHub` removes hub entity
|
||
- [ ] `listOrdersByBusinessAndTeamHub` validates no active orders
|
||
- [ ] Google Places API returns valid address components
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-008: Settings
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Settings (navigation menu)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] User profile displays name and email
|
||
- [ ] Business name displays correctly
|
||
- [ ] Hubs link navigates to hub management
|
||
- [ ] Sign out logs out user and returns to auth screen
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing profile photo shows default avatar
|
||
- [ ] Sign out error shows retry option
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Profile data loads on page mount
|
||
|
||
**State Persistence:**
|
||
- [ ] User data refreshes on page focus
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] Firebase Auth signOut called
|
||
- [ ] Session data cleared
|
||
|
||
---
|
||
|
||
#### 📱 CLIENT-009: Client Main Navigation
|
||
|
||
**Applications:** Client
|
||
**Entry Points:**
|
||
- Main app shell after authentication
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Bottom navigation displays 5 tabs (Home, Coverage, Billing, Orders, Reports)
|
||
- [ ] Tab selection updates active indicator
|
||
- [ ] Tab selection navigates to correct feature
|
||
- [ ] Deep links navigate to correct tab
|
||
- [ ] Back button navigates correctly within nested routes
|
||
- [ ] Tab state persists after device rotation
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Invalid route shows 404 or redirects to home
|
||
- [ ] Reports tab shows placeholder (not yet implemented)
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Navigation bar displays immediately
|
||
- [ ] Initial tab loads first
|
||
|
||
**State Persistence:**
|
||
- [ ] Active tab persists after app background → foreground
|
||
- [ ] Tab state resets to home on app restart
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] No direct backend calls (navigation only)
|
||
|
||
---
|
||
|
||
### STAFF APP FEATURES
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-001: Authentication
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Launch app → Get Started → Phone Verification
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Phone number entry accepts valid formats
|
||
- [ ] OTP sent confirmation displays
|
||
- [ ] OTP verification succeeds with valid code
|
||
- [ ] Profile setup wizard displays for new users
|
||
- [ ] Authenticated users bypass auth and show home
|
||
- [ ] Session persists after app restart
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Invalid phone format shows validation error
|
||
- [ ] Incorrect OTP shows verification error
|
||
- [ ] Expired OTP shows re-send option
|
||
- [ ] Empty fields show required field errors
|
||
- [ ] Network error displays retry option
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays during phone verification
|
||
- [ ] OTP input shows countdown timer
|
||
- [ ] Profile setup shows progress indicator
|
||
|
||
**State Persistence:**
|
||
- [ ] Authenticated session persists after app background → foreground
|
||
- [ ] Session expires appropriately after logout
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] Firebase Auth phone verification flow completes
|
||
- [ ] `getUserById` returns user data
|
||
- [ ] `getStaffByUserId` retrieves staff profile
|
||
- [ ] Staff profile created if missing
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-002: Home Dashboard
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Home tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Today's shifts display with time and location
|
||
- [ ] Tomorrow's shifts display correctly
|
||
- [ ] Recommended shifts show available opportunities
|
||
- [ ] Shift cards show role, location, and pay rate
|
||
- [ ] Quick actions navigate to correct features
|
||
- [ ] Dashboard refreshes on pull-to-refresh
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing shift data shows placeholder
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching data
|
||
- [ ] Empty today's shifts shows "No shifts today"
|
||
- [ ] Empty recommended shows "No available shifts"
|
||
|
||
**State Persistence:**
|
||
- [ ] Dashboard data refreshes after returning from background
|
||
- [ ] Shift status updates reflected immediately
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getApplicationsByStaffId` fetches staff assignments
|
||
- [ ] `listShifts` returns available shifts
|
||
- [ ] Date filtering correctly applied
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-003: Profile
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Profile displays name, email, phone, and photo
|
||
- [ ] Statistics show total shifts, ratings, reliability score
|
||
- [ ] Profile sections list displays all sections
|
||
- [ ] Section navigation works correctly
|
||
- [ ] Sign out logs out user and returns to auth screen
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing profile photo shows default avatar
|
||
- [ ] Missing statistics show 0 or default values
|
||
- [ ] Sign out error shows retry option
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Profile data loads on page mount
|
||
- [ ] Statistics display placeholders while loading
|
||
|
||
**State Persistence:**
|
||
- [ ] Profile data refreshes on page focus
|
||
- [ ] Profile updates reflect immediately
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` retrieves complete staff profile
|
||
- [ ] Firebase Auth signOut called
|
||
- [ ] Session data cleared
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-004: Shifts Management
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Shifts tab (bottom navigation)
|
||
- Tab navigation: My Shifts / Available / Pending / Cancelled / History
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] My Shifts tab displays assigned shifts
|
||
- [ ] Available Shifts tab shows open positions
|
||
- [ ] Pending tab shows applications awaiting approval
|
||
- [ ] Cancelled tab shows cancelled shifts
|
||
- [ ] History tab shows past shifts
|
||
- [ ] Shift detail view displays full information
|
||
- [ ] Accept shift updates status to confirmed
|
||
- [ ] Decline shift updates status to declined
|
||
- [ ] Apply for shift creates application
|
||
- [ ] Shift cards show time, location, role, and pay
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty tabs show appropriate empty state messages
|
||
|
||
- [ ] Already applied shift prevents duplicate application
|
||
- [ ] Past shifts cannot be applied to
|
||
- [ ] Cancelled shifts show cancellation reason
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching shifts
|
||
- [ ] Empty My Shifts shows "No assigned shifts"
|
||
- [ ] Empty Available shows "No open shifts"
|
||
- [ ] Empty Pending shows "No pending applications"
|
||
- [ ] Empty History shows "No past shifts"
|
||
|
||
**State Persistence:**
|
||
- [ ] Active tab persists after navigating away
|
||
- [ ] Shift list refreshes after status changes
|
||
- [ ] Shift data refreshes after returning from background
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getApplicationsByStaffId` fetches applications by status
|
||
- [ ] `getShiftById` retrieves shift details
|
||
- [ ] `updateApplicationStatus` changes application state
|
||
- [ ] `createApplication` creates new application
|
||
- [ ] `deleteApplication` removes application
|
||
- [ ] `updateShift` updates filled count
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-005: Availability Management
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Worker Main → Availability
|
||
- Profile → Availability section
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Weekly grid displays Monday-Sunday
|
||
- [ ] Time slots (Morning/Afternoon/Evening) toggle correctly
|
||
- [ ] Quick-set buttons work (Weekdays/Weekends/All Week)
|
||
- [ ] Individual day/slot updates save correctly
|
||
- [ ] Green checkmarks indicate availability
|
||
- [ ] Gray states indicate unavailability
|
||
- [ ] Changes save automatically
|
||
|
||
**Validation & Error States:**
|
||
|
||
- [ ] Save failure shows error message
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching availability
|
||
- [ ] Default state shows all unavailable
|
||
|
||
**State Persistence:**
|
||
- [ ] Availability persists across app sessions
|
||
- [ ] Changes reflect immediately in shift matching
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` retrieves staff ID
|
||
- [ ] `listStaffAvailabilitiesByStaffId` fetches availability records
|
||
- [ ] `getStaffAvailabilityByKey` checks existing record
|
||
- [ ] `updateStaffAvailability` updates existing slot
|
||
- [ ] `createStaffAvailability` creates new slot
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-006: Clock In/Out
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Clock In tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Today's shift displays with clock in button
|
||
- [ ] Clock in button creates attendance record
|
||
- [ ] Clock in time displays correctly
|
||
- [ ] Clock out button appears after clocking in
|
||
- [ ] Clock out creates end time record
|
||
- [ ] Total hours calculated correctly
|
||
- [ ] Attendance status updates immediately
|
||
|
||
**Validation & Error States:**
|
||
- [ ] No shift today shows "No shifts to clock in"
|
||
- [ ] Already clocked in prevents duplicate clock in
|
||
|
||
- [ ] Clock in outside shift time shows warning
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching shift
|
||
- [ ] Empty state shows "No shifts scheduled"
|
||
|
||
**State Persistence:**
|
||
- [ ] Attendance status persists across app sessions
|
||
- [ ] Clock in/out times display correctly
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getApplicationsByStaffId` fetches today's shifts
|
||
- [ ] `createAttendance` records clock in
|
||
- [ ] `updateAttendance` records clock out
|
||
- [ ] `listAttendancesByApplicationId` gets attendance status
|
||
- [ ] `updateApplicationStatus` updates application state
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-007: Payments
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Payments tab (bottom navigation)
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Payment summary displays total earnings
|
||
- [ ] Payment history lists all transactions
|
||
- [ ] Payment cards show amount, date, and status
|
||
- [ ] Payment detail view shows breakdown
|
||
- [ ] Filter by date range works correctly
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Zero earnings show $0.00 (not error)
|
||
- [ ] Missing payment data shows placeholder
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching payments
|
||
- [ ] Empty history shows "No payment history"
|
||
|
||
**State Persistence:**
|
||
- [ ] Payment data refreshes after returning from background
|
||
- [ ] Filter state persists after navigating away
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` retrieves staff ID
|
||
- [ ] `getPaymentsByStaffId` fetches payment records
|
||
- [ ] Mock summary data calculated correctly
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-008: Personal Info (Onboarding)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Personal Info
|
||
- Onboarding wizard
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Form displays current profile data
|
||
- [ ] Name field allows text input
|
||
- [ ] Email field validates email format
|
||
- [ ] Phone field validates phone format
|
||
- [ ] Photo upload works correctly
|
||
- [ ] Preferred locations multi-select works
|
||
- [ ] Save button updates profile
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty required fields show validation errors
|
||
- [ ] Invalid email format shows error
|
||
- [ ] Invalid phone format shows error
|
||
|
||
- [ ] Photo upload failure shows error
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Form loads with skeleton placeholders
|
||
- [ ] Photo upload shows progress indicator
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Changes persist after save
|
||
- [ ] Unsaved changes show confirmation dialog on exit
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` fetches profile
|
||
- [ ] `updateStaff` saves profile changes
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-009: Emergency Contact (Onboarding)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Emergency Contact
|
||
- Onboarding wizard
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Contact list displays all contacts
|
||
- [ ] Add contact button opens form
|
||
- [ ] Contact form validates name and phone
|
||
- [ ] Relationship dropdown shows options (Family/Spouse/Friend/Other)
|
||
- [ ] Remove contact deletes from list
|
||
- [ ] Save updates all contacts
|
||
- [ ] Multiple contacts supported
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty name shows validation error
|
||
- [ ] Invalid phone format shows error
|
||
- [ ] At least one contact required (if applicable)
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching contacts
|
||
- [ ] Empty state shows "No emergency contacts"
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Contacts persist after save
|
||
- [ ] Unsaved changes show confirmation dialog on exit
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` retrieves staff ID
|
||
- [ ] `getEmergencyContactsByStaffId` fetches contacts
|
||
- [ ] `deleteEmergencyContact` removes contacts (replace-all pattern)
|
||
- [ ] `createEmergencyContact` creates new contacts
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-010: Experience & Skills (Onboarding)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Experience
|
||
- Onboarding wizard
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Industries multi-select displays options
|
||
- [ ] Skills multi-select displays options
|
||
- [ ] Selected items show checkmarks
|
||
- [ ] Deselection removes items
|
||
- [ ] Save updates profile
|
||
|
||
**Validation & Error States:**
|
||
- [ ] At least one industry required (if applicable)
|
||
- [ ] At least one skill required (if applicable)
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching data
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Selections persist after save
|
||
- [ ] Unsaved changes show confirmation dialog on exit
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` fetches profile with industries and skills
|
||
- [ ] `updateStaff` updates industries and skills arrays
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-011: Attire Selection (Onboarding)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Attire
|
||
- Onboarding wizard
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Attire options list displays all items
|
||
- [ ] Item selection toggles checkmark
|
||
- [ ] Photo upload button opens camera/gallery
|
||
- [ ] Photos display in grid
|
||
- [ ] Save updates selections and photos
|
||
|
||
**Validation & Error States:**
|
||
- [ ] At least one attire item required (if applicable)
|
||
- [ ] Photo upload failure shows error
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching options
|
||
- [ ] Photo upload shows progress indicator
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Selections and photos persist after save
|
||
- [ ] Unsaved changes show confirmation dialog on exit
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `listAttireOptions` fetches available items
|
||
- [ ] Photo upload and save mutations (pending implementation)
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-012: Bank Account (Finances)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Bank Account
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Account list displays all accounts
|
||
- [ ] Add account button opens form
|
||
- [ ] Form validates routing and account numbers
|
||
- [ ] Account type dropdown shows options (Checking/Savings)
|
||
- [ ] First account auto-sets as primary
|
||
- [ ] Save adds account to list
|
||
- [ ] Primary account indicator displays
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty routing number shows validation error
|
||
- [ ] Invalid routing number format shows error
|
||
- [ ] Empty account number shows validation error
|
||
- [ ] Invalid account number format shows error
|
||
- [ ] Duplicate account shows warning
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching accounts
|
||
- [ ] Empty state shows "No bank accounts"
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Accounts persist after save
|
||
- [ ] Account list refreshes after addition
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getAccountsByOwnerId` fetches staff accounts
|
||
- [ ] `createAccount` creates new account
|
||
- [ ] First account auto-flagged as primary
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-013: Time Card History (Finances)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Time Card
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Time card list displays all records
|
||
- [ ] Each card shows shift details (date, time, location)
|
||
- [ ] Each card shows clock in/out times
|
||
- [ ] Each card shows total hours worked
|
||
- [ ] Scrolling loads more records (pagination)
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing attendance data shows "Not recorded"
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching records
|
||
- [ ] Empty state shows "No time card history"
|
||
|
||
**State Persistence:**
|
||
- [ ] Time card data refreshes after returning from background
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getStaffByUserId` retrieves staff ID
|
||
- [ ] `getApplicationsByStaffId` fetches applications with attendance
|
||
- [ ] Attendance records mapped to time card format
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-014: Tax Forms (Compliance)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Tax Forms
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Forms list displays required forms (I-9, W-4)
|
||
- [ ] Form status shows completed/incomplete
|
||
- [ ] I-9 form opens editor
|
||
- [ ] I-9 form validates all fields
|
||
- [ ] W-4 form opens editor
|
||
- [ ] W-4 form validates all fields
|
||
- [ ] Form submission updates status to completed
|
||
- [ ] Completed forms show edit option
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Empty required fields show validation errors
|
||
- [ ] Invalid SSN format shows error
|
||
- [ ] Invalid date format shows error
|
||
- [ ] Signature required validation
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Loading spinner displays while fetching forms
|
||
- [ ] Form editor loads with skeleton placeholders
|
||
- [ ] Save button shows loading spinner
|
||
|
||
**State Persistence:**
|
||
- [ ] Form data persists after save
|
||
- [ ] Unsaved changes show confirmation dialog on exit
|
||
- [ ] Form status updates immediately
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `getTaxFormsByStaffId` fetches forms
|
||
- [ ] `createTaxForm` initializes missing forms
|
||
- [ ] `updateTaxForm` saves form data and status
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-015: Documents (Compliance)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Documents
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Documents list displays required documents
|
||
- [ ] Document status shows verified/pending/expired
|
||
- [ ] Document detail view shows requirements
|
||
- [ ] Expiry dates display correctly
|
||
- [ ] Expired documents highlight in red
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing documents show incomplete status
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching documents
|
||
- [ ] Empty state shows "No documents required"
|
||
|
||
**State Persistence:**
|
||
- [ ] Document data refreshes after returning from background
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] Mock implementation currently
|
||
- [ ] ⚠️ Requires clarification: Real Data Connect integration pending
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-016: Certificates (Compliance)
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Profile → Certificates
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Certificates list displays all certificates
|
||
- [ ] Certificate cards show name, status, and expiry
|
||
- [ ] Certificate detail view shows full information
|
||
- [ ] Expired certificates highlight in red
|
||
- [ ] Certificate verification status displays
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Missing certificates show placeholder
|
||
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Skeleton loaders display while fetching certificates
|
||
- [ ] Empty state shows "No certificates"
|
||
|
||
**State Persistence:**
|
||
- [ ] Certificate data refreshes after returning from background
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] `listStaffDocumentsByStaffId` fetches certificate documents
|
||
- [ ] Document data mapped to certificate entities
|
||
|
||
---
|
||
|
||
#### 📱 STAFF-017: Staff Main Navigation
|
||
|
||
**Applications:** Staff
|
||
**Entry Points:**
|
||
- Main app shell after authentication
|
||
|
||
**Happy Path Test Cases:**
|
||
- [ ] Bottom navigation displays 5 tabs (Shifts, Payments, Home, Clock In, Profile)
|
||
- [ ] Tab selection updates active indicator
|
||
- [ ] Tab selection navigates to correct feature
|
||
- [ ] Deep links navigate to correct tab and nested route
|
||
- [ ] Back button navigates correctly within nested routes
|
||
- [ ] Tab state persists after device rotation
|
||
- [ ] Nested routes (onboarding, emergency-contact, etc.) accessible
|
||
|
||
**Validation & Error States:**
|
||
- [ ] Invalid route shows 404 or redirects to home
|
||
- [ ] Navigation errors log appropriately
|
||
|
||
**Loading & Empty States:**
|
||
- [ ] Navigation bar displays immediately
|
||
- [ ] Initial tab loads first
|
||
|
||
**State Persistence:**
|
||
- [ ] Active tab persists after app background → foreground
|
||
- [ ] Tab state resets to home on app restart
|
||
|
||
**Backend Dependency Validation:**
|
||
- [ ] No direct backend calls (navigation only)
|
||
|
||
---
|
||
|
||
## 2️⃣ CROSS-APPLICATION TEST SCENARIOS
|
||
|
||
### Scenario 1: Order Creation → Staff Application Flow
|
||
|
||
**Preconditions:**
|
||
- Client user authenticated
|
||
- Staff user authenticated
|
||
- At least one hub configured
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Create one-time order with specific hub, role, date, and time
|
||
- [ ] Verify order appears in View Orders list
|
||
- [ ] Verify shift shows as unfilled (0/X positions)
|
||
|
||
2. **STAFF APP:**
|
||
- [ ] Open Shifts tab → Available tab
|
||
- [ ] Verify new shift appears in available list
|
||
- [ ] Verify shift details match order (hub, role, time, pay)
|
||
- [ ] Apply for shift position
|
||
|
||
3. **CLIENT APP:**
|
||
- [ ] Refresh View Orders
|
||
- [ ] Verify shift shows pending application (0/X filled, pending)
|
||
|
||
4. **STAFF APP:**
|
||
- [ ] Verify application appears in Pending tab
|
||
- [ ] Verify shift removed from Available tab
|
||
|
||
**Expected Results:**
|
||
- ✅ Order created in Client appears in Staff Available Shifts
|
||
- ✅ Application in Staff shows pending in both apps
|
||
- ✅ Shift counts update correctly in real-time
|
||
|
||
---
|
||
|
||
### Scenario 2: Shift Acceptance → Coverage Tracking
|
||
|
||
**Preconditions:**
|
||
- Scenario 1 completed (pending application exists)
|
||
|
||
**Steps:**
|
||
1. **STAFF APP:**
|
||
- [ ] Go to Shifts → Pending tab
|
||
- [ ] Accept pending shift assignment
|
||
|
||
2. **CLIENT APP:**
|
||
- [ ] Refresh View Orders
|
||
- [ ] Verify shift shows as filled (1/X positions)
|
||
- [ ] Verify staff name and photo appear in accepted applications
|
||
- [ ] Navigate to Coverage tab
|
||
- [ ] Verify shift appears with assigned staff
|
||
|
||
3. **STAFF APP:**
|
||
- [ ] Verify shift moved from Pending to My Shifts tab
|
||
- [ ] Verify shift appears on Home dashboard
|
||
|
||
**Expected Results:**
|
||
- ✅ Accepted shift reflects in Client orders immediately
|
||
- ✅ Staff appears in Coverage monitoring
|
||
- ✅ Shift moves to My Shifts in Staff app
|
||
|
||
---
|
||
|
||
### Scenario 3: Clock In → Real-Time Coverage Update
|
||
|
||
**Preconditions:**
|
||
- Scenario 2 completed (staff has accepted shift)
|
||
- Current date/time is during shift window
|
||
|
||
**Steps:**
|
||
1. **STAFF APP:**
|
||
- [ ] Navigate to Clock In tab
|
||
- [ ] Verify today's shift displays
|
||
- [ ] Click Clock In button
|
||
- [ ] Verify clock in time recorded
|
||
|
||
2. **CLIENT APP:**
|
||
- [ ] Navigate to Coverage tab
|
||
- [ ] Verify staff status changed to "Checked In"
|
||
- [ ] Verify check-in time displays
|
||
- [ ] Verify coverage stats updated (checked-in count incremented)
|
||
|
||
3. **STAFF APP:**
|
||
- [ ] Wait until shift end time
|
||
- [ ] Click Clock Out button
|
||
- [ ] Verify clock out time recorded
|
||
|
||
4. **CLIENT APP:**
|
||
- [ ] Refresh Coverage tab
|
||
- [ ] Verify staff status changed to "Completed"
|
||
|
||
5. **STAFF APP:**
|
||
- [ ] Navigate to Time Card
|
||
- [ ] Verify attendance record appears with correct times and hours
|
||
|
||
**Expected Results:**
|
||
- ✅ Clock in updates Coverage status in Client
|
||
- ✅ Clock out completes attendance record
|
||
- ✅ Time card displays correct hours in Staff app
|
||
- ✅ Coverage monitoring reflects real-time status
|
||
|
||
---
|
||
|
||
### Scenario 4: Hub Creation → Order Placement
|
||
|
||
**Preconditions:**
|
||
- Client user authenticated
|
||
- No existing hubs
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Navigate to Settings → Hubs
|
||
- [ ] Verify empty state "No hubs configured"
|
||
- [ ] Click Add Hub button
|
||
- [ ] Enter hub name and use Google Places autocomplete
|
||
- [ ] Select address from suggestions
|
||
- [ ] Verify address fields auto-filled
|
||
- [ ] Save hub
|
||
|
||
2. **CLIENT APP:**
|
||
- [ ] Navigate to Create Order
|
||
- [ ] Verify new hub appears in hub selection list
|
||
- [ ] Select new hub and complete order creation
|
||
|
||
3. **STAFF APP:**
|
||
- [ ] Navigate to Shifts → Available
|
||
- [ ] Verify shift shows correct hub name and address
|
||
|
||
**Expected Results:**
|
||
- ✅ Hub created in Settings appears in order creation
|
||
- ✅ Hub address propagates to shift details in Staff app
|
||
|
||
---
|
||
|
||
### Scenario 5: Shift Cancellation → Staff Notification
|
||
|
||
**Preconditions:**
|
||
- Staff has accepted shift assignment
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Navigate to View Orders
|
||
- [ ] Select order with assigned staff
|
||
- [ ] Cancel shift (if feature exists) or delete order
|
||
|
||
2. **STAFF APP:**
|
||
- [ ] Refresh Shifts tab
|
||
- [ ] Verify shift moved to Cancelled tab
|
||
- [ ] Verify shift removed from My Shifts
|
||
- [ ] Verify cancellation reason displays
|
||
|
||
3. **STAFF APP:**
|
||
- [ ] Verify shift removed from Home dashboard
|
||
|
||
**Expected Results:**
|
||
- ✅ Cancelled shift moves to Cancelled tab
|
||
- ✅ Shift removed from active assignments
|
||
- ⚠️ **Requires clarification:** Cancellation feature may not be fully implemented
|
||
|
||
---
|
||
|
||
### Scenario 6: Authentication State Sharing
|
||
|
||
**Preconditions:**
|
||
- Neither app authenticated
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Sign in with email/password
|
||
- [ ] Verify Firebase Auth token generated
|
||
|
||
2. **STAFF APP:**
|
||
- [ ] Launch app
|
||
- [ ] Verify Staff app requires separate authentication
|
||
- [ ] Verify Client session does not carry over
|
||
|
||
3. **CLIENT APP:**
|
||
- [ ] Sign out
|
||
|
||
4. **STAFF APP:**
|
||
- [ ] Verify Staff app session persists (independent)
|
||
|
||
**Expected Results:**
|
||
- ✅ Client and Staff apps maintain independent auth sessions
|
||
- ✅ Signing out of one app does not affect the other
|
||
|
||
---
|
||
|
||
### Scenario 7: Data Created in Client → Visible in Staff
|
||
|
||
**Preconditions:**
|
||
- Client creates multiple orders
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Create 5 orders on different dates
|
||
- [ ] Create 3 orders on same date with different hubs
|
||
|
||
2. **STAFF APP:**
|
||
- [ ] Navigate to Shifts → Available
|
||
- [ ] Verify all 8 shifts appear
|
||
- [ ] Verify date grouping correct
|
||
- [ ] Verify hub addresses correct
|
||
- [ ] Apply for 2 shifts
|
||
|
||
3. **CLIENT APP:**
|
||
- [ ] Navigate to View Orders
|
||
- [ ] Verify 2 shifts show pending applications
|
||
- [ ] Navigate to Coverage
|
||
- [ ] Verify 0 checked-in (pending acceptance)
|
||
|
||
**Expected Results:**
|
||
- ✅ All orders visible in both apps
|
||
- ✅ Application states sync correctly
|
||
- ✅ Data consistency maintained across apps
|
||
|
||
---
|
||
|
||
### Scenario 8: Role-Based Access Differences
|
||
|
||
**Preconditions:**
|
||
- Client user authenticated
|
||
- Staff user authenticated
|
||
|
||
**Steps:**
|
||
1. **CLIENT APP:**
|
||
- [ ] Navigate to Billing
|
||
- [ ] Verify billing data displays (Client-only feature)
|
||
- [ ] Navigate to Create Order
|
||
- [ ] Verify order creation available (Client-only feature)
|
||
|
||
2. **STAFF APP:**
|
||
- [ ] Verify no Billing tab exists
|
||
- [ ] Verify no Create Order feature
|
||
- [ ] Navigate to Availability
|
||
- [ ] Verify availability editing available (Staff-only feature)
|
||
|
||
3. **CLIENT APP:**
|
||
- [ ] Verify no Availability feature exists
|
||
- [ ] Verify no Clock In feature exists
|
||
|
||
**Expected Results:**
|
||
- ✅ Client app has business management features (orders, billing, hubs)
|
||
- ✅ Staff app has worker features (availability, clock in, payments)
|
||
- ✅ No feature overlap or unauthorized access
|
||
|
||
---
|
||
|
||
### Scenario 9: Race Condition - Concurrent Shift Application
|
||
|
||
**Preconditions:**
|
||
- One available shift with 1 position
|
||
- Two staff users authenticated on separate devices
|
||
|
||
**Steps:**
|
||
1. **STAFF APP (Device 1):**
|
||
- [ ] Navigate to Shifts → Available
|
||
- [ ] View shift details
|
||
|
||
2. **STAFF APP (Device 2):**
|
||
- [ ] Navigate to Shifts → Available
|
||
- [ ] View same shift details
|
||
|
||
3. **STAFF APP (Device 1):**
|
||
- [ ] Apply for shift
|
||
- [ ] Verify application created
|
||
|
||
4. **STAFF APP (Device 2):**
|
||
- [ ] Attempt to apply for same shift
|
||
- [ ] Verify appropriate behavior (position filled message or pending status)
|
||
|
||
5. **CLIENT APP:**
|
||
- [ ] Navigate to View Orders
|
||
- [ ] Verify only 1 application shows (not 2)
|
||
- [ ] Accept Device 1 application
|
||
|
||
6. **STAFF APP (Device 2):**
|
||
- [ ] Refresh Available shifts
|
||
- [ ] Verify shift removed or shows as filled
|
||
|
||
**Expected Results:**
|
||
- ✅ Only first application succeeds (or both go to pending)
|
||
- ✅ No double-booking occurs
|
||
- ✅ Race condition handled gracefully
|
||
- ⚠️ **Requires clarification:** Backend concurrency control behavior
|
||
|
||
---
|
||
|
||
### Scenario 10: Network Failure During Critical Operation
|
||
|
||
**Preconditions:**
|
||
- Staff has pending shift application
|
||
|
||
**Steps:**
|
||
1. **STAFF APP:**
|
||
- [ ] Navigate to Shifts → Pending
|
||
- [ ] Disable network connection
|
||
- [ ] Attempt to accept shift
|
||
- [ ] Verify offline error message displays
|
||
- [ ] Re-enable network
|
||
- [ ] Retry accept shift
|
||
- [ ] Verify acceptance succeeds
|
||
|
||
2. **CLIENT APP:**
|
||
- [ ] Verify shift shows as filled after network restored
|
||
|
||
**Expected Results:**
|
||
- ✅ Offline state handled gracefully with clear messaging
|
||
- ✅ Retry succeeds after network restored
|
||
- ✅ Data consistency maintained
|
||
|
||
---
|
||
|
||
## 3️⃣ SHARED INFRASTRUCTURE VALIDATION
|
||
|
||
### Domain Entity Consistency
|
||
|
||
#### Test: Entity Field Validation
|
||
|
||
- [ ] **Staff Entity:**
|
||
- [ ] Verify all required fields populate (id, userId, firstName, lastName, email, phone)
|
||
- [ ] Verify optional fields handle null correctly (photoUrl, preferredLocations)
|
||
- [ ] Verify enum fields map correctly (UserStatus)
|
||
|
||
- [ ] **Order Entity:**
|
||
- [ ] Verify all required fields populate
|
||
- [ ] Verify OrderStatus enum maps correctly
|
||
- [ ] Verify OrderType enum maps correctly
|
||
|
||
- [ ] **Shift Entity:**
|
||
- [ ] Verify date/time fields parse correctly
|
||
- [ ] Verify ShiftStatus enum maps correctly
|
||
- [ ] Verify location data (hub) links correctly
|
||
|
||
- [ ] **Application Entity:**
|
||
- [ ] Verify ApplicationStatus enum maps correctly
|
||
- [ ] Verify relationships (staff, shift, role) link correctly
|
||
|
||
- [ ] **Invoice Entity:**
|
||
- [ ] Verify amount calculations correct
|
||
- [ ] Verify date fields parse correctly
|
||
- [ ] Verify InvoiceStatus enum maps correctly
|
||
|
||
- [ ] **Hub Entity:**
|
||
- [ ] Verify address components parse correctly
|
||
- [ ] Verify geocoding (lat/lng) present and valid
|
||
- [ ] Verify placeId populated
|
||
|
||
---
|
||
|
||
### Data Connect Schema Alignment
|
||
|
||
#### Test: Backend Operation Contracts
|
||
|
||
- [ ] **User Operations:**
|
||
- [ ] `getUserById(userId)` returns expected fields
|
||
- [ ] `createUser(...)` accepts all required parameters
|
||
- [ ] `updateUser(...)` updates only specified fields
|
||
|
||
- [ ] **Staff Operations:**
|
||
- [ ] `getStaffByUserId(userId)` returns staff profile
|
||
- [ ] `updateStaff(...)` updates specified fields
|
||
- [ ] `listStaffs()` returns paginated results
|
||
|
||
- [ ] **Order Operations:**
|
||
- [ ] `createOrder(...)` creates order with shifts
|
||
- [ ] `listOrdersByBusinessId(...)` filters by business correctly
|
||
- [ ] `updateOrder(...)` updates order fields
|
||
|
||
- [ ] **Shift Operations:**
|
||
- [ ] `createShift(...)` creates shift with location
|
||
- [ ] `getShiftById(id)` returns full shift details
|
||
- [ ] `listShiftRolesByBusinessAndDateRange(...)` returns correct date range
|
||
|
||
- [ ] **Application Operations:**
|
||
- [ ] `createApplication(...)` creates pending application
|
||
- [ ] `updateApplicationStatus(...)` changes status correctly
|
||
- [ ] `getApplicationsByStaffId(...)` filters by staff and date
|
||
|
||
- [ ] **Attendance Operations:**
|
||
- [ ] `createAttendance(...)` records clock in
|
||
- [ ] `updateAttendance(...)` records clock out
|
||
- [ ] `listAttendancesByApplicationId(...)` returns attendance records
|
||
|
||
- [ ] **Hub Operations:**
|
||
- [ ] `createTeamHub(...)` creates hub with location data
|
||
- [ ] `getTeamHubsByTeamId(...)` returns hubs for team
|
||
- [ ] `deleteTeamHub(id)` removes hub entity
|
||
|
||
---
|
||
|
||
### Error Handling Consistency
|
||
|
||
#### Test: Standard Error Patterns
|
||
|
||
- [ ] **Network Errors:**
|
||
- [ ] All features show "Network error" message
|
||
- [ ] All features show "Retry" button
|
||
- [ ] Retry button re-attempts operation
|
||
|
||
- [ ] **Authentication Errors:**
|
||
- [ ] Expired token redirects to login
|
||
- [ ] Invalid credentials show appropriate message
|
||
- [ ] Auth failures log out user
|
||
|
||
- [ ] **Validation Errors:**
|
||
- [ ] Field-level validation shows inline errors
|
||
- [ ] Form-level validation prevents submission
|
||
- [ ] Error messages are user-friendly
|
||
|
||
- [ ] **Backend Errors:**
|
||
- [ ] 400 errors show validation details
|
||
- [ ] 404 errors show "Not found" message
|
||
- [ ] 500 errors show "Server error, try again" message
|
||
|
||
- [ ] **Data Not Found:**
|
||
- [ ] Empty lists show appropriate empty state
|
||
- [ ] Missing entities show "Not found" message
|
||
- [ ] Deleted entities handle gracefully
|
||
|
||
---
|
||
|
||
### Version Mismatch Tolerance
|
||
|
||
#### Test: App Version Compatibility
|
||
|
||
- [ ] **Client App Updated, Staff App Not:**
|
||
- [ ] Backend operations remain compatible
|
||
- [ ] Shared domain entities parse correctly
|
||
- [ ] New fields in Client don't break Staff
|
||
|
||
- [ ] **Staff App Updated, Client App Not:**
|
||
- [ ] Backend operations remain compatible
|
||
- [ ] Shared domain entities parse correctly
|
||
- [ ] New fields in Staff don't break Client
|
||
|
||
- [ ] **Backend Schema Updated:**
|
||
- [ ] Apps handle new optional fields gracefully
|
||
- [ ] Apps ignore unknown fields
|
||
- [ ] Required fields validated correctly
|
||
|
||
---
|
||
|
||
## 4️⃣ REGRESSION & RELEASE CHECKLIST
|
||
|
||
### Smoke Testing (Critical Path)
|
||
|
||
#### Authentication Flow (5 minutes)
|
||
|
||
- [ ] **Client App:**
|
||
- [ ] Launch app shows Get Started screen
|
||
- [ ] Sign in with valid credentials succeeds
|
||
- [ ] Home dashboard displays
|
||
|
||
- [ ] **Staff App:**
|
||
- [ ] Launch app shows Get Started screen
|
||
- [ ] Phone verification sends OTP
|
||
- [ ] OTP verification succeeds
|
||
- [ ] Home dashboard displays
|
||
|
||
#### Order Creation & Application (10 minutes)
|
||
|
||
- [ ] **Client App:**
|
||
- [ ] Create one-time order succeeds
|
||
- [ ] Order appears in View Orders list
|
||
- [ ] Order details display correctly
|
||
|
||
- [ ] **Staff App:**
|
||
- [ ] Available shift appears in Shifts tab
|
||
- [ ] Apply for shift succeeds
|
||
- [ ] Application appears in Pending tab
|
||
|
||
- [ ] **Client App:**
|
||
- [ ] Pending application displays in View Orders
|
||
- [ ] Coverage shows staff as pending
|
||
|
||
#### Clock In/Out Flow (5 minutes)
|
||
|
||
- [ ] **Staff App:**
|
||
- [ ] Accept shift from Pending tab
|
||
- [ ] Clock in on Clock In tab
|
||
- [ ] Clock in time recorded
|
||
|
||
- [ ] **Client App:**
|
||
- [ ] Coverage shows staff as checked in
|
||
- [ ] Staff status updates in real-time
|
||
|
||
- [ ] **Staff App:**
|
||
- [ ] Clock out succeeds
|
||
- [ ] Time card displays attendance record
|
||
|
||
---
|
||
|
||
### Critical Path Validation (Must Pass Before Release)
|
||
|
||
#### Client App Critical Features
|
||
|
||
- [ ] **Authentication:**
|
||
- [ ] Sign in with email/password works
|
||
- [ ] Session persists after restart
|
||
|
||
- [ ] **Order Management:**
|
||
- [ ] Create order succeeds
|
||
- [ ] View orders displays correctly
|
||
- [ ] Order details accurate
|
||
|
||
- [ ] **Coverage Monitoring:**
|
||
- [ ] Coverage stats display correctly
|
||
- [ ] Staff status updates reflect backend
|
||
|
||
- [ ] **Billing:**
|
||
- [ ] Invoice list displays
|
||
- [ ] Spending breakdown calculates correctly
|
||
|
||
#### Staff App Critical Features
|
||
|
||
- [ ] **Authentication:**
|
||
- [ ] Phone verification works
|
||
- [ ] Session persists after restart
|
||
|
||
- [ ] **Shift Management:**
|
||
- [ ] Available shifts display
|
||
- [ ] Apply for shift succeeds
|
||
- [ ] Accept shift succeeds
|
||
- [ ] My Shifts displays assigned shifts
|
||
|
||
- [ ] **Clock In/Out:**
|
||
- [ ] Clock in records attendance
|
||
- [ ] Clock out completes record
|
||
|
||
- [ ] **Profile:**
|
||
- [ ] View profile displays data
|
||
- [ ] Update personal info succeeds
|
||
|
||
---
|
||
|
||
### High-Risk Features (Require Extra Scrutiny)
|
||
|
||
#### Payment Processing
|
||
|
||
- [ ] **Staff App:**
|
||
- [ ] Payment history displays correctly
|
||
- [ ] Payment amounts accurate
|
||
- [ ] No double-payment scenarios
|
||
|
||
- [ ] **Client App:**
|
||
- [ ] Invoice amounts correct
|
||
- [ ] Billing calculations accurate
|
||
- [ ] No overcharging scenarios
|
||
|
||
#### Data Integrity
|
||
|
||
- [ ] **Order → Shift → Application Chain:**
|
||
- [ ] Order creation creates shifts
|
||
- [ ] Shift deletion cascades correctly
|
||
- [ ] Application deletion updates shift counts
|
||
|
||
- [ ] **Attendance Records:**
|
||
- [ ] Clock in/out times accurate
|
||
- [ ] Hours calculation correct
|
||
- [ ] No duplicate attendance records
|
||
|
||
#### Concurrency Issues
|
||
|
||
- [ ] **Multiple Staff Applying:**
|
||
- [ ] Race condition handled correctly
|
||
- [ ] No double-booking
|
||
- [ ] First-come-first-served logic works
|
||
|
||
- [ ] **Shift Cancellation:**
|
||
- [ ] Staff notified appropriately
|
||
- [ ] Applications updated correctly
|
||
- [ ] No orphaned assignments
|
||
|
||
---
|
||
|
||
### Release-Blocking Failures
|
||
|
||
**The following issues MUST be fixed before release:**
|
||
|
||
- [ ] **Authentication fails completely** (users cannot log in)
|
||
- [ ] **Order creation fails completely** (clients cannot create orders)
|
||
- [ ] **Shift application fails completely** (staff cannot apply for shifts)
|
||
- [ ] **Clock in/out fails completely** (staff cannot track attendance)
|
||
- [ ] **Payment data displays incorrectly** (financial inaccuracies)
|
||
- [ ] **Data loss occurs** (orders, shifts, or applications deleted unintentionally)
|
||
- [ ] **App crashes on launch** (unrecoverable error)
|
||
- [ ] **Backend connection fails** (cannot communicate with Data Connect)
|
||
- [ ] **Critical security vulnerability** (unauthorized access, data exposure)
|
||
|
||
---
|
||
|
||
## 📊 TESTING METRICS & REPORTING
|
||
|
||
### Test Execution Summary
|
||
|
||
**Date:** __________
|
||
**Tester:** __________
|
||
**Build Version:** __________
|
||
|
||
| Category | Total Tests | Passed | Failed | Blocked | Pass Rate |
|
||
|----------|-------------|--------|--------|---------|-----------|
|
||
| Client Features | __ | __ | __ | __ | __% |
|
||
| Staff Features | __ | __ | __ | __ | __% |
|
||
| Cross-App Scenarios | __ | __ | __ | __ | __% |
|
||
| Infrastructure | __ | __ | __ | __ | __% |
|
||
| Smoke Tests | __ | __ | __ | __ | __% |
|
||
| **TOTAL** | **__** | **__** | **__** | **__** | **__%** |
|
||
|
||
---
|
||
|
||
### Defect Severity Classification
|
||
|
||
**Critical (P0):** Release-blocking, affects core functionality
|
||
**High (P1):** Major functionality broken, workaround exists
|
||
**Medium (P2):** Minor functionality affected, low impact
|
||
**Low (P3):** Cosmetic issue, no functional impact
|
||
|
||
---
|
||
|
||
### Sign-Off Criteria
|
||
|
||
**Release can proceed when:**
|
||
- [ ] All P0 defects resolved
|
||
- [ ] 95%+ pass rate on Critical Path tests
|
||
- [ ] 85%+ pass rate on all Feature tests
|
||
- [ ] No unresolved P1 defects in core features
|
||
- [ ] Cross-app scenarios pass 90%+
|
||
- [ ] Backend integration stable (no frequent failures)
|
||
- [ ] QA lead approval obtained
|
||
- [ ] Product owner approval obtained
|
||
|
||
---
|
||
|
||
## 📝 NOTES & CLARIFICATIONS NEEDED
|
||
|
||
The following items require clarification before full QA execution:
|
||
|
||
1. ⚠️ **Documents Feature (STAFF-015):** Real Data Connect integration status unclear. Currently using mock implementation.
|
||
|
||
2. ⚠️ **Shift Cancellation:** Feature existence and behavior not confirmed in current implementation.
|
||
|
||
3. ⚠️ **Race Condition Handling (Scenario 9):** Backend concurrency control mechanism needs documentation.
|
||
|
||
4. ⚠️ **Payment Processing:** End-to-end payment flow from shift completion to payment disbursement not fully implemented.
|
||
|
||
5. ⚠️ **NFC Tag Assignment:** Hub NFC functionality interface exists but implementation status unclear.
|
||
|
||
6. ⚠️ **Recurring & Permanent Orders:** Placeholder screens exist but full workflow not implemented.
|
||
|
||
7. ⚠️ **Reports Feature (Client):** Currently shows placeholder, implementation status unknown.
|
||
|
||
8. ⚠️ **Notification System:** Push notifications for shift assignments, cancellations, and status updates not covered in current analysis.
|
||
|
||
---
|
||
|
||
## 🎯 CONCLUSION
|
||
|
||
This QA checklist provides comprehensive coverage of all implemented features across both Client and Staff applications. It is designed for manual testing by QA engineers and supports release sign-off decisions based on structured test execution and clear pass/fail criteria.
|
||
|
||
**Key Strengths:**
|
||
- ✅ Feature-by-feature detailed test cases
|
||
- ✅ Cross-application integration scenarios
|
||
- ✅ Infrastructure and data consistency validation
|
||
- ✅ Clear release-blocking criteria
|
||
- ✅ Based on actual implemented code (not speculative)
|
||
|
||
**Recommended Usage:**
|
||
1. Execute smoke tests before each build
|
||
2. Run full feature regression weekly
|
||
3. Execute cross-app scenarios before major releases
|
||
4. Validate infrastructure after backend schema updates
|
||
5. Use sign-off checklist for release go/no-go decisions
|
||
|
||
---
|
||
|
||
**Document Maintainer:** KROW QA Team
|
||
**Last Updated:** February 1, 2026
|
||
**Next Review:** Upon next major feature release
|