Files
chore/.github/specs/e2e-routines-test-plan.md
Ryan Kegel 5392e5af70
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 3m8s
Add routine management features for child and parent views
- Implemented routine child-mode flow tests to ensure proper functionality of routine assignment and task completion.
- Created notification tests for parent view to verify routine completion notifications for children.
- Developed ChildRoutineOverlay component for displaying routine tasks and handling user interactions.
- Added RoutineApproveDialog component for approving or rejecting completed routines.
- Created unit tests for ChildRoutineOverlay and RoutineEditView components to ensure correct behavior and rendering.
- Enhanced RoutineEditView with proper handling of task addition and form submission.

Co-authored-by: Copilot <copilot@github.com>
2026-05-17 23:47:12 -04:00

11 KiB

Routines Feature — E2E Test Plan

Test Environment Setup

  • Backend: Must be started with DB_ENV=e2e DATA_ENV=e2e to use isolated test database
  • Frontend: Running on localhost:5173 (Vite dev server)
  • Test Framework: Playwright
  • Config: frontend/playwright.config.ts

Pre-Test Global Setup (global-setup.ts additions)

// Add to global setup to seed a child with assigned routines
export async function seedTestRoutines() {
  const parentEmail = E2E_EMAIL;
  const childName = "Test Child";

  // Create 2-3 test routines in DB for parent
  // Assign them to test child
  // Returns { routine1Id, routine2Id, routine3Id, childId }
}

Test Suite 1: Routine Creation & Management (Parent Mode)

File: frontend/tests/e2e/mode_parent/routines/routine-creation.spec.ts

Test 1.1: Create Routine with Items

Given: Parent is logged in at /parent/tasks/routines
When: Click "Create New Routine"
Then: Navigate to /parent/tasks/routines/create
  - Form shows: Name, Points, Image fields
  - Items section shows "Add Item" form
When: Fill form:
  - Name: "Morning Routine"
  - Points: 50
  - Image: upload file
  - Add items: "Make Bed", "Get Dressed", "Eat Breakfast"
Then: Click "Create Routine"
Then: Routine saved and appears in list at /parent/tasks/routines
  - Name, points, image all visible

Test 1.2: Edit Routine

Given: Routine "Morning Routine" exists
When: Click on routine row and "Edit" or navigate to /parent/tasks/routines/r1/edit
Then: Form pre-populated with current name, points, image, items
When: Change name to "Early Morning Routine", add new item "Shower"
Then: Save changes
Then: Routine updated in list

Test 1.3: Delete Routine

Given: Routine exists
When: Click "Delete" from kebab menu
Then: Confirmation dialog appears
When: Confirm deletion
Then: Routine removed from list
Then: SSE event `routine_modified` with operation=DELETE received

Test Suite 2: Routine Assignment to Children

File: frontend/tests/e2e/mode_parent/routines/routine-assignment.spec.ts

Test 2.1: Assign Routine to Child

Given: Parent viewing child profile page
When: Click "Assign Routines"
Then: Navigate to /parent/:childId/assign-routines
  - ItemList with checkboxes showing all unassigned routines
When: Select "Morning Routine" and "Evening Routine"
Then: Click "Save"
Then: Redirect to child profile
Then: Child now has assigned routines (verify via API /api/child/:id)
Then: SSE event `child_routines_set` received

Test 2.2: Verify Routine Appears in Child Mode

Given: Routine assigned to child
When: Switch to child mode (/child/:id) as that child
Then: Routines section visible between Chores and Rewards
Then: "Morning Routine" visible in ScrollingList
Then: Routine image and points visible

Test Suite 3: Routine Completion Workflow

File: frontend/tests/e2e/mode_parent/routines/routine-completion.spec.ts

Test 3.1: Child Completes Routine

Given: Child mode at /child/:id
When: Click on "Morning Routine" in Routines list
Then: RoutineConfirmDialog shows:
  - Routine image and name
  - All items listed (first 3 + "+X more")
  - "Confirm" and "Cancel" buttons
When: Click "Confirm"
Then: Dialog closes
Then: Routine status changes to "PENDING"
Then: SSE event `child_routine_confirmation` with status=PENDING received
Then: Parent receives push notification "Routine Pending"

Test 3.2: Parent Approves Completed Routine

Given: Routine pending approval (child completed it)
When: Parent views notifications (/parent/notifications)
Then: Pending routine confirmation card appears
When: Click "Approve"
Then: Routine marked as approved
Then: Child receives points (50 in example)
Then: SSE event `child_routine_confirmation` with status=APPROVED received
Then: Child's routine shows "COMPLETED" stamp

Test 3.3: Parent Rejects Routine Completion

Given: Routine pending approval
When: Parent clicks "Reject"
Then: Routine status returns to available
Then: No points awarded
Then: SSE event `child_routine_confirmation` with status=REJECTED received
Then: Child can try again

Test Suite 4: Routine Scheduling

File: frontend/tests/e2e/mode_parent/routines/routine-scheduling.spec.ts

Test 4.1: Schedule Routine for Specific Days

Given: Routine assigned to child
When: Parent opens child profile kebab menu → "Set Schedule" for routine
Then: ScheduleModal opens with entityType already set to "routine"
When: Mode = "Specific Days", select Monday, Wednesday, Friday
  - Set default deadline: 9:00 AM
  - Toggle deadline for Wednesday to 8:00 AM
Then: Save
Then: Routine only appears on those days in child view
Then: SSE event `routine_schedule_modified` with operation=SET received

Test 4.2: Schedule Routine for Interval

Given: Routine assigned to child
When: Parent opens ScheduleModal for routine
When: Mode = "Every X Days", set interval to 3 days
  - Anchor date: today
  - Deadline: 10:00 AM
Then: Save
Then: Routine appears every 3 days
Then: Deadline enforced

Test 4.3: Pause/Resume Schedule

Given: Routine has schedule
When: Parent toggles "Enabled" in ScheduleModal
Then: Routine becomes "Paused" (appears every day, no schedule restriction)
When: Toggle "Enabled" again
Then: Schedule re-enabled
Then: SSE event received

Test Suite 5: Routine Points & Overrides

File: frontend/tests/e2e/mode_parent/routines/routine-overrides.spec.ts

Test 5.1: Set Per-Child Point Override

Given: Routine worth 50 points assigned to child
When: Parent kebab menu → "Edit Points"
Then: Dialog/form to set custom points appears
When: Set to 75 points
Then: Save
Then: Routine now shows 75 points in child view
Then: When child completes routine, 75 points awarded
Then: SSE event `child_override_set` received

Test 5.2: Remove Point Override

Given: Routine has custom points override (75)
When: Parent removes override via UI
Then: Routine reverts to default points (50)
Then: SSE event `child_override_deleted` received

Test Suite 6: Routine Deadline Extension

File: frontend/tests/e2e/mode_parent/routines/routine-extension.spec.ts

Test 6.1: Extend Routine Deadline

Given: Routine has 9:00 AM deadline
When: Current time is 9:15 AM (routine expired)
When: Child view shows "TOO LATE" stamp on routine
When: Parent opens routine kebab → "Extend Time"
When: Parent confirms extension
Then: Routine "TOO LATE" stamp disappears
Then: Child can submit routine again
Then: SSE event `routine_time_extended` received

Test Suite 7: Real-Time SSE Events

File: frontend/tests/e2e/mode_parent/routines/routine-sse-events.spec.ts

Test 7.1: Parent Sees Real-Time Routine Confirmations

Given: Parent and child have browsers open to their respective dashboards
When: Child completes routine (triggers confirm-routine endpoint)
Then: Parent sees pending routine notification appear without page refresh
Then: SSE event stream shows child_routine_confirmation event

Test 7.2: Schedule Changes Propagate in Real-Time

Given: Parent editing routine schedule
When: Parent saves new schedule
Then: Child's routine list updates in real-time to reflect new schedule
Then: Expiry timers recalculate

Test Suite 8: Edge Cases & Validation

File: frontend/tests/e2e/mode_parent/routines/routine-edge-cases.spec.ts

Test 8.1: Cannot Mark Routine Complete Multiple Times Today

Given: Child completed routine and it was approved today
When: Child tries to click "Done" again on same routine
Then: Dialog shows "Already completed today" or similar message
Then: Cannot proceed

Test 8.2: Cannot Assign Same Routine Twice

Given: "Morning Routine" already assigned to child
When: Parent tries to assign same routine again via RoutineAssignView
Then: Checkbox already checked or error shown
Then: Cannot create duplicate assignment

Test 8.3: Cascade Delete

Given: Routine with items, schedules, overrides, and extensions created
When: Delete routine from parent library
Then: All related items deleted
Then: All child assignments removed
Then: All schedules removed
Then: All extensions removed
Then: All overrides removed

Test Suite 9: Routine vs. Task Parity

File: frontend/tests/e2e/mode_parent/routines/routine-task-parity.spec.ts

Test 9.1: ScheduleModal Works for Both Tasks and Routines

Given: ScheduleModal open with entityType prop
When: entityType = "task": schedule chore
Then: Endpoint called: PUT /child/:id/task/:id/schedule
When: entityType = "routine": schedule routine
Then: Endpoint called: PUT /child/:id/routine/:id/schedule

Test 9.2: Override System Works Same for Both

Given: Both chores and routines assigned to child
When: Set custom points for chore and routine
Then: Both reflect custom values
Then: Both use same child_override table with entity_type differentiation

Test Suite 10: Error Handling

File: frontend/tests/e2e/mode_parent/routines/routine-errors.spec.ts

Test 10.1: Network Error on Routine Save

When: Network error during routine save
Then: Error message displayed
Then: User can retry

Test 10.2: Authorization Error

Given: Parent trying to access another parent's routine
When: Fetch routine details
Then: 403 Forbidden response
Then: Appropriate error shown

Test 10.3: Invalid Routine Data

When: Create routine with invalid points (0 or negative)
Then: Form validation error shown
When: Create routine with no items
Then: "Must have at least one item" error shown

Test Execution Guide

Run All Routine E2E Tests

npx playwright test e2e/mode_parent/routines --project=chromium-parent-routines

Run Specific Test Suite

npx playwright test e2e/mode_parent/routines/routine-creation.spec.ts

Run with Visual Mode

npx playwright test e2e/mode_parent/routines --headed --project=chromium-parent-routines

Known Limitations & TODOs

  1. Per-child routine management section in ParentView — May not have full kebab menu yet. Verify the UI shows assigned routines with Edit/Delete/Schedule options.
  2. RoutineDetailView — Plan called for a dedicated detail view; currently using inline dialog. Consider creating full detail route if needed.
  3. Routine reordering — Not implemented (order field exists in schema but no drag UI).
  4. Per-item completion tracking — Deliberately out of scope (items don't track individual completion).

Database Cleanup Between Tests

Use global-setup.ts to:

  1. Clear e2e test database before all tests run
  2. Seed parent + child + routines
  3. Clear after final test completes

Performance Considerations

  • Routines ScrollingList may render many items → verify performance with 50+ routines
  • SSE event propagation latency → measure event-to-UI update time
  • Routine schedule calculations (especially interval mode) → verify no lag on schedule changes