Test Cases: Broadcast Management
/admin/broadcasts (composer is an inline form on the same page). Status flow is DRAFT → SENDING → SENT (or FAILED); edit only while DRAFT/SCHEDULED, delete only while DRAFT. Send is fire-and-forget, in-process via POST /api/broadcasts/:id/send — there is no test-send, no working scheduler (a scheduledAt never auto-fires), and no merge tags (raw-HTML body). Open/click analytics are not implemented. Follow the index over the steps below.
Module: Communications - Broadcasts
Backend Endpoints:
GET /api/broadcastsPOST /api/broadcastsGET /api/broadcasts/:idPUT /api/broadcasts/:idDELETE /api/broadcasts/:idGET /api/broadcasts/:id/previewPOST /api/broadcasts/:id/send
Frontend Page: frontend/pwa-app/src/pages/AdminBroadcastsPage.tsx
Prerequisites
- User logged in with ADMIN or COMMUNICATIONS_MANAGER role.
- Segments configured with members.
- Email service operational.
Test Data
| Broadcast | Subject | Segment | Status |
|---|---|---|---|
| BC-2024-001 | January Newsletter | All Active Members | SENT |
| BC-2024-002 | Event Reminder: Annual Summit | Summit Registrants | DRAFT |
| BC-2024-003 | Payment Reminder | Members with Overdue Invoices | SCHEDULED |
Test Cases
TC-COMM-001: View All Broadcasts
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as ADMIN. | Dashboard displayed. |
| 2 | Navigate to Admin > Communications > Broadcasts. | Broadcast list displayed. |
| 3 | Verify all broadcasts listed. | Draft, sent, and scheduled broadcasts visible. |
| 4 | Verify columns. | Subject, Segment, Status, Recipients, Sent Date. |
| 5 | Verify status indicators. | Draft (gray), Sent (green), Scheduled (blue). |
TC-COMM-002: Create New Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click "Create Broadcast" button. | Broadcast editor displayed. |
| 2 | Enter subject: "February Newsletter". | Subject entered. |
| 3 | Select segment: "All Active Members". | Segment selected. |
| 4 | Compose body content with rich text. | Content entered. |
| 5 | Add personalization: "Dear {{firstName}}". | Merge tag inserted. |
| 6 | Click "Save Draft". | API POST /api/broadcasts called. |
| 7 | Verify success. | "Broadcast saved" message. |
| 8 | Verify in list. | New broadcast appears with DRAFT status. |
TC-COMM-003: Edit Draft Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click on draft broadcast BC-2024-002. | Editor opens with existing content. |
| 2 | Update subject: "Reminder: Annual Engineers Summit". | Subject modified. |
| 3 | Update body content. | Content modified. |
| 4 | Save changes. | API PUT /api/broadcasts/:id called. |
| 5 | Verify changes saved. | Updated content displayed. |
TC-COMM-004: Cannot Edit Sent Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click on sent broadcast BC-2024-001. | Broadcast view displayed. |
| 2 | Look for edit option. | Edit button disabled or not visible. |
| 3 | Verify read-only mode. | Content not editable. |
TC-COMM-005: Preview Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open draft broadcast. | Editor displayed. |
| 2 | Click "Preview" button. | Preview modal/panel opens. |
| 3 | Verify content rendered. | HTML formatted as email will appear. |
| 4 | Verify merge tags replaced. | "Dear {{firstName}}" shows as "Dear [Sample Name]". |
| 5 | Test desktop view. | Desktop email preview. |
| 6 | Test mobile view. | Mobile-responsive preview. |
TC-COMM-006: Send Test Email
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open draft broadcast. | Editor displayed. |
| 2 | Click "Send Test". | Dialog opens. |
| 3 | Enter test email: admin's email. | Email entered. |
| 4 | Click send. | Test email sent. |
| 5 | Check inbox. | Test email received with "[TEST]" prefix. |
| 6 | Verify content. | Content matches preview. |
TC-COMM-007: Delete Draft Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Select draft broadcast. | - |
| 2 | Click "Delete" button. | Confirmation dialog displayed. |
| 3 | Confirm deletion. | API DELETE /api/broadcasts/:id called. |
| 4 | Verify success. | "Broadcast deleted" message. |
| 5 | Verify removed from list. | Broadcast no longer visible. |
TC-COMM-008: Cannot Delete Sent Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Attempt to delete sent broadcast. | Delete button disabled or warning. |
| 2 | Via direct API. | Status 400 Bad Request - "Cannot delete sent broadcast". |
TC-COMM-009: Broadcast with Rich Text Formatting
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create new broadcast. | Editor displayed. |
| 2 | Add bold text, italic, lists. | Formatting applied. |
| 3 | Add hyperlink. | Link inserted. |
| 4 | Add image (if supported). | Image embedded. |
| 5 | Preview. | All formatting rendered correctly. |
| 6 | Send test email. | Formatting preserved in email. |
TC-COMM-010: Broadcast with Merge Tags
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create broadcast. | - |
| 2 | Insert merge tags: {{firstName}}, {{lastName}}, {{membershipType}}. | Tags inserted. |
| 3 | Preview. | Tags show sample data. |
| 4 | Send to actual segment. | Recipients receive personalized content. |
TC-COMM-011: Schedule Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create broadcast content. | - |
| 2 | Click "Schedule" instead of "Send Now". | Scheduling options displayed. |
| 3 | Set date/time: Tomorrow 9:00 AM. | Schedule configured. |
| 4 | Save scheduled broadcast. | Status changes to SCHEDULED. |
| 5 | Verify in list. | Shows scheduled date/time. |
TC-COMM-012: Cancel Scheduled Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open scheduled broadcast. | Broadcast details displayed. |
| 2 | Click "Cancel Schedule". | Confirmation dialog. |
| 3 | Confirm. | Status changes back to DRAFT. |
| 4 | Verify not sent at scheduled time. | Broadcast remains unsent. |
TC-COMM-013: View Broadcast Statistics (Sent)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open sent broadcast BC-2024-001. | Broadcast details displayed. |
| 2 | View statistics section. | Analytics displayed. |
| 3 | Verify metrics. | Recipients, Delivered, Opened, Clicked (if tracked). |
| 4 | Verify open rate. | Percentage calculated correctly. |
TC-COMM-014: Duplicate Broadcast
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open existing broadcast. | - |
| 2 | Click "Duplicate" or "Copy". | New draft created. |
| 3 | Verify content copied. | Same subject, body, segment. |
| 4 | Verify status is DRAFT. | New broadcast is editable. |
TC-COMM-015: Broadcast Validation - Empty Fields
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create broadcast. | - |
| 2 | Leave subject empty. | - |
| 3 | Attempt to save. | Validation error: "Subject is required". |
| 4 | Leave segment unselected. | Validation error: "Segment is required". |
| 5 | Leave body empty. | Validation error: "Content is required". |
API Test Cases
TC-COMM-API-001: GET /api/broadcasts
Expected Response: 200 OK
{
"broadcasts": [
{
"id": "BC-2024-001",
"subject": "January Newsletter",
"segment": { "id": "...", "name": "All Active Members" },
"status": "SENT",
"recipientCount": 150,
"sentAt": "timestamp",
"openRate": 65
}
]
}
TC-COMM-API-002: POST /api/broadcasts
Request:
{
"subject": "February Newsletter",
"segmentId": "seg_all_active",
"body": "<p>Dear {{firstName}},</p><p>Welcome to our February update...</p>",
"status": "DRAFT"
}
Expected Response: 201 Created
TC-COMM-API-003: GET /api/broadcasts/:id/preview
Expected Response: 200 OK
{
"subject": "February Newsletter",
"html": "<p>Dear John,</p><p>Welcome to our February update...</p>",
"recipientCount": 150,
"sampleRecipient": {
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com"
}
}
TC-COMM-API-004: POST /api/broadcasts/:id/send
Request: POST /api/broadcasts/BC-2024-002/send
Expected Response: 200 OK
{
"success": true,
"recipientCount": 85,
"status": "SENT",
"sentAt": "timestamp"
}