# Test Plan: Organization Dashboard (Workstream L) ## Overview Manual UI test plan for organization management pages: - `/dashboard` - Org list - `/dashboard/[slug]` - Org overview - `/dashboard/[slug]/members` - Member management - `/dashboard/[slug]/settings` - Org settings - `/invite/accept` - Invite acceptance ## Prerequisites - Dev server running: `bun run --cwd apps/publisher-dashboard dev` - Test user accounts with different roles in an org (owner, admin, member) - At least one org with multiple members --- ## 1. Organization List (`/dashboard`) ### 1.1 Authentication - [ ] Unauthenticated user visiting `/dashboard` redirects to `/auth/login` - [ ] After login, user returns to `/dashboard` ### 1.2 Empty State - [ ] New user with no orgs sees "You're not a member of any organizations yet" - [ ] "Create Organization" button is visible and functional ### 1.3 Org List Display - [ ] All user's orgs display in a grid - [ ] Each card shows: org name, slug, logo (or placeholder), created date - [ ] Cards are clickable and navigate to `/dashboard/[slug]` ### 1.4 Loading States - [ ] Loading spinner shows while fetching orgs - [ ] Error state displays if API fails --- ## 2. Organization Overview (`/dashboard/[slug]`) ### 2.1 Access Control - [ ] Non-member visiting org page sees error "Failed to load organization" - [ ] Member can view org overview ### 2.2 Header Section - [ ] Org name displays correctly - [ ] Org slug displays below name - [ ] Logo displays if set, placeholder icon if not - [ ] Current user's role badge shows (Owner/Admin/Member) - [ ] Settings button visible only for admin/owner ### 2.3 Stats Cards - [ ] Members card shows correct count - [ ] Members card is clickable, navigates to members page - [ ] Sites card shows correct count ### 2.4 Team Members Preview - [ ] Shows up to 5 members with avatar, name/email, role badge - [ ] "View all" link navigates to members page ### 2.5 Connected Sites Preview - [ ] Shows up to 5 sites with domain - [ ] Empty state if no sites --- ## 3. Members Management (`/dashboard/[slug]/members`) ### 3.1 View Permissions (All Roles) - [ ] Members table displays all org members - [ ] Each row shows: avatar, name, email, role badge, joined date - [ ] Current user marked with "(You)" ### 3.2 Invite Form (Admin/Owner Only) - [ ] Invite form visible for admin and owner - [ ] Invite form hidden for member role - [ ] Email input validates email format - [ ] Role dropdown shows appropriate options: - Owner: can invite member, admin, owner - Admin: can invite member, admin only - [ ] "Send Invite" disabled when email empty - [ ] Success toast on invite sent - [ ] Error toast on failure (e.g., user already member) ### 3.3 Pending Invitations (Admin/Owner Only) - [ ] Pending invites section visible for admin/owner - [ ] Hidden for member role - [ ] Shows: email, role, invited by, expiration - [ ] Cancel button removes invite with confirmation dialog - [ ] Cancelled invite disappears from list ### 3.4 Role Management (Owner Only) - [ ] Owner sees role dropdown for each member (except self) - [ ] Admin sees static role badges (no dropdown) - [ ] Member sees static role badges - [ ] Changing role updates immediately - [ ] Success toast on role change ### 3.5 Remove Member - [ ] Owner can remove any member (except self) - [ ] Admin can remove members only (not other admins/owners) - [ ] Member cannot remove anyone - [ ] Remove button shows confirmation dialog - [ ] Removed member disappears from list - [ ] Cannot remove self (no remove button for current user) --- ## 4. Organization Settings (`/dashboard/[slug]/settings`) ### 4.1 Access Control - [ ] Settings page accessible to admin and owner - [ ] Member role can access but sees limited options ### 4.2 General Settings (Admin/Owner) - [ ] Display name input pre-filled with current value - [ ] Logo URL input pre-filled if set - [ ] Save button disabled when no changes - [ ] Save button enabled when form is dirty - [ ] Success toast on save - [ ] Changes reflected in org header after save ### 4.3 Leave Organization (Member/Admin Only) - [ ] "Leave Organization" section visible for member and admin - [ ] Hidden for owner (owners cannot leave) - [ ] Warning alert explains consequences - [ ] Leave button shows confirmation dialog - [ ] After leaving, redirects to `/dashboard` - [ ] User no longer sees org in their list ### 4.4 Danger Zone (Owner Only) - [ ] Delete section visible only for owner - [ ] Hidden for admin and member - [ ] Warning alert explains permanent deletion - [ ] Delete button shows confirmation dialog - [ ] Confirmation describes what will be deleted - [ ] After delete, redirects to `/dashboard` - [ ] Org no longer appears for any user --- ## 5. Invite Accept Flow (`/invite/accept`) ### 5.1 Unauthenticated User - [ ] Visiting with token redirects to login - [ ] After login, returns to accept page with token - [ ] Invite automatically accepted ### 5.2 Authenticated User - Valid Token - [ ] Page shows "Accepting invitation..." initially - [ ] Success message: "You've joined the organization!" - [ ] Auto-redirects to `/dashboard` after success ### 5.3 Authenticated User - Invalid/Expired Token - [ ] Error message: "This invitation has expired or is invalid" - [ ] "Try again" button visible - [ ] "Go to Dashboard" button navigates to `/dashboard` - [ ] "Sign in with a different account" link visible ### 5.4 Already a Member - [ ] Error message: "You're already a member of this organization" ### 5.5 Email Mismatch - [ ] Error message: "This invitation was sent to a different email address" - [ ] Suggests logging in with correct account ### 5.6 No Token - [ ] Error message: "No invitation token provided" --- ## 6. Navigation & Sidebar ### 6.1 Sidebar - [ ] "Organizations" nav item visible in sidebar - [ ] Building icon displays correctly - [ ] Clicking navigates to `/dashboard` - [ ] Active state shows when on `/dashboard` routes ### 6.2 Breadcrumb Navigation - [ ] Back links work correctly on settings page - [ ] "Back to organizations" link on error pages --- ## 7. Cross-Cutting Concerns ### 7.1 Loading States - [ ] All pages show loading spinner during data fetch - [ ] Skeleton states or spinners for async operations ### 7.2 Error Handling - [ ] API errors display user-friendly messages - [ ] Toast notifications for action results - [ ] Error states don't crash the app ### 7.3 Responsive Design - [ ] Pages render correctly on mobile viewport - [ ] Tables scroll horizontally on small screens - [ ] Forms stack vertically on mobile ### 7.4 Query Invalidation - [ ] After invite: invites list refreshes - [ ] After role change: members list refreshes - [ ] After remove member: members list refreshes - [ ] After org update: org details refresh - [ ] After leave/delete: orgs list refreshes --- ## 8. Edge Cases ### 8.1 Last Owner Protection - [ ] Last owner cannot leave organization - [ ] Must transfer ownership before leaving ### 8.2 Self-Actions - [ ] Cannot remove yourself from org - [ ] Cannot change your own role (as owner) ### 8.3 Concurrent Updates - [ ] UI handles stale data gracefully - [ ] Refresh shows latest state ### 8.4 Long Content - [ ] Long org names truncate or wrap properly - [ ] Long email addresses don't break layout --- ## Test Matrix: Role-Based Features | Feature | Owner | Admin | Member | |---------|-------|-------|--------| | View org overview | Yes | Yes | Yes | | View members list | Yes | Yes | Yes | | Access settings page | Yes | Yes | Yes | | Edit org settings | Yes | Yes | No | | Send invites | Yes | Yes | No | | Cancel invites | Yes | Yes | No | | Change member roles | Yes | No | No | | Remove members | Yes | Members only | No | | Remove admins | Yes | No | No | | Leave organization | No | Yes | Yes | | Delete organization | Yes | No | No | --- ## Regression Checklist After any changes to org pages, verify: - [ ] Existing orgs still load correctly - [ ] Role detection still works - [ ] All CRUD operations function - [ ] Error states still display - [ ] Navigation works end-to-end