Live Sessions - QA Test Plan
Overview
Section titled “Overview”The Live Sessions app enables instructors to host live classes, set availability for bookable meetings, and track attendance. Routes are under /business/apps/live-sessions/.
Session Types
Section titled “Session Types”live_class— Live Classwebinar— Webinarworkshop— Workshopoffice_hours— Office Hours
Meeting Providers
Section titled “Meeting Providers”- Custom Link (empty value)
zoom— Zoomagora— Agoragoogle_meet— Google Meet
Session Statuses
Section titled “Session Statuses”scheduled— Upcoming sessionlive— Currently in progressended— Session has concludedcancelled— Session was cancelled
Meeting Booking Statuses
Section titled “Meeting Booking Statuses”confirmed— Booking confirmedcompleted— Meeting completedcancelled— Booking cancelledno_show— Attendee did not show
Attendance Statuses
Section titled “Attendance Statuses”present— Attended on timelate— Joined lateabsent— Did not attend
1. Dashboard / Landing Page
Section titled “1. Dashboard / Landing Page”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-001 | Dashboard loads | User is logged in | Navigate to /business/apps/live-sessions | Page shows header, “New Session” button, quick nav cards (Sessions, New Session, Availability, Meetings), upcoming sessions, and recent meetings | P0 |
| LS-002 | Quick nav cards link correctly | User is logged in | View nav grid | Four cards link to correct routes: sessions, sessions/new, availability, meetings | P0 |
| LS-003 | Upcoming sessions display | Upcoming sessions exist | View upcoming section | Up to 5 sessions shown with title, date, time, duration, participant count, and status badge | P0 |
| LS-004 | Session status badges render | Sessions with various statuses | View list | Scheduled = secondary, Live = default, Ended = outline, Cancelled = destructive | P1 |
| LS-005 | Recent meetings display | Meeting bookings exist | View meetings section | Up to 5 meetings shown with date, time range, notes, and status badge | P1 |
| LS-006 | Empty upcoming sessions | No upcoming sessions | View upcoming section | ”No upcoming sessions” message with CTA | P1 |
| LS-007 | Empty meetings | No bookings exist | View meetings section | ”No meeting bookings yet” message | P1 |
| LS-008 | Session row links to detail | Sessions exist | Click on a session row | Navigates to /business/apps/live-sessions/sessions/{id} | P0 |
2. Sessions List
Section titled “2. Sessions List”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-010 | Sessions list page loads | User is logged in | Navigate to /business/apps/live-sessions/sessions | Header with back arrow, “Sessions” title, count badge, “New Session” button, search bar, status filter pills, and session list | P0 |
| LS-011 | Search sessions | Sessions exist | Enter search term, press Enter | URL updates with ?search=term; sessions filtered by title match | P0 |
| LS-012 | Filter by status - Scheduled | Various sessions exist | Click “Scheduled” pill | URL updates with ?status=scheduled; only scheduled sessions shown | P0 |
| LS-013 | Filter by status - Live | Live sessions exist | Click “Live” pill | Only live sessions shown | P0 |
| LS-014 | Filter by status - Ended | Ended sessions exist | Click “Ended” pill | Only ended sessions shown | P0 |
| LS-015 | Clear status filter | Status filter applied | Click “All” pill | Status param removed; all sessions shown | P1 |
| LS-016 | Active filter pill highlighted | Status filter applied | View filter pills | Active pill has bg-primary text-primary-foreground styling | P1 |
| LS-017 | Empty state with CTA | No sessions exist | View list | ”No sessions found” with icon and “Create your first session” button | P1 |
| LS-018 | Session cards show all info | Sessions exist | View list | Each row shows title, formatted date and time, duration, participant count, and status badge | P0 |
3. Create Session
Section titled “3. Create Session”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-020 | Create page loads | User is logged in | Navigate to /business/apps/live-sessions/sessions/new | Form shows Session Details (title, description), Schedule (date/time, duration, type), Meeting (provider, join URL, capacity), and Pricing (price) sections | P0 |
| LS-021 | Create session with all fields | User is logged in | 1. Enter title “Live Q&A Session” 2. Enter description 3. Set date/time 4. Set duration to 60min 5. Select “Live Class” type 6. Select “Zoom” provider 7. Enter meeting URL 8. Set capacity to 50 9. Set price to 9.99 10. Submit | Session created; user redirected to session detail page | P0 |
| LS-022 | Title is required | User is logged in | Leave title empty, submit | Validation error on title field | P0 |
| LS-023 | Date/time is required | User is logged in | Fill title, leave date empty, submit | Validation error on scheduled_at field | P0 |
| LS-024 | All session types available | User is logged in | Click Type dropdown | Four options: Live Class, Webinar, Workshop, Office Hours | P0 |
| LS-025 | All meeting providers available | User is logged in | Click Provider dropdown | Four options: Custom Link, Zoom, Agora, Google Meet | P0 |
| LS-026 | Select Zoom provider | User is logged in | Select “Zoom” from provider dropdown | Provider value set to zoom | P1 |
| LS-027 | Select Google Meet provider | User is logged in | Select “Google Meet” from provider dropdown | Provider value set to google_meet | P1 |
| LS-028 | Select Agora provider | User is logged in | Select “Agora” from provider dropdown | Provider value set to agora | P1 |
| LS-029 | Price defaults to free | User is logged in | Do not set price | Price defaults to 0 (free session) | P1 |
| LS-030 | Capacity is optional | User is logged in | Leave capacity empty, submit | Session created with unlimited participants | P1 |
| LS-031 | Cancel returns to sessions list | User is on create page | Click “Cancel” | Navigates to /business/apps/live-sessions/sessions | P2 |
| LS-032 | Submit shows loading state | User submits form | Observe button | ”Creating…” with spinner; button disabled | P1 |
| LS-033 | Server error shows toast | Server error on create | Submit (simulated failure) | Error toast with server message | P1 |
| LS-034 | Unauthenticated user redirected | Not logged in | Navigate to create page | Redirected to /login | P0 |
4. Session Detail Page
Section titled “4. Session Detail Page”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-040 | Detail page loads for owner | Session exists, user is host | Navigate to /business/apps/live-sessions/sessions/{id} | Page shows title, status badge, type, scheduled date/time, duration, participant count (with capacity if set), description, meeting URL link, and attendance section | P0 |
| LS-041 | Meeting URL renders as link | Session has meeting_url | View detail | URL shown as clickable link opening in new tab | P1 |
| LS-042 | Participant count with capacity | Session has max_participants | View detail | Shows “X / Y” format (e.g., “15 / 50”) | P1 |
| LS-043 | Participant count without capacity | No max_participants set | View detail | Shows only count without capacity | P1 |
| LS-044 | Description renders with whitespace | Session has multiline description | View description | Text renders with whitespace-pre-wrap | P2 |
5. Session Lifecycle Actions
Section titled “5. Session Lifecycle Actions”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-050 | Start scheduled session | Session status is scheduled | Click “Start” button | Session status changes to live; toast “Session started!” | P0 |
| LS-051 | Cancel scheduled session | Session status is scheduled | Click “Cancel” button | Session is cancelled; toast “Session cancelled.” | P0 |
| LS-052 | End live session | Session status is live | Click “End” button | Session status changes to ended; toast “Session ended.” | P0 |
| LS-053 | Start/Cancel buttons for scheduled only | Session status is scheduled | View action buttons | ”Start” and “Cancel” buttons visible | P0 |
| LS-054 | End button for live only | Session status is live | View action buttons | Only “End” button visible (no Start/Cancel) | P0 |
| LS-055 | No lifecycle buttons for ended/cancelled | Session is ended or cancelled | View action buttons | No Start/Cancel/End buttons rendered | P1 |
| LS-056 | Delete session | Any session | Click trash icon | Session deleted; user redirected to /business/apps/live-sessions/sessions | P0 |
| LS-057 | Non-owner gets 403 | Logged in as different user | Navigate to another host’s session | 403 error thrown | P0 |
| LS-058 | Non-existent session returns 404 | Invalid session ID | Navigate to /business/apps/live-sessions/sessions/nonexistent | 404 “Session not found” error | P1 |
6. Attendance Tracking
Section titled “6. Attendance Tracking”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-060 | Attendance section displays | Session has attendance records | View detail page | Attendance header shows total expected count with badge, and Present/Absent/Late summary counts | P0 |
| LS-061 | Attendance table renders | Attendance records exist | View table | Columns: User, Status (badge), Joined time, Left time, Duration (in minutes) | P0 |
| LS-062 | Attendance status badges | Various attendance statuses | View table | Present = default, Late = secondary, Absent = destructive | P1 |
| LS-063 | Duration calculated correctly | Attendance with duration_seconds | View Duration column | Duration shown in minutes (e.g., “45min”), or dash if 0 | P1 |
| LS-064 | Joined/Left times format | Attendance has joined_at and left_at | View time columns | Times formatted as “H:MM AM/PM”, or dash if null | P2 |
| LS-065 | Empty attendance | No attendance records | View attendance section | ”No attendance records yet” message | P1 |
7. Availability Management
Section titled “7. Availability Management”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-070 | Availability page loads | User is logged in | Navigate to /business/apps/live-sessions/availability | Page shows 7 day cards (Sunday through Saturday), each with “Add Slot” button and existing slots | P0 |
| LS-071 | Add availability slot | User is logged in | 1. Click “Add Slot” on a day 2. Set start time, end time, duration, and price | New slot row added to that day with default values (09:00-10:00, 30min, $0) | P0 |
| LS-072 | Edit slot times | Slot exists | Change start and end time inputs | Slot times update in the form state | P0 |
| LS-073 | Edit slot duration | Slot exists | Change duration to 45 | Duration updates (minimum 5, step 5) | P1 |
| LS-074 | Edit slot price | Slot exists | Set price to 25.00 | Price updates (minimum 0, step 0.01) | P1 |
| LS-075 | Remove slot | Slot exists | Click trash icon on a slot | Slot row removed from the day | P0 |
| LS-076 | Save availability | Slots configured | Click “Save Availability” | All slots saved as JSON payload; toast “Availability saved!” | P0 |
| LS-077 | Save shows loading state | User clicks save | Observe button | ”Saving…” with spinner; button disabled | P2 |
| LS-078 | Save failure shows toast | Server error | Click save (simulated failure) | Error toast “Failed to save availability” | P1 |
| LS-079 | Empty day shows message | No slots for a day | View day card | ”No slots for this day.” message | P2 |
| LS-080 | Existing slots pre-populated | Slots saved previously | Navigate to availability page | All previously saved slots rendered in correct day cards with saved values | P0 |
8. Meeting Bookings
Section titled “8. Meeting Bookings”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-090 | Meetings page loads | User is logged in | Navigate to /business/apps/live-sessions/meetings | Header with back arrow, “Meeting Bookings” title, count badge, and booking list | P0 |
| LS-091 | Booking cards display correctly | Bookings exist | View list | Each card shows date, time range, guest ID, notes (if any), and status badge | P0 |
| LS-092 | Booking status badges render | Various booking statuses | View list | Confirmed = default, Completed = secondary, Cancelled = destructive, No Show = outline | P1 |
| LS-093 | Cancel confirmed booking | Booking status is confirmed | Click “Cancel” button on booking row | Booking cancelled; toast “Meeting cancelled.” | P0 |
| LS-094 | Cancel button only for confirmed | Booking is not confirmed | View booking row | No “Cancel” button rendered | P1 |
| LS-095 | Empty bookings state | No bookings exist | View page | ”No meeting bookings yet” message with calendar icon | P1 |
| LS-096 | Cancel meeting failure | Server error | Click cancel (simulated failure) | 500 error returned with message | P1 |
9. Authorization & Error Handling
Section titled “9. Authorization & Error Handling”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| LS-100 | Unauthenticated user sees empty data | Not logged in | Navigate to dashboard | Empty arrays for sessions and meetings; no server error | P1 |
| LS-101 | Unauthenticated user gets 401 on detail | Not logged in | Navigate to session detail | 401 error thrown | P0 |
| LS-102 | Non-host gets 403 on session detail | Different user | Navigate to another host’s session | 403 error thrown | P0 |
| LS-103 | Unauthenticated user gets 401 on actions | Not logged in | Submit start/end/cancel/delete action | 401 failure returned | P0 |