Conversations
List Conversations
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-001 | Load conversation list on Chat view mount | Logged in as Agent, at least one conversation exists, WebSocket initialized | 1. Navigate to /chat 2. Wait for initial load 3. Observe conversation list | Conversation list displays with all conversations; each row shows contact name, phone, last message, and unread count badge | High |
| CONV-002 | Filter conversations by status "open" | Logged in as Agent, conversations with multiple statuses exist | 1. Click "Open" filter button 2. Observe list update | Only conversations with status "open" display; total count updates | High |
| CONV-003 | Filter conversations by status "pending" | Logged in as Agent, conversations with multiple statuses exist | 1. Click "Pending" filter button 2. Observe list update | Only conversations with status "pending" display | High |
| CONV-004 | Filter conversations by status "resolved" | Logged in as Agent, conversations with multiple statuses exist | 1. Click "Resolved" filter button 2. Observe list update | Only conversations with status "resolved" display | High |
| CONV-005 | Filter conversations assigned to current user | Logged in as Agent, conversations assigned to self and others exist | 1. Click "Mine" filter button 2. Observe list update | Only conversations assigned to logged-in user display | High |
| CONV-006 | Filter conversations unassigned | Logged in as Agent, unassigned conversations exist | 1. Click "Unassigned" filter button 2. Observe list update | Only conversations with no assigned_user_id and no assigned_team_id display | High |
| CONV-007 | View all conversations filter | Logged in as Agent, filter applied | 1. Click "All" filter button 2. Observe list update | All conversations in organization display; all statuses shown | High |
| CONV-008 | Search conversations by contact name | Logged in as Agent, conversation with contact name "John Smith" exists | 1. Type "john" in search box 2. Observe list update | Only conversations where contact name contains "john" (case-insensitive) display | High |
| CONV-009 | Search conversations by contact phone | Logged in as Agent, conversation with phone "+1234567890" exists | 1. Type "1234567890" in search box 2. Observe list update | Only conversations where contact phone contains search term display | High |
| CONV-010 | Clear search query | Logged in as Agent, search active with filtered results | 1. Clear search box text 2. Observe list update | All conversations (respecting other active filters) display again | High |
| CONV-011 | Pagination: navigate to page 2 | Logged in as Agent, more than 50 conversations exist | 1. Scroll to bottom of list 2. Click page 2 or next button 3. Observe new set of conversations | Page 2 conversations load; total count remains accurate | Medium |
| CONV-012 | Pagination: page size limit enforced | Logged in as Agent | 1. Open browser dev tools 2. Attempt to fetch /conversations with page_size=200 | API returns error or caps page_size at 100; UI default is 50 | Low |
| CONV-013 | Conversation list empty state | Logged in as Agent, no conversations exist in organization | 1. Navigate to /chat 2. Observe list area | Empty state message displays (e.g., "No conversations yet") | Medium |
| CONV-014 | Filter by account (WhatsApp account dropdown) | Logged in as Agent, multiple WhatsApp accounts connected, conversations exist for each | 1. Click account dropdown in conversation list header 2. Select specific account 3. Observe list update | Only conversations linked to selected WhatsApp account display | Medium |
| CONV-015 | Account filter resets on "All" selection | Logged in as Agent, account filter active | 1. Click account filter dropdown 2. Select "All" 3. Observe list update | All conversations display regardless of account; filter badge clears | Medium |
Create Conversation
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-016 | Open new conversation dialog | Logged in as Agent, at least one WhatsApp account active | 1. Click "+" or "New Chat" button in conversation list header 2. Observe dialog open | Modal opens with fields: Phone, Name (optional), WhatsApp Account dropdown | High |
| CONV-017 | Create conversation with new contact via phone | Logged in as Agent, one active WhatsApp account exists | 1. Click "New Chat" button 2. Enter phone "+1234567890" 3. Leave Name empty 4. Account auto-selected 5. Click "Create Conversation" 6. Observe result | New conversation created and navigated to; contact created with phone only; conversation appears in list with "unknown" or blank name | High |
| CONV-018 | Create conversation with new contact name and phone | Logged in as Agent, one active WhatsApp account exists | 1. Click "New Chat" button 2. Enter phone "+1234567890" 3. Enter name "John Smith" 4. Click "Create Conversation" | New conversation and contact created; contact displays name "John Smith"; conversation appears in list | High |
| CONV-019 | Create conversation: contact picker from existing contacts | Logged in as Agent, existing contacts "Alice" and "Bob" exist | 1. Click "New Chat" button 2. Click contact picker / search contacts field 3. Type "Alice" 4. Click "Alice" from dropdown 5. Click "Create Conversation" | Conversation opens with Alice; her existing phone and name pre-filled; no duplicate contact created | High |
| CONV-020 | Create conversation: WhatsApp account required | Logged in as Agent, no WhatsApp accounts exist or all inactive | 1. Click "New Chat" button 2. Attempt to create conversation | Error message displays: "Please connect at least one WhatsApp account first" or "WhatsApp account not found or inactive" | High |
| CONV-021 | Create conversation: invalid phone format | Logged in as Agent, one active WhatsApp account exists | 1. Click "New Chat" button 2. Enter phone "invalid-phone" 3. Attempt to create conversation | Error message displays: "Invalid phone number format"; conversation not created | Medium |
| CONV-022 | Create conversation: phone number required | Logged in as Agent, one active WhatsApp account exists | 1. Click "New Chat" button 2. Leave phone empty 3. Click "Create Conversation" | Form validation error shows "Phone is required"; dialog remains open | Medium |
| CONV-023 | Create conversation: duplicate contact phone | Logged in as Agent, contact with phone "+1234567890" already exists | 1. Click "New Chat" button 2. Enter phone "+1234567890" 3. Enter name "Different Name" 4. Click "Create Conversation" | Conversation created linked to existing contact; existing contact's data unchanged (name not updated); no duplicate contact | Medium |
| CONV-024 | Create conversation: account selection single account | Logged in as Agent, only one WhatsApp account active | 1. Click "New Chat" button 2. Observe account field | Account field auto-selected to the single active account or disabled; user cannot change | Medium |
| CONV-025 | Create conversation: account selection multiple accounts | Logged in as Agent, three WhatsApp accounts active | 1. Click "New Chat" button 2. Click account dropdown 3. Select second account | Dropdown shows all active accounts; selection updates form | Medium |
| CONV-026 | Create conversation: inactive account not available | Logged in as Agent, one active account and one inactive account exist | 1. Click "New Chat" button 2. Open account dropdown | Inactive account does not appear in dropdown | Low |
| CONV-027 | Create conversation dialog closes on success | Logged in as Agent, new conversation created successfully | After clicking "Create Conversation" and conversation loads | Dialog closes automatically; user navigated to new conversation's detail view | High |
| CONV-028 | Create conversation dialog cancel button | Logged in as Agent, "New Chat" dialog open with partial form data | 1. Click "Cancel" or X button 2. Observe dialog close | Dialog closes without creating conversation; form data discarded | Medium |
View Conversation Detail & Messages
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-029 | Click conversation in list opens detail | Logged in as Agent, conversation exists | 1. In conversation list, click conversation row for "John" 2. Observe detail panel load | Right panel (ConversationPanel) opens; header shows "John" and phone; messages load; contact info panel visible | High |
| CONV-030 | Conversation detail displays last message preview | Logged in as Agent, conversation with messages exists | In conversation list, observe last_message text in row tooltip or preview | Last message text, sender initials, and timestamp display in conversation row | Medium |
| CONV-031 | URL route updates on conversation selection | Logged in as Agent, conversation selected | 1. Click conversation in list 2. Observe URL | URL changes to /chat/{conversation_id} | High |
| CONV-032 | Back navigation restores conversation list | Logged in as Agent, conversation detail open | 1. Click browser back button or click conversation list area 2. Observe navigation | List view returns; active conversation selection clears or persists depending on route design | Medium |
| CONV-033 | Load messages on conversation open | Logged in as Agent, conversation with 10+ messages exists | 1. Click conversation in list 2. Wait for messages panel to load | Messages load in scrollable area (page 1, up to 50 messages); auto-scroll to bottom | High |
| CONV-034 | Messages display in chronological order | Logged in as Agent, conversation with messages from different timestamps | View messages in conversation detail | Messages display oldest first (top) to newest (bottom) | High |
| CONV-035 | Message bubble shows sender, content, timestamp | Logged in as Agent, message visible in detail | View individual message bubble | Bubble displays: sender name or "You", message content, timestamp (e.g., "2:34 PM"), direction indicator (inbound/outbound) | High |
| CONV-036 | Pagination: load more messages on scroll up | Logged in as Agent, conversation with 100+ messages exists, page 1 visible | 1. Scroll to top of messages 2. Observe pagination | Previous page of messages loads above current; total count updates | Medium |
| CONV-037 | Empty messages state | Logged in as Agent, conversation with no messages | View conversation detail | Message area shows placeholder text: "No messages yet. Send the first message!" | Medium |
| CONV-038 | Mark conversation as read on open | Logged in as Agent, conversation with unread_count > 0 | 1. Click conversation with badge showing unread count 2. Observe detail load | unread_count resets to 0; badge disappears from list row; WebSocket broadcasts update to other users | High |
| CONV-039 | Contact info panel loads contact details | Logged in as Agent, conversation with contact "John Smith" open | 1. View right panel (ContactPanel) 2. Observe contact info | Panel displays: contact name, phone, email (if set), tags, assigned user/team, created_at | High |
| CONV-040 | Contact panel shows other conversations with same contact | Logged in as Agent, contact "John" has 3 conversations total, one open | In contact panel, under "Other conversations" | All other conversations with this contact display as clickable links; can switch between them | Medium |
| CONV-041 | Click other conversation in contact panel switches conversation | Logged in as Agent, contact panel showing other conversations | 1. In contact panel, click another conversation 2. Observe main panel update | Active conversation switches to selected one; messages load; URL updates | Medium |
Conversation Header & Status
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-042 | Conversation header displays contact name and phone | Logged in as Agent, conversation with contact "John +1234567890" open | View conversation header (ConversationHeader) | Header displays: contact name "John", phone formatted as "+1234567890" | High |
| CONV-043 | Conversation status badge displays current status | Logged in as Agent, conversation with status "open" | View conversation header status indicator | Badge displays: "Open" (or appropriate status text: Pending, Resolved, Snoozed) | High |
| CONV-044 | Status icon reflects conversation state | Logged in as Agent, conversation with status "resolved" | View status icon in header | Icon displays checkmark or resolved indicator | Low |
| CONV-045 | Conversation header menu button opens action menu | Logged in as Agent, conversation open | 1. Click "⋮" (more vertical) button in header 2. Observe menu | Dropdown menu opens with actions: Assign, Snooze, Mark as Resolved, etc. | High |
| CONV-046 | Window expires timestamp displays when active | Logged in as Agent, conversation with window_expires_at in future | View conversation header | "Message window active" indicator or timer displays; shows expiration time | Medium |
| CONV-047 | Window expires indication when expired | Logged in as Agent, conversation with window_expires_at in past | View conversation header | "Message window expired" indicator displays; informs user template/window messages may not be available | Medium |
Assign Conversation
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-048 | Open assign menu in conversation header | Logged in as Agent, conversation open | 1. Click header menu ("⋮") 2. Click "Assign" or similar option 3. Observe dialog/dropdown | Assign modal or dropdown opens showing team and user options | High |
| CONV-049 | Assign conversation to team | Logged in as Agent, at least one team exists, conversation unassigned or assigned to user | 1. Open assign menu 2. Click "Teams" or team section 3. Select "Sales Team" 4. Confirm | Conversation updated; assigned_team_id set to "Sales Team"; header shows "Assigned to Sales Team"; list updates | High |
| CONV-050 | Assign conversation to specific user | Logged in as Agent, multiple active users exist, conversation open | 1. Open assign menu 2. Click "Agents" or user section 3. Select "Alice Smith" 4. Confirm | Conversation updated; assigned_user_id set to Alice's ID; header shows "Assigned to Alice Smith"; unread badge clears for other users | High |
| CONV-051 | Self-assign conversation (assign to me) | Logged in as Agent "John", conversation unassigned or assigned to another user | 1. Click "Assign to Me" button or select self from assign menu 2. Confirm | Conversation assigned to John; header shows "Assigned to You"; list highlights as "Mine" | High |
| CONV-052 | Unassign conversation | Logged in as Agent, conversation assigned to a user | 1. Open assign menu 2. Select "Unassign" or deselect current user 3. Confirm | Conversation unassigned; assigned_user_id and assigned_team_id cleared; conversation appears in "Unassigned" filter | High |
| CONV-053 | Cannot assign to inactive user | Logged in as Agent, user "Bob" marked inactive | 1. Open assign menu 2. Search or filter for users 3. Observe list | Inactive user "Bob" does not appear in assignable users list; only active users shown | Medium |
| CONV-054 | Assign menu shows team and user names | Logged in as Agent | 1. Open assign menu 2. Observe dropdown/modal | All active teams and users display with their names; UI clearly distinguishes teams from users | Medium |
| CONV-055 | Assign action broadcasts WebSocket update | Logged in as Agent, second agent in same org viewing same conversation | 1. First agent assigns conversation to second agent 2. Second agent observes their view | Conversation instantly updates for second agent; assignment reflects without page refresh via WebSocket | High |
| CONV-056 | Assign clears previous assignment | Logged in as Agent, conversation assigned to "Alice" | 1. Open assign menu 2. Assign to "Bob" 3. Confirm | Alice's assignment removed; conversation now assigned only to Bob | Medium |
Snooze Conversation
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-057 | Open snooze menu in conversation header | Logged in as Agent, conversation open | 1. Click header menu ("⋮") 2. Click "Snooze" option 3. Observe snooze time options | Snooze menu or modal opens with time options (e.g., 1 hour, 4 hours, Tomorrow, Next Monday) | High |
| CONV-058 | Snooze conversation for 1 hour | Logged in as Agent, conversation open | 1. Open snooze menu 2. Click "1 hour" 3. Observe conversation status | Conversation status changes to "snoozed"; header shows "Snoozed until [time]"; conversation moves out of active view or marked differently | High |
| CONV-059 | Snooze conversation for 4 hours | Logged in as Agent, conversation open | 1. Open snooze menu 2. Click "4 hours" 3. Observe conversation | Conversation marked snoozed; snooze expiry timestamp set to 4 hours from now | High |
| CONV-060 | Snooze conversation until tomorrow | Logged in as Agent, conversation open | 1. Open snooze menu 2. Click "Tomorrow" 3. Observe conversation | Conversation marked snoozed; expiry time set to start of next business day or 9 AM tomorrow | Medium |
| CONV-061 | Custom snooze time via datetime picker | Logged in as Agent, snooze menu open | 1. Click "Custom" or calendar icon 2. Select date and time 3. Click "Snooze" | Conversation snoozed until selected datetime; header displays snooze expiry time | Medium |
| CONV-062 | Snoozed conversations hidden from list | Logged in as Agent, conversation snoozed, filters set to "Open" or "Mine" | View conversation list | Snoozed conversation does not appear in list unless viewing "All" or filtering by "Snoozed" status | High |
| CONV-063 | Unsnoozed conversation reappears in list | Logged in as Agent, conversation snoozed, snooze time expired | 1. Wait for snooze time to expire (or manually mark unsnoozed via API) 2. View conversation list | Conversation reappears in "Open" or appropriate status filter | Medium |
| CONV-064 | Snooze action broadcasts WebSocket update | Logged in as Agent, second agent viewing same conversation list | 1. First agent snoozes a conversation 2. Second agent observes list | Conversation instantly disappears from second agent's view (or marked snoozed) via WebSocket update | High |
Mark as Resolved
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-065 | Mark conversation as resolved | Logged in as Agent, conversation with status "open" | 1. Click header menu ("⋮") 2. Click "Mark as Resolved" 3. Confirm | Conversation status changes to "resolved"; header updates with resolved badge; conversation moves to "Resolved" filter view | High |
| CONV-066 | Resolved conversation disappears from "Open" filter | Logged in as Agent, conversation marked resolved | 1. Filter list to "Open" 2. Observe previous conversation | Resolved conversation no longer appears in "Open" filter; appears in "Resolved" filter | High |
| CONV-067 | Resolved conversation shows in "Resolved" filter | Logged in as Agent, multiple resolved conversations exist | 1. Click "Resolved" filter 2. Observe list | All resolved conversations display with resolved badge | Medium |
| CONV-068 | Resolved status persists on page reload | Logged in as Agent, conversation marked resolved | 1. Mark conversation as resolved 2. Refresh page (F5) 3. Navigate back to conversation | Conversation status still shows "resolved" after reload; data persisted | Medium |
| CONV-069 | Mark as resolved action broadcasts update | Logged in as Agent, second agent viewing conversation | 1. First agent marks conversation resolved 2. Second agent observes | Conversation status instantly updates to "resolved" for second agent via WebSocket | High |
| CONV-070 | Reopen resolved conversation | Logged in as Agent, conversation marked resolved | 1. Click header menu 2. Click "Reopen" or "Mark as Open" 3. Confirm | Conversation status changes back to "open"; header updates; conversation reappears in appropriate filters | Medium |
Send Text Message
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-071 | Open message composer at bottom of conversation | Logged in as Agent, conversation open | View bottom of ConversationPanel | Message input field (MessageComposer) visible with text box and "Send" button | High |
| CONV-072 | Type message in composer | Logged in as Agent, message composer visible | 1. Click text input field 2. Type "Hello, this is a test message" 3. Observe text | Text appears in input field; message length indicator may show character count | High |
| CONV-073 | Send text message successfully | Logged in as Agent, message typed in composer, WhatsApp account active | 1. Type message "Hi John" 2. Click "Send" button 3. Observe message area | Message appears in chat as outbound bubble from user; status shows "sent"; input field clears; message broadcasted via WebSocket to other agents | High |
| CONV-074 | Outbound message displays sender info | Logged in as Agent "Alice", message just sent | View outbound message bubble | Bubble shows: "You" or "Alice", message content, timestamp, sent status (checkmark or "sent") | High |
| CONV-075 | Send message clears composer field | Logged in as Agent, message sent | After clicking "Send" | Composer text field clears and is ready for next message | High |
| CONV-076 | Send empty message validation | Logged in as Agent, message composer visible | 1. Leave text field empty 2. Click "Send" | Error or disabled state; message not sent; validation message shows "Message cannot be empty" | Medium |
| CONV-077 | Send message while WhatsApp account inactive | Logged in as Agent, message typed, WhatsApp account becomes inactive | 1. Type message 2. Deactivate WhatsApp account via settings 3. Click "Send" | Error message displays: "WhatsApp account not active"; message not sent; composer retains text | Medium |
| CONV-078 | Send message contact not found error | Logged in as Agent, conversation contact deleted externally | 1. Type message 2. Click "Send" 3. Observe error | Error displays: "Contact not found"; message not sent | Low |
| CONV-079 | Message status progression: sending → sent → delivered | Logged in as Agent, message sent | Watch message bubble after sending | Message shows: "sending" (spinner), then "sent" (checkmark), then "delivered" (double checkmark) as WhatsApp updates status | High |
| CONV-080 | Message timestamp displays in local timezone | Logged in as Agent in PST, message sent at 2 PM PST | View message timestamp | Timestamp displays "2:00 PM" or similar in user's local timezone | Medium |
| CONV-081 | Long message text wraps in composer | Logged in as Agent, message > 100 characters | 1. Type long message in composer 2. Observe text field | Text wraps to multiple lines in composer; input expands or scrolls | Low |
| CONV-082 | Message delivery failure shows error | Logged in as Agent, invalid phone or WhatsApp API failure | 1. Send message 2. Observe message status | Message shows "failed" status with red icon; error tooltip available (e.g., "Invalid phone format") | Medium |
Send Template Message
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-083 | Open template selector in composer | Logged in as Agent, conversation open, templates created | 1. Click template button or "Templates" tab in composer 2. Observe dropdown/modal | Template selection modal or dropdown opens; list of available templates displays | Medium |
| CONV-084 | Select and send template message | Logged in as Agent, template "Welcome" exists with variables {name} | 1. Open template selector 2. Select "Welcome" template 3. Fill variable "name" with "John" 4. Click "Send" | Template sends with variables filled; message appears in chat as "Welcome, John"; status shows "sent" | Medium |
| CONV-085 | Template message shows in conversation | Logged in as Agent, template sent to contact | View message in conversation detail | Template message displays as outbound bubble; content shows filled variables; type indicates "template" | Medium |
| CONV-086 | Template variable validation required | Logged in as Agent, template with required variable {email} | 1. Open template selector 2. Select template with required var 3. Leave var empty 4. Attempt to send | Error message shows: "Field {email} is required"; send button disabled | Medium |
| CONV-087 | Template send fails if window expired | Logged in as Agent, conversation window_expires_at in past | 1. Attempt to send template message 2. Observe error | Error displays: "Message window expired. Template messages cannot be sent outside the message window." | Medium |
Send Media Message
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-088 | Open media upload in composer | Logged in as Agent, conversation open | 1. Click attachment/media button in composer 2. Observe file dialog | File picker opens; user can select image, video, or document | Medium |
| CONV-089 | Send image message | Logged in as Agent, image file (JPEG) selected | 1. Click attachment button 2. Select image.jpg (100 KB) 3. Click "Send" | Image uploads and sends; appears in conversation as media bubble with thumbnail; status shows "sent" | Medium |
| CONV-090 | Send video message | Logged in as Agent, video file (MP4) selected | 1. Click attachment button 2. Select video.mp4 (5 MB) 3. Click "Send" | Video uploads; appears in conversation as playable media bubble; status shows "sent" | Medium |
| CONV-091 | Send document message | Logged in as Agent, document file (PDF) selected | 1. Click attachment button 2. Select document.pdf 3. Click "Send" | Document uploads; appears as downloadable file bubble in conversation; status shows "sent" | Medium |
| CONV-092 | Media upload shows progress bar | Logged in as Agent, large file (10 MB) uploading | 1. Select large file 2. Observe composer area | Progress bar appears during upload; shows percentage (0-100%); can cancel upload | Medium |
| CONV-093 | Media file size validation | Logged in as Agent, file > 100 MB selected | 1. Attempt to upload oversized file 2. Observe error | Error message displays: "File size exceeds maximum (100 MB)"; upload blocked | Medium |
| CONV-094 | Media file type validation | Logged in as Agent, executable file (.exe) selected | 1. Attempt to upload .exe file 2. Observe error | Error message displays: "File type not allowed"; upload rejected | Low |
Reply to Message
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-095 | Reply to message option in bubble context menu | Logged in as Agent, message visible in conversation | 1. Right-click or long-press on message bubble 2. Observe context menu | Menu appears with "Reply" option; other options may include "Copy", "Delete" | Medium |
| CONV-096 | Click reply option shows reply preview | Logged in as Agent, message context menu open | 1. Click "Reply" option 2. Observe composer | Composer shows a quoted/replied message preview above text input (e.g., "John: Hello" in gray box) | Medium |
| CONV-097 | Send reply with quoted message | Logged in as Agent, replying to message "Hello" from John | 1. Click Reply on John's message 2. Type "Hi back!" 3. Click Send | Message sent with reply_to reference; appears in conversation with quoted message visible; WhatsApp shows as reply thread | Medium |
| CONV-098 | Clear reply and send regular message | Logged in as Agent, reply preview active | 1. Click X on reply preview 2. Type new message 3. Send | Reply context cleared; message sent as regular (non-reply) message | Medium |
Contact Info Panel
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-099 | Contact panel displays contact information | Logged in as Agent, conversation with contact "John Smith" open | View right panel (ContactPanel) | Panel displays: name "John Smith", phone "+1234567890", email (if set), tags, assigned user/team, created_at timestamp | High |
| CONV-100 | Contact panel shows all tags for contact | Logged in as Agent, contact with tags ["VIP", "Sales"] | View contact panel tags section | Tags display as badges: "VIP" and "Sales" | Medium |
| CONV-101 | Contact metadata displays in contact panel | Logged in as Agent, contact with custom metadata {industry: "Tech"} | View contact panel metadata section | Custom fields display (e.g., "Industry: Tech") | Low |
| CONV-102 | Click contact name in panel opens contact edit | Logged in as Agent, contact panel visible | 1. Click contact name "John Smith" or edit icon 2. Observe navigation | Contact detail page opens (/contacts/{id}); contact info form displays | Medium |
| CONV-103 | Contact assigned user shows in panel | Logged in as Agent, contact assigned to "Alice" | View contact panel assignment section | Assigned user displays as "Alice" or with avatar | Medium |
| CONV-104 | Contact assigned team shows in panel | Logged in as Agent, contact assigned to team "Sales" | View contact panel assignment section | Assigned team displays as "Sales" | Medium |
| CONV-105 | Other conversations section in contact panel | Logged in as Agent, contact with 3 total conversations, one active | View "Other Conversations" in contact panel | Lists other 2 conversations with this contact; shows last message preview and timestamp | High |
| CONV-106 | Click other conversation switches active conversation | Logged in as Agent, contact panel showing other conversations | 1. Click another conversation link in panel 2. Observe main panel | Active conversation switches; messages load; URL updates to new conversation_id | High |
| CONV-107 | Contact audit log in panel | Logged in as Agent, contact panel visible | Scroll contact panel to view audit section | Audit log shows historical changes (e.g., "Name updated", "Tag added"), who made changes, and timestamps | Low |
Contact Reminders
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-108 | Display contact reminders in panel | Logged in as Agent, contact with 2 reminders set | View contact panel reminders section | List shows reminders with due date, note, and status (pending/completed) | Medium |
| CONV-109 | Open reminder creation form | Logged in as Agent, contact panel visible | 1. Click "Add Reminder" or "+" in reminders section 2. Observe form | Form appears with fields: due_at (datetime), note (text area); can set reminder for any future date | Medium |
| CONV-110 | Create reminder for contact | Logged in as Agent, reminder form visible | 1. Set due_at to tomorrow at 10 AM 2. Enter note "Follow up on proposal" 3. Click "Save" | Reminder created; appears in reminders list; notification may trigger at due time | Medium |
| CONV-111 | Reminder due notification | Logged in as Agent, reminder due_at time reached | At reminder due time | Browser notification or UI indicator shows "Reminder: Follow up on proposal for John"; sound/badge alert | Low |
Real-time Updates (WebSocket)
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| CONV-112 | Receive inbound message in real-time | Logged in as Agent, conversation open in chat view, external inbound message sent | Contact sends message to WhatsApp number 1. Agent observes chat view | Message appears in conversation instantly without page refresh; WebSocket broadcasts NEW_MESSAGE event; message bubble shows contact's text | High |