All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m25s
- Updated BASE_VERSION in version.py to 1.0.15. - Added ROUTINES-IMPLEMENTATION-SUMMARY.md detailing the implementation status, phases, and test coverage for the new routines feature. - Created e2e-routines-test-plan.md outlining the end-to-end test strategy for the routines feature. - Introduced plan-routinesFeature.prompt.md to summarize the design and implementation plan for the routines feature.
11 KiB
11 KiB
Routines Feature — E2E Test Plan
Test Environment Setup
- Backend: Must be started with
DB_ENV=e2e DATA_ENV=e2eto 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
- 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.
- RoutineDetailView — Plan called for a dedicated detail view; currently using inline dialog. Consider creating full detail route if needed.
- Routine reordering — Not implemented (order field exists in schema but no drag UI).
- Per-item completion tracking — Deliberately out of scope (items don't track individual completion).
Database Cleanup Between Tests
Use global-setup.ts to:
- Clear e2e test database before all tests run
- Seed parent + child + routines
- 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