Files
chore/frontend/e2e/plans/user-profile.plan.md
Ryan Kegel 127378797c
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 2m46s
Refactored frontend directory
2026-04-25 00:40:15 -04:00

170 lines
6.2 KiB
Markdown

# User Profile
## Application Overview
The User Profile page at `/parent/profile` allows changing a profile image, first name, and last name. It also provides links to: Change Parent PIN, Change Password, and Delete Account. Save and Cancel buttons control form submission.
**Email resolution for e2e PIN/password tests:** A test-only backend endpoint (`GET /user/e2e-get-pin-code`) returns the verification code directly. This endpoint is gated to non-production environments. Password reset tests simply verify the email-sent modal appears without inspecting the actual email.
---
## Implementation
Tests are split into three isolated Playwright project buckets, all under `e2e/mode_parent/user-profile/`.
## Playwright Projects
| Project | File | Notes |
| ------------------------------ | ------------------------- | ------------------------------------------- |
| `chromium-user-profile` | `profile-editing.spec.ts` | Restores profile via API in `afterEach` |
| `chromium-user-profile-pin` | `change-pin.spec.ts` | Restores original PIN via API in `afterAll` |
| `chromium-user-profile-delete` | `delete-account.spec.ts` | Re-seeds entire DB in `afterAll`; run last |
**Config:** `playwright.config.ts` — all three depend on `setup` only.
---
## Test Scenarios
### 1. Profile Editing ✅ IMPLEMENTED
**File:** `e2e/mode_parent/user-profile/profile-editing.spec.ts`
**Seed:** Snapshots profile via API in `beforeEach`; restores it in `afterEach`.
#### 1.1. Page loads with correct data ✅
- Profile heading is visible; First Name, Last Name, and Email fields show the seeded e2e values
#### 1.2. Cancel navigates back ✅
- Clicking Cancel returns to the previous page without saving
#### 1.3. Save disabled when form is clean ✅
- Save button is disabled when no fields have been changed
#### 1.4. Save disabled when First Name is empty ✅
- Clearing the First Name field disables the Save button
#### 1.5. Save disabled when Last Name is empty ✅
- Clearing the Last Name field disables the Save button
#### 1.6. Save disabled when both name fields are empty ✅
- Clearing both fields keeps Save disabled
#### 1.7. Save enables when a name is changed ✅
- Editing any name field enables the Save button
#### 1.8. Save persists name changes ✅
- After saving, re-opening the profile shows the new values; a "Profile Updated" confirmation modal appears on save
#### 1.9. Cancel discards unsaved changes ✅
- Changes made before Cancel are not reflected when the profile is re-opened
#### 1.10. Email field is read-only ✅
- The email input is disabled and shows the account email
#### 1.11. Change profile image (built-in) ✅
- Selecting an unselected built-in image and saving shows the confirmation modal; image persists on reload
#### 1.12. Upload a custom profile image ✅
- Using "Add from device" to upload a local file selects it as the profile image; saving shows the confirmation modal
#### 1.13. Change Password shows email-sent modal ✅
- Clicking Change Password shows a loading modal that transitions to a "Password Change Email Sent" confirmation; OK dismisses it and returns to the profile page
---
### 2. Change Parent PIN ✅ IMPLEMENTED
**File:** `e2e/mode_parent/user-profile/change-pin.spec.ts`
**Seed:** Restores the original e2e PIN via the test API helper in `afterAll`.
#### 2.1. Change Parent PIN link navigates to PIN setup page ✅
- Clicking the link navigates to `/parent/pin-setup` and shows the "Set up your Parent PIN" step
#### 2.2. Back from PIN setup returns to profile ✅
- Browser back from the PIN setup page returns to `/parent/profile`
#### 2.3. Send Verification Code advances to step 2 ✅
- Clicking the button shows the "Enter Verification Code" step with a code input; Verify Code is disabled while the input is empty
#### 2.4. Resend Code button appears after delay ✅
- A "Resend Code" button appears within ~10 seconds of reaching step 2
#### 2.5. Invalid code shows error ✅
- Submitting a wrong code shows an "invalid code" error message
#### 2.6. Valid code advances to step 3 (Create PIN) ✅
- Entering the code from the test endpoint and clicking Verify Code shows the "Create Parent PIN" step with New PIN and Confirm PIN fields; Set PIN is initially disabled
#### 2.7. Set PIN disabled when PINs do not match ✅
- Entering different values in both fields keeps Set PIN disabled
#### 2.8. Set PIN disabled for fewer than 4 digits ✅
- Entering a 2-digit value in both fields keeps Set PIN disabled
#### 2.9. Set PIN succeeds with matching 4-digit PIN ✅
- Entering matching 4-digit values and clicking Set PIN shows the "Parent PIN Set!" success step with a Back button
#### 2.10. Back from success step exits parent mode ✅
- Clicking Back on the success step navigates to the child selector (`/child`) and exits parent mode
---
### 3. Delete Account ✅ IMPLEMENTED
**File:** `e2e/mode_parent/user-profile/delete-account.spec.ts`
**Seed:** Re-seeds the entire e2e database via `POST /auth/e2e-seed` in `afterAll` to restore the test user.
#### 3.1. Delete My Account opens confirmation dialog ✅
- Clicking the button shows a "Delete Your Account?" modal with an email confirmation input; Delete is disabled and Cancel is visible
#### 3.2. Delete button stays disabled for incomplete email ✅
- Entering a partial email keeps the Delete button disabled
#### 3.3. Delete button enables when matching email is entered ✅
- Entering the exact account email enables the Delete button
#### 3.4. Cancel closes the dialog without deleting ✅
- Clicking Cancel dismisses the modal and stays on the profile page with no account changes
#### 3.5. Backdrop click does NOT close the dialog ✅
- Clicking the modal backdrop leaves the dialog open (no backdrop-dismiss behavior)
#### 3.6. Successful deletion redirects to landing page ✅
- After entering the email and clicking Delete, an "Account Deleted" confirmation modal appears; clicking OK redirects to the landing page (`/`)
#### 3.7. Login after deletion is blocked ✅
- Attempting to sign in with the deleted account's credentials shows a "marked for deletion" error and stays on the login page