UAT was committed locally after PR #25's final push, so it never reached main. Recovered and committed directly per maintainer authorization. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63 lines
3.3 KiB
Markdown
63 lines
3.3 KiB
Markdown
---
|
|
status: complete
|
|
phase: 20-admin-member-editor-form-declutter
|
|
source: [20-01-SUMMARY.md, 20-02-SUMMARY.md, 20-03-SUMMARY.md]
|
|
started: 2026-06-19T00:28:25Z
|
|
updated: 2026-06-19T00:34:38Z
|
|
verified_by: playwright-cli (Chromium, http://localhost:5173/admin, dev stack)
|
|
---
|
|
|
|
## Current Test
|
|
|
|
[testing complete]
|
|
|
|
## Tests
|
|
|
|
### 1. Open the Member Editor from a member row
|
|
expected: Members panel shows tappable rows (name + chevron, no per-row action buttons). Tapping a row opens one Member Editor sheet with all of that member's details.
|
|
result: pass
|
|
evidence: Members panel rendered one tappable button "Edit Dev User" (name + "Credential set" + Admin badge + chevron) and a single "Add member" trigger. Tapping it opened the "Edit member" dialog containing Profile (display name + Admin switch), "Set new password", and "App password" sections in one sheet.
|
|
|
|
### 2. Edit display name + admin flag (Profile section)
|
|
expected: Changing the display name and/or admin toggle and saving the Profile section persists; the row reflects the new name. No "saved" toast on a no-op save.
|
|
result: pass
|
|
evidence: Changed display name to "Dev User QA" → Save → GET /api/admin/members returned displayName "Dev User QA"; sheet stayed open (per-section save). Reverted to "Dev User" and re-verified.
|
|
|
|
### 3. Last-admin demotion is blocked
|
|
expected: Demoting the only admin shows an inline error and reverts the toggle; member stays admin.
|
|
result: pass
|
|
evidence: Toggled Admin off (aria-checked=false) → Save → 409 from PATCH /api/admin/members/1; inline error "Cannot remove admin — at least one admin must remain." rendered; switch reverted to aria-checked=true; member still isAdmin=true in DB. (The single console error is the expected 409 — not a bug.)
|
|
|
|
### 4. Set a new local-login password (write-only)
|
|
expected: Write-only password field (blank, never prefilled); does not echo any existing password.
|
|
result: pass
|
|
evidence: "Set new password" section fields start blank; New/Confirm/App-password inputs are type="password"; New-password autocomplete="new-password"; "Leave blank to keep the current password." helper shown. Save button disabled until filled.
|
|
|
|
### 5. Set / update the Fastmail app password (clear labels)
|
|
expected: Clear non-jargon labels (no "Rotate"); valid password CalDAV-validated before store; email field blank on edit.
|
|
result: pass
|
|
evidence: Section labeled "App password" with helper "Fastmail app password scoped to Calendars & Contacts (CalDAV)." plus a "Get an app password" link. App-password and Fastmail-email fields both start blank (value=""). No "Rotate" term present.
|
|
|
|
### 6. Add a member via the collapsed trigger
|
|
expected: "Add member" is a single collapsed trigger; tapping opens the editor in create mode.
|
|
result: pass
|
|
evidence: No inline always-open add form. Tapping the single "Add member" button opened an "Add member" dialog in create mode (Display name, Username, Initial password, Confirm password + disabled "Add member" submit).
|
|
|
|
### 7. Old jargon and buttons are gone
|
|
expected: "Rotate", "Add credential", and the standalone "Reset password" button no longer appear.
|
|
result: pass
|
|
evidence: DOM innerText scan on /admin returned {rotate:false, addCredential:false, resetPassword:false}.
|
|
|
|
## Summary
|
|
|
|
total: 7
|
|
passed: 7
|
|
issues: 0
|
|
pending: 0
|
|
skipped: 0
|
|
blocked: 0
|
|
|
|
## Gaps
|
|
|
|
[none — all tests passed]
|