TC-EVT-005: Event Capacity & Sold-Out (Detailed)
♻️ 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.
TC-CAP-01: Create a Limited-Capacity Event
| Step | Action | Expected Result | Test Value |
|---|---|---|---|
| 1 | Log in as the Events Manager. | Dashboard loads. | events@demo.membervu.com / Events123! |
| 2 | Sidebar Events > Create Event (/admin/events/create). | Create form opens. | — |
| 3 | Fill 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 |
| 4 | Save, then Publish. | Event published with capacity 2. | — |
TC-CAP-02: Register Until Full
| Step | Action | Expected Result | Test Value |
|---|---|---|---|
| 1 | Log in as testmember → open "QA Test Limited Seats" → Register. | Registered. Count 1/2. | testmember@rcme.membervu.com / Member123! |
| 2 | Log 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.
| Step | Action | Expected Result | Test Value |
|---|---|---|---|
| 1 | Log 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! |
| 2 | Click 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)
| Step | Action | Expected Result | Test Value |
|---|---|---|---|
| 1 | As 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! |
| 2 | Re-open the event as a different, not-yet-registered member. | "1 spot remaining"; a normal Register button is enabled (first-come, seat is open). | — |
| 3 | Register. | 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.