TC-EVT-005: Event Capacity & Sold-Out (Detailed)

Step-by-Step Guide — Follow each step exactly as written. All values are provided — do not improvise.
♻️ Corrected 2026-07-01 — a waitlist now exists. This page previously said "there is no waitlist" — that is now FALSE. A full waitlist feature shipped (#301–#308, #333–#335) and is ON by default for every event at capacity: instead of a hard rejection, member / member+guest / anonymous registrations are placed on a waitlist. This page (TC-CAP-01 through TC-CAP-05 below) still covers plain capacity/Sold-Out UI for a scenario where the tester doesn't register the waitlisted person — for the full waitlist queue / approve / decline / claim-link flow, see TC-EVT-009 — Waitlist. Note: the public "Join Waitlist" CTA only appears on free events (gated by isFreeEvent in the frontend) — a full paid event still shows plain Sold Out.
Module
Events & Registrations — Capacity Enforcement
Staging Frontend
https://stg-rcme.membervu.com
Tenant
RCME
Test Users
Events Manager + Member + Guest + Expired
Priority
P1

TC-CAP-01: Create a Limited-Capacity Event

StepActionExpected ResultTest Value
1Log in as the Events Manager.Dashboard loads.events@demo.membervu.com / Events123!
2Sidebar Events > Create Event (/admin/events/create).Create form opens.
3Fill the event with a tiny capacity.Fields populated.Name QA Test Limited Seats · Date today or future · Capacity 2 · Visibility PUBLIC · Registration RSVP · Price 0
4Save, then Publish.Event published with capacity 2.

TC-CAP-02: Register Until Full

StepActionExpected ResultTest Value
1Log in as testmember → open "QA Test Limited Seats" → Register.Registered. Count 1/2.testmember@rcme.membervu.com / Member123!
2Log out → log in as guest → register for the same event.Registered. Count 2/2 → event now full.guest@demo.membervu.com / Guest123!

Tip: an admin can also fill seats fast via pre-enrol (TC-EVT-004 / #187) on a free event.

TC-CAP-03: Registration Diverts to Waitlist When Full (Sold Out)

Corrected: registering against a full event no longer hard-fails. It is placed on the waitlist. Card/detail UI still shows Sold Out because there is no open seat; the CTA differs by price (see Step 1). Full waitlist-queue coverage is TC-EVT-009 — this step only confirms the divert-not-reject behavior at the capacity boundary.
StepActionExpected ResultTest Value
1Log in as the expired member (not yet registered) → open "QA Test Limited Seats" (created FREE in TC-CAP-01).Card shows red "Sold Out"; detail shows a "Join Waitlist" CTA (not a disabled/absent Register button — this event is free, so the waitlist CTA applies, #333/#334).expired@demo.membervu.com / Expired123!
2Click Join Waitlist (or API: POST /api/events/:id/register).201/success — registration is created with status WAITLISTED (Prisma EventRegistrationStatus), NOT rejected with a capacity error. Confirm via Admin > Events > "QA Test Limited Seats" > Registration tab > waitlist queue — the expired member now appears there.

TC-CAP-04: Cancel Frees a Spot (does NOT auto-promote the waitlist)

StepActionExpected ResultTest Value
1As admin, Admin > Events > "QA Test Limited Seats" > Registrations; cancel one CONFIRMED registrant (not the waitlisted expired member).Confirmed count drops to 1/2; a spot opens. The waitlisted expired member from TC-CAP-03 is still WAITLISTED — a cancellation does not auto-promote the queue; an admin must explicitly Approve (see TC-EVT-009).admin@rcme.membervu.com / Admin123!
2Re-open the event as a different, not-yet-registered member."1 spot remaining"; a normal Register button is enabled (first-come, seat is open).
3Register.Succeeds with status CONFIRMED; event full again (2/2).

TC-CAP-05: Last-Slot Race (informational)

The authenticated/pre-enrol registration path is guarded against a last-slot race with a row-level lock (#129) — two concurrent requests for the final seat: only one succeeds, the event does not over-book. (The public guest path has a lighter pre-check.) This is hard to exercise manually; note it and move on.

CLEANUP

Delete the "QA Test Limited Seats" event via Admin > Events after the test (this removes its registrations). Note: delete is blocked (409) while it has registrations — cancel/clear them first, or just leave it for other capacity runs and delete at the end.