Files
Krow-workspace/docs/QA_TESTING_CHECKLIST.md

1610 lines
47 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧪 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