111
Total
56
High
49
Medium
6
Low

List Conversations

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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

IDTest CasePreconditionsStepsExpected ResultPriority
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 Send text message with error handling displays user-friendly message Logged in as Agent, service error occurs during send 1. Type message "Test" 2. Click "Send" 3. Service error triggered (e.g., network timeout, database error) Error message displays with structured logging; user sees: "Failed to send message. Please try again later." instead of raw error; operation logged with operation="messages_send_text" High
CONV-080 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-081 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-082 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-083 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

IDTest CasePreconditionsStepsExpected ResultPriority
CONV-084 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-085 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-086 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-087 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-088 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
CONV-089 Send template message with error handling displays user-friendly message Logged in as Agent, service error occurs during template send 1. Select template 2. Fill variables 3. Click "Send" 4. Service error triggered (e.g., invalid template, API failure) Error message displays with structured logging; user sees: "Failed to send template. Please try again later." instead of raw error; operation logged with operation="messages_send_template" High

Send Media Message

IDTest CasePreconditionsStepsExpected ResultPriority
CONV-090 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-091 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-092 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-093 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-094 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-095 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-096 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
CONV-097 Send media message with error handling displays user-friendly message Logged in as Agent, service error occurs during media send 1. Select media file 2. Upload begins 3. Service error triggered (e.g., file storage failure, API error) Error message displays with structured logging; user sees: "Failed to send media. Please try again later." instead of raw error; operation logged with operation="messages_send_media" High

View Conversation Attachments (Media Rendering)

IDTest CasePreconditionsStepsExpected ResultPriority
CONV-098 Display image message with thumbnail Logged in as Agent, conversation with inbound image message View image message in conversation Image displays as clickable thumbnail in message bubble; shows MIME type indicator High
CONV-099 Click image message opens full view Logged in as Agent, image message visible in conversation 1. Click image thumbnail 2. Observe modal/viewer Full-size image opens in lightbox or modal; can close with X or ESC key High
CONV-100 Display video message with play button Logged in as Agent, conversation with inbound video message View video message in conversation Video displays as thumbnail with play icon overlay in message bubble High
CONV-101 Click video message plays media Logged in as Agent, video message visible 1. Click video thumbnail 2. Observe player Video player opens (inline or modal); can play, pause, seek; audio enabled High
CONV-102 Display document message with download icon Logged in as Agent, conversation with inbound PDF message View document message in conversation Document displays as file icon with filename and download button in message bubble High
CONV-103 Click document message downloads file Logged in as Agent, document message visible 1. Click download icon or document bubble 2. Observe browser File downloads to user's default downloads folder with original filename High
CONV-104 Display audio message with play controls Logged in as Agent, conversation with inbound audio message View audio message in conversation Audio displays as play button with duration; no visible waveform required Medium
CONV-105 Click audio message plays recording Logged in as Agent, audio message visible 1. Click play button 2. Observe audio player Audio plays through browser; progress slider shows current playback position Medium
CONV-106 Display sticker message Logged in as Agent, conversation with inbound sticker View sticker in conversation Sticker displays at full size in message bubble; clickable to open full view Medium
CONV-107 Media with data URI scheme renders correctly Logged in as Agent, message with base64-encoded data URI (data:image/jpeg;base64,...) 1. Navigate to /conversations/{id}/messages/{msg_id}/attachment 2. Observe response Endpoint decodes base64 payload and returns image with correct MIME type; Content-Disposition set to "inline" for images Medium
CONV-108 Media with external URL fetches on-demand Logged in as Agent, message with external media_url (e.g., HTTPS) 1. Navigate to /conversations/{id}/messages/{msg_id}/attachment 2. Observe response Endpoint fetches media from external URL; returns content with correct MIME type from upstream response Medium
CONV-109 Media with WhatsApp media_id downloads via API Logged in as Agent, inbound message with media_id from WhatsApp Cloud API 1. Navigate to /conversations/{id}/messages/{msg_id}/attachment 2. Observe response Endpoint calls WhatsApp API to get media URL; downloads media; returns content with proper MIME type Medium
CONV-110 Media attachment endpoint requires message_read permission Logged in as Agent without messages_read permission, valid message ID 1. Navigate to /conversations/{id}/messages/{msg_id}/attachment Endpoint returns 403 Forbidden High
CONV-111 Media attachment for non-media message returns error Logged in as Agent, text message ID used 1. Navigate to /conversations/{id}/messages/{msg_id}/attachment for text message Endpoint returns 400 Bad Request with detail: "Message has no attachment" Medium