Test Cases: Email Preferences

✅ Now reachable (as of #226 / #231, on stage) — read the Communications index §6 first. The email-preferences screen is the Notifications tab at /account/notifications (My Account → Notifications) → NotificationsTab.tsx rendering EmailPreferencesSection.tsx. The member 403 on GET/PUT /api/email-preferences is fixed (user?.memberId). ⚠️ Known field-name mismatch: the backend persists paymentReminders, eventReminders, membershipUpdates, broadcasts, unsubscribedAll, but the UI's 5 toggles are Payment Reminders / Event Reminders / Membership Alerts (membershipAlerts) / Newsletter (newsletterEmails) / Marketing Emails (marketingEmails) — only the first two map to backend columns, so the latter three likely won't persist. Test it: toggle all 5, save, reload, and flag any that don't stick. The steps below predate the tab — the navigation path is now the Notifications tab, not Profile; treat exact selectors loosely.

Module: Communications - Email Preferences

Priority: P2

Phase: 4

Backend Endpoints:

Frontend Page: Member Portal - Email Preferences Settings

Prerequisites

Test Data

MemberEmailMarketingEventsPaymentsNewsletterMembership
MEM-001john@example.comtruetruetruetruetrue
MEM-002jane@example.comfalsetruetruefalsetrue
MEM-003bob@example.comfalsefalsetruefalsefalse

Test Cases

TC-COMM-PREF-001: View Current Email Preferences

StepActionExpected Result
1Login as member MEM-001.Dashboard displayed.
2Navigate to Profile > Email Preferences.Email preferences page displayed.
3Verify all preference categories visible.Marketing, Events, Payments, Newsletter, Membership Alerts.
4Verify current values.All toggles reflect database values (all enabled for MEM-001).
5Verify API call.GET /api/email-preferences returns current preferences.

TC-COMM-PREF-002: Toggle Marketing Emails Off

StepActionExpected Result
1Login as member MEM-001.Dashboard displayed.
2Navigate to Profile > Email Preferences.Preferences page displayed.
3Toggle "Marketing Emails" to OFF.Toggle switches to off state.
4Click "Save Preferences".API PUT /api/email-preferences called.
5Verify success message."Preferences updated" message displayed.
6Refresh page.marketingEmails shows as false.
7Verify database.marketingEmails field is false.

TC-COMM-PREF-003: Toggle Event Reminders Off

StepActionExpected Result
1Login as member.-
2Navigate to Email Preferences.-
3Toggle "Event Reminders" to OFF.Toggle switches to off state.
4Save preferences.API PUT /api/email-preferences called.
5Verify update persisted.eventReminders shows as false.

TC-COMM-PREF-004: Toggle Newsletter Emails Off

StepActionExpected Result
1Login as member.-
2Navigate to Email Preferences.-
3Toggle "Newsletter Emails" to OFF.Toggle switches to off state.
4Save preferences.API PUT /api/email-preferences called.
5Verify update persisted.newsletterEmails shows as false.

TC-COMM-PREF-005: Toggle Membership Alerts Off

StepActionExpected Result
1Login as member.-
2Navigate to Email Preferences.-
3Toggle "Membership Alerts" to OFF.Toggle switches to off state.
4Save preferences.API PUT /api/email-preferences called.
5Verify update persisted.membershipAlerts shows as false.

TC-COMM-PREF-006: Toggle All Preferences Off

StepActionExpected Result
1Login as member with all preferences ON.-
2Navigate to Email Preferences.All toggles in ON state.
3Toggle all categories to OFF.All toggles switch to off state.
4Save preferences.All preferences updated except paymentReminders if protected.
5Verify each category.All optional categories are false.

TC-COMM-PREF-007: Toggle All Preferences On

StepActionExpected Result
1Login as member MEM-003 with preferences OFF.-
2Navigate to Email Preferences.Most toggles in OFF state.
3Toggle all categories to ON.All toggles switch to on state.
4Save preferences.All preferences updated.
5Verify each category.All categories are true.

TC-COMM-PREF-008: Payment Reminders Cannot Be Disabled (Transactional)

StepActionExpected Result
1Login as member.-
2Navigate to Email Preferences.Preferences page displayed.
3Locate "Payment Reminders" toggle.Toggle visible.
4Verify toggle is disabled/locked.Cannot toggle off OR warning displayed.
5Attempt via API to set paymentReminders: false.Request ignored or returns warning.
6Verify database.paymentReminders remains true.

TC-COMM-PREF-009: Transactional Email Always Sent (Payment Reminder)

StepActionExpected Result
1Setup: Member with all email preferences OFF except payments.-
2Create overdue invoice for member.Invoice in OVERDUE status.
3Trigger payment reminder email.System sends payment reminder.
4Check member's inbox.Payment reminder email received.
5Verify email category.Email marked as transactional.

TC-COMM-PREF-010: Marketing Email Respects Preference (Opted Out)

StepActionExpected Result
1Login as member MEM-002 (marketingEmails: false).-
2Admin creates marketing broadcast.Broadcast targeting all members.
3Admin sends broadcast.Broadcast sent.
4Check MEM-002 inbox.No marketing email received.
5Verify send log.MEM-002 excluded due to preference.

TC-COMM-PREF-011: Marketing Email Respects Preference (Opted In)

StepActionExpected Result
1Ensure member MEM-001 has marketingEmails: true.-
2Admin creates marketing broadcast.Broadcast targeting all members.
3Admin sends broadcast.Broadcast sent.
4Check MEM-001 inbox.Marketing email received.
5Verify content.Email content matches broadcast.

TC-COMM-PREF-012: Event Reminder Respects Preference

StepActionExpected Result
1Member MEM-003 has eventReminders: false.-
2Register MEM-003 for upcoming event.Registration confirmed.
3Trigger event reminder (day before).System processes reminders.
4Check MEM-003 inbox.No event reminder received.
5Verify other registrants.Members with preference ON receive reminder.

TC-COMM-PREF-013: Newsletter Respects Preference

StepActionExpected Result
1Member MEM-002 has newsletterEmails: false.-
2Admin sends newsletter broadcast.Newsletter sent.
3Check MEM-002 inbox.No newsletter received.
4Check MEM-001 inbox (newsletter: true).Newsletter received.

TC-COMM-PREF-014: Membership Alert Respects Preference

StepActionExpected Result
1Member MEM-003 has membershipAlerts: false.-
2Change MEM-003 membership tier.Membership updated.
3Check MEM-003 inbox.No membership alert received.
4Perform same for member with alerts ON.Membership alert received.

TC-COMM-PREF-015: Preference Persistence - Session Logout

StepActionExpected Result
1Login as member.-
2Set marketingEmails to false.Preference saved.
3Logout.Session ended.
4Login again.New session started.
5Navigate to Email Preferences.marketingEmails still false.
6Verify all other preferences.All settings persist.

TC-COMM-PREF-016: Preference Persistence - Different Device

StepActionExpected Result
1Login on Device A.-
2Update preferences (turn off newsletters).Preference saved.
3Login on Device B (different browser/device).New session.
4Navigate to Email Preferences.Shows same preferences as Device A.
5Verify newsletters is OFF.Preference persisted across devices.

TC-COMM-PREF-017: Preference Persistence - Clear Browser Data

StepActionExpected Result
1Login as member.-
2Update email preferences.Changes saved.
3Clear browser cache and cookies.Local data cleared.
4Login again.Fresh session.
5Check preferences.Server-stored preferences intact.

TC-COMM-PREF-018: Unsubscribe via Email Link

StepActionExpected Result
1Send broadcast to member.Email received.
2Click "Unsubscribe" link in email footer.Unsubscribe page displayed.
3Select category to unsubscribe from.Category selection available.
4Confirm unsubscribe.API POST /api/unsubscribe called.
5Verify success message."You have been unsubscribed" displayed.
6Login and check preferences.Selected category now OFF.
7Verify unsubscribedAt.Timestamp recorded in database.

TC-COMM-PREF-019: Unsubscribe from All (One-Click)

StepActionExpected Result
1Click unsubscribe link in email.Unsubscribe page displayed.
2Select "Unsubscribe from all".Option selected.
3Confirm.All optional categories disabled.
4Verify payment reminders.Payment reminders still enabled (transactional).
5Verify unsubscribeReason.Recorded in database.

TC-COMM-PREF-020: Resubscribe After Unsubscribe

StepActionExpected Result
1Member previously unsubscribed from marketing.marketingEmails: false.
2Navigate to Email Preferences.Preferences page displayed.
3Toggle marketing back to ON.Toggle switches to on state.
4Save preferences.Preferences updated.
5Verify resubscription.marketingEmails: true.
6Receive next marketing email.Email received successfully.

TC-COMM-PREF-021: Resubscribe via Token Link

StepActionExpected Result
1Member clicks resubscribe link (if sent).Resubscribe page displayed.
2Confirm resubscription.API POST /api/resubscribe called.
3Verify success message."You have been resubscribed" displayed.
4Check preferences.Selected category now ON.

TC-COMM-PREF-022: Invalid Unsubscribe Token

StepActionExpected Result
1Access unsubscribe URL with invalid token.Page loads.
2Attempt to unsubscribe.Error message displayed.
3Verify no changes.Preferences unchanged.
4Verify API response.400 Bad Request - "Invalid token".

TC-COMM-PREF-023: Expired Unsubscribe Token

StepActionExpected Result
1Use unsubscribe link from old email (>30 days).-
2Attempt to unsubscribe.Token expired message.
3Prompt to login.Login link provided.
4Login and manage preferences.Full preferences page accessible.

TC-COMM-PREF-024: Concurrent Preference Updates

StepActionExpected Result
1Open preferences in two browser tabs.Same preferences displayed.
2Tab 1: Toggle marketing OFF, save.Saved successfully.
3Tab 2: Toggle newsletter OFF, save (without refresh).Saved successfully.
4Refresh both tabs.Both changes persisted.
5Verify final state.marketing: false, newsletter: false.

TC-COMM-PREF-025: Preferences UI Accessibility

StepActionExpected Result
1Navigate to Email Preferences.Page displayed.
2Verify keyboard navigation.Can tab through all toggles.
3Verify ARIA labels.Toggle descriptions read by screen reader.
4Verify contrast.Meets WCAG 2.1 AA standards.
5Verify save with keyboard.Enter/Space activates save button.

API Test Cases

TC-COMM-PREF-API-001: GET /api/email-preferences

Expected Response: 200 OK

{

"id": "pref_abc123",

"memberId": "MEM-001",

"marketingEmails": true,

"eventReminders": true,

"paymentReminders": true,

"newsletterEmails": true,

"membershipAlerts": true,

"unsubscribedAt": null,

"unsubscribeReason": null

}

TC-COMM-PREF-API-002: GET /api/email-preferences (Unauthenticated)

Expected Response: 401 Unauthorized

{

"error": "Authentication required"

}

TC-COMM-PREF-API-003: PUT /api/email-preferences (Update Single)

Request:

{

"marketingEmails": false

}

Expected Response: 200 OK

{

"id": "pref_abc123",

"memberId": "MEM-001",

"marketingEmails": false,

"eventReminders": true,

"paymentReminders": true,

"newsletterEmails": true,

"membershipAlerts": true

}

TC-COMM-PREF-API-004: PUT /api/email-preferences (Update Multiple)

Request:

{

"marketingEmails": false,

"eventReminders": false,

"newsletterEmails": false

}

Expected Response: 200 OK

{

"id": "pref_abc123",

"memberId": "MEM-001",

"marketingEmails": false,

"eventReminders": false,

"paymentReminders": true,

"newsletterEmails": false,

"membershipAlerts": true

}

TC-COMM-PREF-API-005: PUT /api/email-preferences (Attempt to Disable Payment Reminders)

Request:

{

"paymentReminders": false

}

Expected Response: 200 OK (value ignored)

{

"id": "pref_abc123",

"memberId": "MEM-001",

"paymentReminders": true,

"warning": "Payment reminders cannot be disabled"

}

TC-COMM-PREF-API-006: POST /api/unsubscribe

Request:

{

"token": "valid_unsubscribe_token",

"category": "broadcasts"

}

Expected Response: 200 OK

{

"success": true,

"category": "broadcasts",

"message": "Successfully unsubscribed from broadcasts"

}

TC-COMM-PREF-API-007: POST /api/unsubscribe (Invalid Token)

Request:

{

"token": "invalid_token",

"category": "broadcasts"

}

Expected Response: 400 Bad Request

{

"error": "Invalid or expired unsubscribe token"

}

TC-COMM-PREF-API-008: POST /api/resubscribe

Request:

{

"token": "valid_resubscribe_token",

"category": "broadcasts"

}

Expected Response: 200 OK

{

"success": true,

"category": "broadcasts",

"message": "Successfully resubscribed to broadcasts"

}

TC-COMM-PREF-API-009: PUT /api/email-preferences (Invalid Field)

Request:

{

"unknownField": true

}

Expected Response: 400 Bad Request

{

"error": "Invalid preference field: unknownField"

}

TC-COMM-PREF-API-010: PUT /api/email-preferences (Invalid Value Type)

Request:

{

"marketingEmails": "yes"

}

Expected Response: 400 Bad Request

{

"error": "marketingEmails must be a boolean"

}


Edge Cases

TC-COMM-PREF-EDGE-001: New Member Default Preferences

StepActionExpected Result
1Register new member.Account created.
2Check email preferences record.Record created automatically.
3Verify default values.All preferences true by default.

TC-COMM-PREF-EDGE-002: Member Without Preferences Record

StepActionExpected Result
1Database: Delete preferences record for test member.Record removed.
2Login as that member.-
3Navigate to Email Preferences.Page loads without error.
4Verify behavior.New record created with defaults OR error handled gracefully.

TC-COMM-PREF-EDGE-003: Broadcast to Segment with All Opted-Out

StepActionExpected Result
1Create segment where all members opted out of marketing.-
2Create marketing broadcast for this segment.Broadcast created.
3Attempt to send.Warning: "0 eligible recipients".
4Confirm send anyway.No emails sent, broadcast marked as sent.

TC-COMM-PREF-EDGE-004: Rapid Toggle Changes

StepActionExpected Result
1Navigate to preferences.-
2Rapidly toggle same preference ON/OFF multiple times.UI remains responsive.
3Click save.Final state saved.
4Verify no race conditions.Database reflects last save action.

Security Test Cases

TC-COMM-PREF-SEC-001: Cannot View Other Member's Preferences

StepActionExpected Result
1Login as MEM-001.-
2Attempt to GET /api/email-preferences?memberId=MEM-002.Parameter ignored OR access denied.
3Verify response.Returns MEM-001's preferences only.

TC-COMM-PREF-SEC-002: Cannot Update Other Member's Preferences

StepActionExpected Result
1Login as MEM-001.-
2PUT /api/email-preferences with memberId=MEM-002 in body.Parameter ignored OR access denied.
3Verify MEM-002 preferences.Unchanged.

TC-COMM-PREF-SEC-003: Admin Can View Member Preferences

StepActionExpected Result
1Login as ADMIN.-
2Navigate to member details for MEM-001.Member profile displayed.
3View email preferences section.Preferences visible (read-only for admin).

Notes