POST /api/events. Event created with status DRAFT; slug auto-generated.
TC-MGT-02: Edit Event (capacity guard)
Step
Action
Expected Result
1
Open an event → Edit (/admin/events/:eventId/edit). Change capacity.
PATCH /events/:id (or /capacity). Saved.
2
Try lowering capacity below the current registration count.
Capacity guard prevents it (or warns).
TC-MGT-03: Publish
Step
Action
Expected Result
1
On a DRAFT event → Publish.
POST /events/:id/publish. DRAFT → PUBLISHED; now appears in the catalog.
TC-MGT-04: Clone
Step
Action
Expected Result
1
On 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
Step
Action
Expected Result
1
Cancel a PUBLISHED event (with attendees).
POST /admin/events/:eventId/cancel. Status → CANCELLED; cancellation emails sent to attendees.
2
Delete an event that HAS registrations/invoices.
DELETE /admin/events/:eventId → 409 (blocked). Only events with no registrations can be deleted.
TC-MGT-06: Admin Pre-Enrol / Bulk-Register (#187)
Step
Action
Expected Result
1
Open 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").
2
Search + 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.
3
On 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
Step
Action
Expected Result
1
As a plain MEMBER, call POST /api/events or open /admin/events.
403 on the API; the admin Events group is hidden / route redirects.