Test Cases: Segment Management
/admin/segments (create / edit / delete for ADMIN / COMMS_MANAGER); segments are also still selectable from the composer's "Audience" <select>. However, the API's only filters are still status / roles / membershipTypeId — there is NO "unpaid invoices" or any billing/payment filter. Three read-only system segments auto-seed: All Active Members, Administrators, Pending Members. Any billing/dues custom-filter steps below remain not-applicable.
Module: Communications - Segments
Backend Endpoints:
GET /api/segmentsPOST /api/segmentsGET /api/segments/:idPUT /api/segments/:idDELETE /api/segments/:idPOST /api/segments/preview
Frontend Page: frontend/pwa-app/src/pages/AdminBroadcastEditPage.tsx
Prerequisites
- Members exist with various statuses, membership types, and attributes.
- Test data from
00_MASTER_TEST_DATA.mdis seeded.
Test Data - Segments
| Segment Name | Criteria | Expected Count |
|---|---|---|
| All Active Members | status = ACTIVE | ~150 |
| Overdue Payments | Has overdue invoice | ~12 |
| New Members (This Year) | joined >= Jan 1 | ~25 |
| Event Registrants (Summit) | Registered for EVT-2024-002 | ~85 |
| Regular Members Only | membershipType = Regular | ~100 |
Test Cases
TC-COMM-016: View All Segments
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as ADMIN. | Dashboard displayed. |
| 2 | Navigate to Broadcasts > Segments. | Segment list displayed. |
| 3 | Verify all segments listed. | Default and custom segments visible. |
| 4 | Verify member counts. | Count displayed for each segment. |
TC-COMM-017: Create Simple Segment - By Status
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click "Create Segment". | Segment builder displayed. |
| 2 | Enter name: "Active Members Only". | Name entered. |
| 3 | Add condition: Status equals ACTIVE. | Condition added. |
| 4 | Preview segment. | Member count and sample list shown. |
| 5 | Save segment. | API POST /api/segments called. |
| 6 | Verify segment created. | Appears in segment list. |
TC-COMM-018: Create Segment - By Membership Type
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create new segment. | Builder displayed. |
| 2 | Name: "Corporate Members". | Name entered. |
| 3 | Add condition: membershipType equals "Corporate Member". | Condition added. |
| 4 | Preview. | Shows corporate members only. |
| 5 | Save. | Segment created. |
TC-COMM-019: Create Segment - Multiple Conditions (AND)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create new segment. | Builder displayed. |
| 2 | Name: "Active Regular Members". | - |
| 3 | Add condition 1: status equals ACTIVE. | First condition. |
| 4 | Add condition 2: membershipType equals "Regular Member". | Second condition. |
| 5 | Set logic: AND (both must match). | Logic configured. |
| 6 | Preview. | Only active regular members shown. |
| 7 | Verify count. | Intersection of both criteria. |
TC-COMM-020: Create Segment - Multiple Conditions (OR)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment: "Students or Associates". | - |
| 2 | Add condition: membershipType equals "Student Member". | First condition. |
| 3 | Add condition: membershipType equals "Associate Member". | Second condition. |
| 4 | Set logic: OR (either matches). | Logic configured. |
| 5 | Preview. | Both student and associate members included. |
| 6 | Verify count. | Union of both criteria. |
TC-COMM-021: Create Segment - Date-Based Condition
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment: "Joined This Year". | - |
| 2 | Add condition: joinDate >= January 1, 2024. | Date condition. |
| 3 | Preview. | Members who joined since Jan 1 shown. |
| 4 | Verify. | Only 2024 joiners in list. |
TC-COMM-022: Create Segment - Invoice Status Condition
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment: "Members with Overdue Invoices". | - |
| 2 | Add condition: hasOverdueInvoice equals true. | Condition added. |
| 3 | Preview. | Members with overdue invoices shown. |
| 4 | Verify members match. | Antonio Dela Cruz included (has overdue invoice). |
TC-COMM-023: Create Segment - Event Registration Condition
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment: "Summit Registrants". | - |
| 2 | Add condition: registeredForEvent equals "EVT-2024-002". | Event condition. |
| 3 | Preview. | Event registrants shown. |
| 4 | Verify count. | Matches event registration count. |
TC-COMM-024: Edit Existing Segment
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click on existing segment. | Segment details displayed. |
| 2 | Click "Edit". | Builder opens with existing conditions. |
| 3 | Add new condition or modify existing. | Changes made. |
| 4 | Save. | API PUT /api/segments/:id called. |
| 5 | Verify changes. | Updated conditions reflected. |
| 6 | Verify count updated. | New member count based on new criteria. |
TC-COMM-025: Delete Segment
| Step | Action | Expected Result |
|---|---|---|
| 1 | Select segment not used in broadcasts. | - |
| 2 | Click "Delete". | Confirmation dialog. |
| 3 | Confirm. | Segment deleted. |
| 4 | Verify removed from list. | Segment no longer visible. |
TC-COMM-026: Cannot Delete Segment in Use
| Step | Action | Expected Result |
|---|---|---|
| 1 | Attempt to delete segment used in pending broadcast. | Warning displayed. |
| 2 | Verify message. | "Segment is used in active broadcasts". |
| 3 | Options. | Must update broadcasts first or force delete. |
TC-COMM-027: Preview Segment Before Saving
| Step | Action | Expected Result |
|---|---|---|
| 1 | Define segment conditions. | Conditions set. |
| 2 | Click "Preview" without saving. | API POST /api/segments/preview called. |
| 3 | Verify preview results. | Member count and sample list displayed. |
| 4 | Adjust conditions if needed. | Re-preview. |
| 5 | Save when satisfied. | Segment saved with previewed conditions. |
TC-COMM-028: Segment with Zero Members
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment with impossible condition. | e.g., status = "NONEXISTENT". |
| 2 | Preview. | Shows 0 members. |
| 3 | Attempt to save. | Warning: "Segment has no members". |
| 4 | Can still save if intended. | Segment created (may be future use). |
TC-COMM-029: Complex Segment with Nested Conditions
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create segment: "Active members who are (Regular OR Corporate) AND joined this year". | Complex logic. |
| 2 | Build nested conditions. | Group conditions appropriately. |
| 3 | Preview. | Results match complex criteria. |
| 4 | Verify accuracy. | Manually verify sample members meet all criteria. |
TC-COMM-030: Segment Refresh/Recalculate
| Step | Action | Expected Result |
|---|---|---|
| 1 | View segment created earlier. | Shows previous member count. |
| 2 | New member joins matching criteria. | Member added to system. |
| 3 | Refresh/recalculate segment. | Count updates to include new member. |
| 4 | Verify dynamic nature. | Segments are evaluated at send time. |
API Test Cases
TC-COMM-API-005: GET /api/segments
Expected Response: 200 OK
{
"segments": [
{
"id": "seg_all_active",
"name": "All Active Members",
"conditions": [
{ "field": "status", "operator": "equals", "value": "ACTIVE" }
],
"memberCount": 150,
"createdAt": "timestamp"
}
]
}
TC-COMM-API-006: POST /api/segments
Request:
{
"name": "Overdue Payment Members",
"conditions": [
{ "field": "status", "operator": "equals", "value": "ACTIVE" },
{ "field": "hasOverdueInvoice", "operator": "equals", "value": true }
],
"logic": "AND"
}
Expected Response: 201 Created
TC-COMM-API-007: POST /api/segments/preview
Request:
{
"conditions": [
{ "field": "membershipType", "operator": "equals", "value": "Regular Member" },
{ "field": "joinDate", "operator": "greaterThan", "value": "2024-01-01" }
],
"logic": "AND"
}
Expected Response: 200 OK
{
"memberCount": 25,
"sampleMembers": [
{ "id": "MEM-...", "name": "Maria Cruz", "email": "..." },
{ "id": "MEM-...", "name": "Carlos Garcia", "email": "..." }
]
}
TC-COMM-API-008: GET /api/segments/:id
Expected Response: 200 OK
{
"id": "seg_overdue",
"name": "Overdue Payment Members",
"conditions": [...],
"memberCount": 12,
"members": [
{ "id": "MEM-2024-0006", "name": "Antonio Dela Cruz", "email": "..." }
]
}