Step-by-Step Guide — Follow each step exactly as written. All values are provided — do not improvise.

TC-RBAC-002: Permission Boundaries per Role (Detailed)

Module: RBAC - Permission Boundaries (sidebar visibility per role)

URL for this test: https://stg-rcme.membervu.com/login

NOTE: You will log in as 6 different users. Log out completely between each.
Sidebar visibility is ROLE-gated (defined in config/branding.ts) and can differ from raw API permissions — where they diverge, this guide flags it.
Universal admin-deny check: for every non-ADMIN role below, browsing directly to https://stg-rcme.membervu.com/admin/roles must silently redirect to /home (no error page). Only ADMIN and SUPER_ADMIN may open it. The same applies to /admin/settings.

Role 1: Treasurer (Ana Reyes — FINANCE_MANAGER)

StepActionExpected ResultTest Value
1Log in: treasurer@demo.membervu.com / Treasurer123!. Skip any tour.Login succeeds.treasurer@demo.membervu.com / Treasurer123!
2Inspect the left sidebar groups/items.SHOULD see: Overview (Executive Dashboard); Finance (Dashboard, Invoices, Payments, Donations Report); Members (All Members); Events (All Events — view only).
SHOULD NOT see: Organization/Settings, Platform, Communications/Broadcasts, Prospects, Create Event / Check-in / Guests, Reported Issues, Directory.
-
3Browse directly to /admin/roles, then /admin/settings.Both silently redirect to /home.-
4Click Finance → Invoices.Admin invoices list loads (FINANCE_MANAGER allowed).-
5Log out.Logged out.-
Divergence note: FINANCE_MANAGER does see All Members and All Events (view) — corrected from the prior guide, which wrongly said Finance had no member/event visibility.
PASS if: Finance group visible; Settings/Roles redirect to /home; Communications hidden.

Role 2: Events Manager (Carlos Garcia — EVENT_MANAGER)

StepActionExpected ResultTest Value
1Log in: events@demo.membervu.com / Events123!.Login succeeds.events@demo.membervu.com / Events123!
2Inspect the sidebar.SHOULD see: Overview; Members (All Members, Prospects); Events (All Events, Create Event, Guests, Check-in); Communications (Broadcasts).
SHOULD NOT see: Finance, Organization/Settings, Platform, Reported Issues.
-
3Click Communications → Broadcasts.Broadcasts page loads (EVENT_MANAGER holds COMMUNICATIONS:VIEW/CREATE/EDIT/DELETE:broadcasts).-
4Browse directly to /admin/roles.Redirects to /home.-
5Log out.Logged out.-
Divergence note: EVENT_MANAGER does see Broadcasts — corrected from the prior guide, which wrongly listed Communications as denied.
PASS if: Events + Broadcasts + Members visible; Finance hidden; Roles redirects.

Role 3: Membership Manager (Elena Torres — MEMBERSHIP_MANAGER)

StepActionExpected ResultTest Value
1Log in: membershipchair@demo.membervu.com / Membership123!.Login succeeds.membershipchair@demo.membervu.com / Membership123!
2Inspect the sidebar.SHOULD see: Overview; Members (All Members, Prospects); Events (All Events — view).
SHOULD NOT see: Finance, Communications/Broadcasts, Organization/Settings, Platform, Create Event/Check-in/Guests.
-
3Click Members → Prospects.Prospects queue loads.-
4Browse directly to /admin/roles.Redirects to /home.-
5Log out.Logged out.-
PASS if: Members + Prospects visible; Finance/Communications hidden; Roles redirects.

Role 4: Communications Manager (Seung Eun Lee — COMMUNICATIONS_MANAGER)

StepActionExpected ResultTest Value
1Log in: comms@demo.membervu.com / Comms123!.Login succeeds.comms@demo.membervu.com / Comms123!
2Inspect the sidebar.SHOULD see: Overview; Events (All Events — view); Communications (Broadcasts).
SHOULD NOT see: Finance, Members / All Members (sidebar item is role-gated to exclude COMMUNICATIONS_MANAGER), Prospects, Organization/Settings, Platform.
-
3Click Communications → Broadcasts; create a draft broadcast.Broadcasts page loads; draft can be created.-
4Browse directly to /admin/roles.Redirects to /home.-
5Log out.Logged out.-
UI vs API divergence (expected): COMMUNICATIONS_MANAGER holds MEMBERS:VIEW:members at the API level, so GET /api/membership/members returns 200 — but the All Members sidebar item is hidden for this role. This is by design; report it only if the sidebar item unexpectedly appears.
PASS if: Broadcasts visible; Members sidebar item hidden; Finance hidden; Roles redirects.

Role 5: Member (Maria Cruz — MEMBER)

StepActionExpected ResultTest Value
1Log in: testmember@rcme.membervu.com / Member123!.Login succeeds.testmember@rcme.membervu.com / Member123!
2Inspect the sidebar.SHOULD see (member nav only): Home, Events, My Invoices, Payment History, Directory, Support (My Issues), My Account.
SHOULD NOT see: ANY admin group (no Overview, Finance, Members, Events-admin, Communications, Settings, Platform).
-
3Browse directly to /admin/invoices, then /admin/roles.Both redirect to /home (or login). No admin access.-
4API: GET /api/membership/members as MEMBER.Status 403 — plain MEMBER lacks MEMBERS:VIEW:members. (Directory uses a separate requireApprovedMember route.)-
5Log out.Logged out.-
PASS if: Member sees only the member nav; all /admin/* redirect; GET /api/membership/members → 403.

Role 6: Guest (Roberto Mendoza — GUEST)

StepActionExpected ResultTest Value
1Log in: guest@demo.membervu.com / Guest123!.Login succeeds.guest@demo.membervu.com / Guest123!
2Inspect the sidebar.SHOULD see: Home, Events, My Account (and possibly My Invoices / Payment History).
SHOULD NOT see: Directory (role-gated to MEMBER/ADMIN/OFFICER/MEMBERSHIP_MANAGER — excludes GUEST), and any admin group.
-
3Browse directly to /directory, then /admin/invoices.Both redirect away (Directory denied for GUEST; admin denied).-
4Log out.Logged out.-
PASS if: Guest sees public/event items only; Directory and all admin pages are denied.