Skip to content

QA Testing Plan: Events

This document covers QA test cases for the Events business app located at /business/apps/events. The app supports creating events with online/in-person/hybrid location types, managing ticket types and speakers, tracking ticket sales and revenue, and publish/draft/cancelled/completed lifecycle.

RoutePurpose
/business/apps/eventsDashboard with stats and recent events list
/business/apps/events/newCreate event form (superforms + createEventSchema)
/business/apps/events/[id]Event detail with ticket types, speakers, sales, publish/delete
RouteActionMethodKey Fields
/business/apps/events/newdefaultPOSTtitle, description, short_description, thumbnail_url, location, location_type, link, starts_at, ends_at, timezone, capacity
/business/apps/events/[id]publishPOST(none)
/business/apps/events/[id]deletePOST(none)
/business/apps/events/[id]create-ticket-typePOSTVia createTicketTypeSchema
/business/apps/events/[id]delete-ticket-typePOSTticket_type_id
/business/apps/events/[id]add-speakerPOSTVia addSpeakerSchema
/business/apps/events/[id]remove-speakerPOSTspeaker_id

Test IDDescriptionPreconditionsStepsExpected ResultPriority
EVT-001Dashboard loads with organizer statsUser is logged in with events1. Navigate to /business/apps/eventsStats cards display: Total Events, Published, Tickets Sold, Revenue. Recent events list shows up to 5 items.P0
EVT-002Dashboard shows empty state for new userUser is logged in with no events1. Navigate to /business/apps/eventsStats section is hidden. Empty state “No events yet” is displayed.P1
EVT-003Unauthenticated user sees null statsUser is not logged in1. Navigate to /business/apps/eventsPage loads with stats: null and empty upcomingEvents. No crash.P1
EVT-004”New Event” button navigates correctlyUser is logged in1. Click “New Event” buttonNavigates to /business/apps/events/new.P0
EVT-005Recent event links navigate to detailUser has events1. Click an event in the recent listNavigates to /business/apps/events/{id}.P1
EVT-006Status badges render correct variantsEvents with draft, published, cancelled, completed statuses exist1. View recent events listdraft = secondary, published = default, cancelled = destructive, completed = outline.P2
EVT-007Location type displays correctlyEvents with different location types exist1. View recent events listLocation type shows with underscores replaced by spaces (e.g., “in person”).P2
Test IDDescriptionPreconditionsStepsExpected ResultPriority
EVT-010Create event with required fields onlyUser is logged in1. Navigate to /business/apps/events/new 2. Fill title, starts_at, ends_at 3. SubmitEvent is created. User is redirected to /business/apps/events/{new_id}.P0
EVT-011Create event with all fieldsUser is logged in1. Fill title, description, short_description, thumbnail_url, location, location_type, link, starts_at, ends_at, timezone, capacity 2. SubmitEvent is created with all fields persisted. Redirect to detail page.P0
EVT-012Validation: empty title rejectedUser is logged in1. Leave title blank 2. SubmitForm returns 400 with error “Title is required”.P0
EVT-013Validation: title exceeds 255 charactersUser is logged in1. Enter title with 256+ characters 2. SubmitForm returns 400 with max length error.P1
EVT-014Validation: empty starts_at rejectedUser is logged in1. Leave starts_at blank 2. SubmitForm returns 400 with error “Start date is required”.P0
EVT-015Validation: empty ends_at rejectedUser is logged in1. Leave ends_at blank 2. SubmitForm returns 400 with error “End date is required”.P0
EVT-016Validation: short_description exceeds 500 charsUser is logged in1. Enter short_description with 501+ chars 2. SubmitForm returns 400 with max length error.P1
EVT-017Validation: location exceeds 500 charsUser is logged in1. Enter location with 501+ chars 2. SubmitForm returns 400 with max length error.P1
EVT-018Validation: capacity must be positive integerUser is logged in1. Enter capacity as 0 or negative 2. SubmitForm returns 400 with validation error.P1
EVT-019Location type: onlineUser is logged in1. Select location_type “online” 2. SubmitEvent is created with location_type: "online".P1
EVT-020Location type: in_personUser is logged in1. Select location_type “in_person” 2. SubmitEvent is created with location_type: "in_person".P1
EVT-021Location type: hybridUser is logged in1. Select location_type “hybrid” 2. SubmitEvent is created with location_type: "hybrid".P1
EVT-022Unauthenticated user redirected from create pageUser is not logged in1. Navigate to /business/apps/events/newUser is redirected to /login.P0
Test IDDescriptionPreconditionsStepsExpected ResultPriority
EVT-030Load event detail pageUser owns the event1. Navigate to /business/apps/events/{id}Event data loads with ticket types, speakers, sales, and totalRevenue.P0
EVT-031404 for non-existent eventUser is logged in1. Navigate to /business/apps/events/{invalid_id}404 error “Event not found” is returned.P0
EVT-032403 for event owned by another userUser does not own the event1. Navigate to /business/apps/events/{other_user_event_id}403 Forbidden error is returned.P0
EVT-033Publish a draft eventUser owns a draft event1. Submit the publish actionReturns { published: true }. Event status updates to “published”.P0
EVT-034Delete an eventUser owns an event1. Submit the delete actionEvent is deleted. User is redirected to /business/apps/events.P0
EVT-035Revenue calculation on detail pageUser owns event with ticket sales1. Load event detail pagetotalRevenue equals the sum of all sales[].total_amount.P1
Test IDDescriptionPreconditionsStepsExpected ResultPriority
EVT-040Create ticket type for eventUser owns the event1. Fill and submit create-ticket-type formTicket type is created. Success message “Ticket type created!” is returned.P0
EVT-041Create ticket type validation failureUser owns the event1. Submit create-ticket-type with invalid dataReturns 400 with form errors.P1
EVT-042Delete ticket type by IDUser owns the event with ticket types1. Submit delete-ticket-type with ticket_type_idTicket type is deleted. Returns { deleted: true }.P0
EVT-043Delete ticket type fails without IDUser is logged in1. Submit delete-ticket-type without ticket_type_idReturns 400 “Missing ticket type ID”.P1
EVT-044Delete ticket type handles server errorUser is logged in, service throws1. Trigger server error during deletionReturns 500 “Failed to delete ticket type”.P1
EVT-045Create ticket type requires authenticationUser is not logged in1. POST to ?/create-ticket-typeReturns 401 fail.P1
Test IDDescriptionPreconditionsStepsExpected ResultPriority
EVT-050Add speaker to eventUser owns the event1. Fill and submit add-speaker formSpeaker is added. Success message “Speaker added!” is returned.P0
EVT-051Add speaker validation failureUser owns the event1. Submit add-speaker with invalid dataReturns 400 with form errors.P1
EVT-052Remove speaker by IDUser owns the event with speakers1. Submit remove-speaker with speaker_idSpeaker is removed. Returns { removed: true }.P0
EVT-053Remove speaker fails without IDUser is logged in1. Submit remove-speaker without speaker_idReturns 400 “Missing speaker ID”.P1
EVT-054Remove speaker handles server errorUser is logged in, service throws1. Trigger server errorReturns 500 “Failed to remove speaker”.P1