Test Cases: Event Management

Module: Events & Registrations - Management

Endpoints: POST /api/events (create→DRAFT) · POST /events/:id/publish · PATCH /events/:id (+ /capacity,/pricing,/ticket-types,/banner) · POST /events/:id/clone · POST /admin/events/:eventId/cancel · DELETE /admin/events/:eventId · POST /admin/events/:eventId/registrations (pre-enrol #187).

Frontend: /admin/events (split-view, EventsListPage); create /admin/events/create; edit /admin/events/:eventId/edit. Guard: ADMIN / EVENT_MANAGER.

Prerequisites

Test Cases

TC-MGT-01: Create Event (→ DRAFT)

StepActionExpected Result
1Sidebar Events → Create Event (/admin/events/create).Create form: title, date/time, location, description, capacity, visibility, registration mode, ticket types, cover image.
2Fill required fields → save.POST /api/events. Event created with status DRAFT; slug auto-generated.

TC-MGT-02: Edit Event (capacity guard)

StepActionExpected Result
1Open an event → Edit (/admin/events/:eventId/edit). Change capacity.PATCH /events/:id (or /capacity). Saved.
2Try lowering capacity below the current registration count.Capacity guard prevents it (or warns).

TC-MGT-03: Publish

StepActionExpected Result
1On a DRAFT event → Publish.POST /events/:id/publish. DRAFT → PUBLISHED; now appears in the catalog.

TC-MGT-04: Clone

StepActionExpected Result
1On any event → Clone.POST /events/:id/clone. New event copies fields + ticket types, status DRAFT, dates shifted +7 days, registrations NOT copied. (Full details in TC-EVT-006 Cloning.)

TC-MGT-05: Cancel vs Delete

StepActionExpected Result
1Cancel a PUBLISHED event (with attendees).POST /admin/events/:eventId/cancel. Status → CANCELLED; cancellation emails sent to attendees.
2Delete an event that HAS registrations/invoices.DELETE /admin/events/:eventId409 (blocked). Only events with no registrations can be deleted.

TC-MGT-06: Admin Pre-Enrol / Bulk-Register (#187)

StepActionExpected Result
1Open a free event → Registration tab → View Registrations"Pre-enrol members" button.The pre-enrol drawer opens (free events only; for paid events the button is disabled with "Paid event — members must self-register and pay").
2Search + select members (toggle active-only / include inactive) → "Enrol N members".POST /admin/events/:eventId/registrations with {memberIds}. Result rows: Enrolled / Already registered (greyed, indicator) / Not found / Failed.
3On a free-base event that has PAID ticket types, pre-enrol.All members come back SKIPPED_PAID_EVENT (paid tiers can't be pre-enrolled).

TC-MGT-07: Permissions

StepActionExpected Result
1As a plain MEMBER, call POST /api/events or open /admin/events.403 on the API; the admin Events group is hidden / route redirects.