Test Cases: Role Management

Module: RBAC - Role Management

Backend Endpoints (mounted at /api/admin; legacy alias /admin):

Frontend Page: frontend/pwa-app/src/pages/AdminRolesPermissionsPage.tsx (+ components/roles/)

How to reach the page: there is no direct sidebar link. Log in as ADMIN → sidebar Organization > Settings → click the "Roles & Permissions" card (route /admin/roles).

Prerequisites

Test Data — System Roles (all are system / non-deletable)

Role CodeDisplay NameIs SystemDeletable
ADMINAdministratorYesNo
OFFICEROfficerYesNo
FINANCE_MANAGERTreasurerYesNo
EVENT_MANAGEREvents ManagerYesNo
MEMBERSHIP_MANAGERMembership ManagerYesNo
COMMUNICATIONS_MANAGERCommunications ManagerYesNo
MEMBERMemberYesNo
PENDING_MEMBERPending MemberYesNo
EXPIRED_MEMBERExpired MemberYesNo
GUESTGuestYesNo

Test Cases

TC-RBAC-001: View All Roles

StepActionExpected Result
1Login as ADMIN. Open Settings"Roles & Permissions" card.Roles & Permissions page (/admin/roles) loads.
2Look at the left "Roles" panel.Roles grouped under "System Roles" and "Custom Roles" headers.
3Verify all 10 system roles present.ADMIN, OFFICER, FINANCE_MANAGER, EVENT_MANAGER, MEMBERSHIP_MANAGER, COMMUNICATIONS_MANAGER, MEMBER, PENDING_MEMBER, EXPIRED_MEMBER, GUEST — each with a "System" lock badge.
4Verify each row shows colour dot, role name, role code (monospace), and user count.Metadata displayed per role.

TC-RBAC-002: View Role Details & Permissions

StepActionExpected Result
1Click the FINANCE_MANAGER (Treasurer) role.Right detail panel loads.
2Verify header: colour avatar, name "Treasurer", "System Role" badge, code FINANCE_MANAGER.Shown.
3Verify the Role Summary bar + module tabs (Members, Finance, Events, Communications, Organization, Admin).Tabs render; Finance tab shows granted permissions.
4Click the Finance tab.Permission matrix: rows = resources (invoices, payments, dues, donations, bank-accounts, dashboard); columns = View / Create / Edit / Delete; granted boxes checked.
5Scroll to "Assigned Users".Lists users with this role (e.g. Ana Reyes), or "0".

TC-RBAC-003: Create New Custom Role

StepActionExpected Result
1Click "New Role" (left panel header)."Create New Role" modal opens.
2Enter Role Name: "Volunteer Coordinator".Code auto-fills as VOLUNTEER_COORDINATOR (uppercase).
3Enter a Description; pick a Colour.Values set.
4Click "Create Role".Calls POST /api/admin/roles. Toast "Role created successfully". New role auto-selected, appears under "Custom Roles" with 0 permissions.

Note: the create modal has NO permission picker — permissions are granted afterward in the detail panel matrix (TC-RBAC-002 in the Permission Assignment set).

TC-RBAC-004: Create Role — Validation

StepActionExpected Result
1Open "New Role" modal. Leave Name empty."Create Role" button disabled.
2Type a Code containing lowercase / spaces.Normalized to UPPERCASE_UNDERSCORE; hint "Uppercase letters, numbers, and underscores only".
3Enter Code ADMIN (a system code) and submit.Rejected — code conflicts with a system role.
4Enter the code of an existing custom role and submit.Rejected — duplicate code within tenant.

TC-RBAC-005: Edit Role Metadata (name / description / colour)

StepActionExpected Result
1Select any role. Click the pencil icon next to its name.Inline name editor appears.
2Change the name, press Enter (or blur).Calls PUT /api/admin/roles/:roleId. Name updated.
3Note: this works for system roles too (name/description/colour are editable).System role name can be changed; the code stays immutable.

TC-RBAC-006: Cannot Delete System Role

StepActionExpected Result
1Select ADMIN. Look for a delete (trash) button in the detail header, and open the ⋮ menu on its row.No Delete option exists for system roles — the trash button is absent and the ⋮ menu shows only "Duplicate".
2API: DELETE /api/admin/roles/<ADMIN role id>.Status 400 — system roles cannot be deleted.

TC-RBAC-007: Delete Custom Role (with reassignment)

StepActionExpected Result
1Select a custom role with NO assigned users. Click Delete (⋮ menu or trash icon)."Delete Role" modal. Delete button enabled.
2Confirm "Delete Role".Calls DELETE /api/admin/roles/:roleId (soft-delete). Toast "Role deleted successfully".
3For a custom role with assigned users: click Delete.Modal shows "This role has N assigned user(s)" + a reassign-to dropdown; Delete stays disabled until a target role is chosen.

TC-RBAC-008: Duplicate Role

StepActionExpected Result
1On EVENT_MANAGER, click "Duplicate" (⋮ menu or copy icon)."Duplicate Role" modal. Name pre-filled "Events Manager (Copy)", code "EVENT_MANAGER_COPY".
2Adjust name/code, click "Duplicate Role".Calls POST /api/admin/roles/:roleId/duplicate. New custom role created with the same permissions. Toast "Role duplicated successfully".

TC-RBAC-009: View Role Users

StepActionExpected Result
1Select FINANCE_MANAGER. Scroll to "Assigned Users (N)".Avatars/names of assigned users (e.g. Ana Reyes). Backed by GET /api/admin/roles/:roleId/users.

TC-RBAC-010: Role Audit Log

StepActionExpected Result
1API: GET /api/admin/roles/audit?limit=50 as ADMIN.200 with { logs: [...] }; entries record create/update/delete/permission changes with actor + timestamp. Guard: ADMIN:VIEW:audit-log.

TC-RBAC-011: Non-Admin Cannot Manage Roles

StepActionExpected Result
1Login as Ana Reyes (FINANCE_MANAGER). Try to open Settings → Roles & Permissions, or browse directly to /admin/roles.The "Settings" sidebar item is hidden; visiting /admin/roles directly silently redirects to /home (no 403 page).
2API: POST /api/admin/roles as FINANCE_MANAGER.Status 403 (lacks ADMIN:EDIT:roles).

API Test Cases

TC-RBAC-API-001: GET /api/admin/roles

Expected: 200 OK{ "roles": [ { "id", "code", "name", "description", "color", "isSystem", "permissionCount", "userCount" }, ... ] }. All 10 system roles have isSystem: true.

TC-RBAC-API-002: POST /api/admin/roles

Request body:

{ "name": "Volunteer Coordinator", "code": "VOLUNTEER_COORDINATOR", "description": "Manages event volunteers", "color": "#3B82F6" }

Expected: 201 Created{ "role": { "id", "code": "VOLUNTEER_COORDINATOR", "isSystem": false, "permissions": [] } }. (Permissions are set via a separate call — see TC-RBAC-API-008.)

TC-RBAC-API-003: PUT /api/admin/roles/:roleId (metadata)

Request: PUT /api/admin/roles/<roleId> body { "description": "Updated description", "color": "#10B981" }Expected: 200 OK. Body may contain any subset of name/description/color/icon. code is NOT updatable.

TC-RBAC-API-004: DELETE /api/admin/roles/:roleId

Custom role, no users: DELETE /api/admin/roles/<customId>200 OK { "success": true }. With users: add ?reassignTo=<targetRoleId>.

TC-RBAC-API-005: DELETE System Role (blocked)

DELETE /api/admin/roles/<ADMIN id>Expected: 400 Bad Request — system roles cannot be deleted.

TC-RBAC-API-006: POST /api/admin/roles/:roleId/duplicate

POST /api/admin/roles/<EVENT_MANAGER id>/duplicate body { "name": "Event Coordinator", "code": "EVENT_COORDINATOR" }Expected: 201 Created; new role copies all source permissions.