Automation
Chatbot Flows
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| AUTO-001 | List all flows | Logged in as Agent, org has 3 active flows | 1. Navigate to /automation?tab=flows 2. Wait for page load | List of 3 flows appears in descending creation order. No error message shown | High |
| AUTO-002 | Create flow with keyword trigger | Logged in as Agent with manage_automations permission, at least one WhatsApp account connected | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' button 3. Enter name "Pricing Flow" 4. Select trigger type "Keyword" 5. Enter keyword "pricing" 6. Click Save | Modal closes. Flow appears in list with status "Draft". Success toast shows "Flow created" | High |
| AUTO-003 | Create flow with intent trigger and examples | Logged in as Agent with manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Support Flow" 4. Select trigger type "Intent (AI)" 5. Select predefined intent "support_request" 6. Enter examples in text area 7. Click Save | Flow created with trigger_intent="support_request" and trigger_intent_examples populated. Flow appears in list | High |
| AUTO-004 | Create flow with custom intent | Logged in as Agent with manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Select trigger type "Intent (AI)" 4. Select "Custom Intent" from dropdown 5. Enter intent name "refund_request" 6. Enter examples 7. Click Save | Flow created with custom intent label. List shows the flow | High |
| AUTO-005 | Create flow with new_conversation trigger | Logged in as Agent with manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Welcome Flow" 4. Select trigger type "New Conversation" 5. Click Save | Flow created with trigger_type="new_conversation". No keyword field required or shown | High |
| AUTO-006 | Create flow with new_contact trigger | Logged in as Agent with manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Onboarding Flow" 4. Select trigger type "New Contact" 5. Click Save | Flow created with trigger_type="new_contact" | High |
| AUTO-007 | Create flow with all_messages trigger | Logged in as Agent with manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Catch-All Flow" 4. Select trigger type "All Messages" 5. Click Save | Flow created with trigger_type="all_messages" | High |
| AUTO-008 | Edit flow name and description | Logged in as Agent with manage_automations permission, "Pricing Flow" exists as draft | 1. Navigate to /automation?tab=flows 2. Click "Pricing Flow" row 3. Click Edit button 4. Change name to "Pricing & Plans Flow" 5. Change description to "Handles pricing queries" 6. Click Save | Edit modal closes. Flow list shows updated name. Success toast displays | High |
| AUTO-009 | Edit flow trigger keyword | Logged in as Agent, "Pricing Flow" exists with keyword "pricing" | 1. Navigate to /automation?tab=flows 2. Click "Pricing Flow" 3. Click Edit 4. Change keyword from "pricing" to "price, cost" 5. Click Save | Flow updated. Trigger keyword now accepts multiple comma-separated keywords | High |
| AUTO-010 | Delete flow with confirmation | Logged in as Agent with manage_automations permission, "Test Flow" exists | 1. Navigate to /automation?tab=flows 2. Click trash icon on "Test Flow" row 3. Confirmation modal appears asking "Delete flow 'Test Flow'?" 4. Click "Delete" button | Flow removed from list immediately. Success toast shows "Flow deleted". API returns 204 | High |
| AUTO-011 | Cancel delete operation | Logged in as Agent, "Test Flow" exists | 1. Navigate to /automation?tab=flows 2. Click trash icon 3. Confirmation modal appears 4. Click "Cancel" button | Modal closes without deleting. Flow still in list | Medium |
| AUTO-012 | Open flow builder | Logged in as Agent, "Pricing Flow" exists as draft | 1. Navigate to /automation?tab=flows 2. Click on "Pricing Flow" row (not edit icon) 3. Wait for flow builder to load | Flow builder canvas opens showing trigger node. Flow definition is loaded. Back arrow visible in header | High |
| AUTO-013 | Save flow changes in builder | Logged in as Agent, flow builder is open with a flow | 1. Click on empty canvas to add new Send Message node 2. Enter message text "Hello!" 3. Connect trigger node to message node 4. Click Save button in builder header | Success toast shows "Flow saved". Updated definition persisted. Flow shows as "Active" or "Draft" depending on state | High |
| AUTO-014 | Cannot create flow without manage_automations permission | Logged in as Agent without manage_automations permission | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' button | Button disabled or not visible. No modal opens | Medium |
| AUTO-015 | Cannot edit flow without manage_automations permission | Logged in as Agent without manage_automations permission, flow exists | 1. Navigate to /automation?tab=flows 2. Click flow row 3. Click Edit button | Edit button disabled or not visible. No modal opens | Medium |
| AUTO-016 | Cannot delete flow without manage_automations permission | Logged in as Agent without manage_automations permission | 1. Navigate to /automation?tab=flows 2. Hover over flow row | Trash icon not visible or disabled. Click has no effect | Medium |
| AUTO-017 | Create flow with specific WhatsApp account | Logged in as Agent, 2 WhatsApp accounts connected | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Account-Specific Flow" 4. Select trigger type "Keyword" 5. Select first WhatsApp account from dropdown 6. Enter keyword 7. Click Save | Flow created with whatsapp_account_id set to selected account. Shown in account filter if present | High |
| AUTO-018 | Create flow for all WhatsApp accounts | Logged in as Agent, multiple accounts connected | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Leave WhatsApp account selection empty or select "All Accounts" 4. Enter required fields 5. Click Save | Flow created with whatsapp_account_id=null. Flow triggers on any connected account | High |
| AUTO-019 | Missing required field - flow name | Logged in as Agent | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Leave name empty 4. Click Save | Error text appears under name field: "Name is required". Save button disabled. Modal stays open | Medium |
| AUTO-020 | Missing required field - trigger type and keyword | Logged in as Agent | 1. Navigate to /automation?tab=flows 2. Click 'New Flow' 3. Enter name "Test" 4. Leave trigger_type as "Keyword" but leave keyword empty 5. Click Save | Error text: "Keyword is required for keyword trigger". Save button disabled | Medium |
| AUTO-021 | Flow list empty state | Logged in as Agent, no flows exist | 1. Navigate to /automation?tab=flows | Empty state message: "No flows yet. Create your first flow to get started." Create button visible | Medium |
| AUTO-022 | Flow list search/filter (future enhancement) | Logged in as Agent, 5 flows exist | 1. Navigate to /automation?tab=flows 2. Observe list | Flows displayed in reverse creation order (newest first). No search box present currently | Low |
| AUTO-023 | Activate/deactivate flow toggle | Logged in as Agent, "Pricing Flow" exists as draft | 1. Navigate to /automation?tab=flows 2. Locate "Pricing Flow" row 3. Click toggle or "Activate" button | Flow status changes to "Active". Toggle state reflected in list. Success toast: "Flow activated" | Medium |
| AUTO-024 | Deactivate active flow | Logged in as Agent, "Pricing Flow" is active | 1. Navigate to /automation?tab=flows 2. Click toggle/deactivate button on "Pricing Flow" | Flow status changes to "Inactive". Toggle reflected. Success toast: "Flow deactivated" | Medium |
| AUTO-101 | Parse WhatsApp Flow response and spread fields as session variables | Logged in as Agent, flow is running with a WhatsApp Flows node that collects user input | 1. Open flow builder for active flow 2. Add "WhatsApp Flows" node that uses a flow returning JSON response like {"name": "John", "email": "john@example.com"} 3. User completes flow in WhatsApp and response is received 4. Observe subsequent message nodes in the flow | Parser extracts JSON fields. Each field (name, email) is stored as a top-level session variable accessible via {{name}}, {{email}}. Reserved keys (flow_token, version, screen, action, source) excluded from top-level spread | High |
| AUTO-102 | WhatsApp Flows response parsing with reserved metadata keys | Logged in as Agent, flow awaits Flows response with metadata | 1. Open flow builder 2. Add WhatsApp Flows node 3. User completes flow returning {"flow_token": "token123", "version": "1.0", "screen": "final", "action": "submit", "source": "user", "order_id": "ORD-123"} 4. Message node after Flows node uses {{order_id}} | Parser extracts all fields. Reserved keys (flow_token, version, screen, action, source) stored but NOT spread to top-level session. Only custom field (order_id) available as top-level variable. {{order_id}} resolves to "ORD-123" | High |
| AUTO-103 | Empty or missing WhatsApp Flows response | Logged in as Agent, flow awaits Flows response | 1. Open flow builder 2. Add WhatsApp Flows node 3. User closes flow without completing or response is empty object {} 4. Next node attempts to access parsed variables | Parser handles empty response gracefully. No session variables created from response. Following nodes can still execute without error | Medium |
| AUTO-104 | Malformed JSON in WhatsApp Flows response | Logged in as Agent, flow awaits malformed response | 1. Open flow builder 2. Add WhatsApp Flows node that receives malformed JSON 3. Observe flow execution | Fallback behavior: parsed set to empty dict {}. Session data updated but no variables extracted. Error logged. Flow continues without crashing | Medium |
| AUTO-105 | Session variables initialized with contact data | Logged in as Agent, flow starts with a contact | 1. Navigate to /automation?tab=flows 2. Open active flow in builder 3. Start a conversation that triggers this flow 4. Observe first node's available session variables | Session is seeded with contact_id, contact_phone, contact_name, contact_email, contact_tags from the contact record. Variables accessible via {{contact_name}}, {{contact_email}}, etc. in any message node | High |
| AUTO-106 | Contact session variables with missing contact fields | Logged in as Agent, contact exists with phone only (no name, email) | 1. Start flow for contact with minimal data 2. In first message node, use {{contact_name}} and {{contact_email}} | contact_name resolves to empty string "". contact_email resolves to empty string "". contact_tags resolves to empty string "". Flow continues without error | Medium |
| AUTO-107 | Contact tags seeded as comma-separated string | Logged in as Agent, contact exists with tags ["VIP", "Support"] | 1. Start flow for this contact 2. Use {{contact_tags}} in a message node | contact_tags resolves to "VIP, Support" (comma and space separated string). Tags are accessible as single variable | Medium |
Create Contact Node
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| AUTO-108 | Add create_contact node to flow | Logged in as Agent, flow builder is open | 1. Open flow builder for a draft flow 2. Click on empty canvas area 3. Select node type dropdown 4. Select "Create Contact" 5. Click to place node on canvas | Create Contact node appears on canvas with default configuration. Node has two output handles: "success" and "error" | High |
| AUTO-109 | Configure create_contact node with phone session variable | Logged in as Agent, flow builder open with create_contact node | 1. Click on create_contact node to open config panel 2. In "Phone session key" field, enter "phone" 3. Leave other fields empty 4. Click Save | Node config persists. phone_session_key="phone" stored | High |
| AUTO-110 | Configure create_contact node with name session variable | Logged in as Agent, create_contact node in builder | 1. Click node to open config panel 2. In "Name session key" field, enter "user_name" 3. Click Save | Node stores name_session_key="user_name" | Medium |
| AUTO-111 | Configure create_contact node with email session variable | Logged in as Agent, create_contact node in builder | 1. Click node 2. Enter "user_email" in "Email session key" field 3. Click Save | Node stores email_session_key="user_email" | Medium |
| AUTO-112 | Configure create_contact node with tags session variable | Logged in as Agent, create_contact node in builder | 1. Click node 2. Enter "user_tags" in "Tags session key" field 3. Click Save | Node stores tags_session_key="user_tags". Tags can be comma-separated string or JSON array string | Medium |
| AUTO-113 | Configure create_contact node output variable | Logged in as Agent, create_contact node in builder | 1. Click node 2. In "Output Contact ID key" field, enter "created_contact_id" 3. Click Save | Node stores output_contact_id_key="created_contact_id". On success, new contact's ID stored in session as this key | Medium |
| AUTO-114 | Configure merge_on_duplicate setting | Logged in as Agent, create_contact node in builder | 1. Click node to open config 2. Check "Merge on duplicate phone" toggle 3. Click Save | Node stores merge_on_duplicate=true. If phone exists, contact is updated instead of error | High |
| AUTO-115 | Configure contact assignment to user | Logged in as Agent, create_contact node in builder | 1. Click node 2. Select "Assign to User" from assignment dropdown 3. Select a user from the list 4. Click Save | Node stores contact_assignment_mode="user" and assigned_user_id. Created contact assigned to selected user | High |
| AUTO-116 | Configure contact assignment to team | Logged in as Agent, create_contact node in builder | 1. Click node 2. Select "Assign to Team" from assignment dropdown 3. Select a team from the list 4. Click Save | Node stores contact_assignment_mode="team" and assigned_team_id. Created contact assigned to team | Medium |
| AUTO-117 | Configure contact assignment to conversation agent | Logged in as Agent, create_contact node in builder | 1. Click node 2. Select "Assign to Conversation Agent" from assignment dropdown 3. Click Save | Node stores contact_assignment_mode="conversation_agent". Created contact assigned to whoever is assigned to current conversation | Medium |
| AUTO-118 | Create contact node success path | Logged in as Agent, flow running with create_contact node | 1. Flow receives WhatsApp message with phone number in phone session key 2. Create contact node executes with valid phone and merge_on_duplicate=false 3. New contact created successfully 4. Flow connects success output to next message node | Contact created with provided phone, name, email, tags. output_contact_id_key populated with new ID. Flow advances via success path | High |
| AUTO-119 | Create contact node missing phone error | Logged in as Agent, flow running with create_contact node | 1. Flow receives message but phone session key is empty or missing 2. Create contact node executes | Node logs warning "create_contact_missing_phone". Flow advances via error path (if connected) | High |
| AUTO-120 | Create contact node duplicate phone without merge | Logged in as Agent, contact with phone "+1234567890" exists, create_contact node with merge_on_duplicate=false | 1. Flow attempts to create contact with existing phone 2. Node executes | ValueError raised. Node logs "create_contact_duplicate_phone". Flow advances via error path | High |
| AUTO-121 | Create contact node merge on duplicate | Logged in as Agent, contact "+1234567890" exists with name "John", merge_on_duplicate=true | 1. Flow receives new data: phone="+1234567890", name="Jonathan", tags=["Premium"] 2. Create contact node executes with merge_on_duplicate=true | Existing contact updated. Name changed to "Jonathan" (only if contact had no name before, or updated if configured). Tags merged: ["Premium", ...existing tags]. output_contact_id_key set to existing ID. Flow advances via success | High |
| AUTO-122 | Create contact node with tags parsing from comma-separated string | Logged in as Agent, session contains tags_key="Premium, VIP, Support" | 1. Create contact node configured with tags_session_key="tags_key" 2. Node executes | Tags parsed as ["Premium", "VIP", "Support"] (whitespace trimmed). Contact created with these tags | Medium |
| AUTO-123 | Create contact node with tags parsing from JSON array | Logged in as Agent, session contains tags_key='["Early", "Adopter"]' | 1. Create contact node with tags_session_key="tags_key" 2. Node executes | Tags parsed as ["Early", "Adopter"] from JSON array. Contact created with these tags | Medium |
| AUTO-124 | Create contact node with empty tags | Logged in as Agent, tags_session_key points to empty string or missing key | 1. Create contact node with tags_session_key set 2. Node executes with valid phone | Contact created with no tags. Empty tag list handled gracefully | Medium |
| AUTO-125 | Create contact node assignment to user succeeds | Logged in as Agent, create_contact node with contact_assignment_mode="user", assigned_user_id set | 1. Create contact node executes successfully 2. New contact is created | Contact created and immediately assigned to specified user. Assignment visible in contact detail view | High |
| AUTO-126 | Create contact node assignment to conversation agent | Logged in as Agent, conversation assigned to User "Alice", create_contact node with mode="conversation_agent" | 1. Create contact node executes in this conversation context 2. New contact created | Contact assigned to "Alice" (conversation's assigned user). Assignment copied from conversation context | Medium |
| AUTO-127 | Create contact node assignment with invalid UUID | Logged in as Agent, create_contact node with contact_assignment_mode="user" but assigned_user_id is invalid format | 1. Create contact node executes 2. Invalid UUID cannot be parsed | Warning logged "create_contact_assignment_invalid_user_id". Contact created but assignment skipped. Flow continues | Medium |
| AUTO-128 | Create contact node assignment mode none | Logged in as Agent, contact_assignment_mode="none" | 1. Create contact node executes and creates contact | Contact created with no assignment. Not assigned to user or team | Medium |
| AUTO-129 | Create contact normalizes phone number | Logged in as Agent, phone_session_key contains "+1 (234) 567-8900" | 1. Create contact node executes with this phone value | Phone normalized via conversation_service.normalize_phone(). Variations like spaces, dashes, parentheses standardized | Medium |
| AUTO-130 | Create contact skips phone normalization if empty | Logged in as Agent, phone_session_key is empty string after strip() | 1. Create contact node executes | Phone treated as empty. Error path triggered. No contact created | Medium |
| AUTO-131 | Create contact name field optional | Logged in as Agent, name_session_key set but not populated in session | 1. Create contact node with name_session_key but session has no value or empty string 2. Phone is valid 3. Node executes | Contact created with name=None (no name set). Email and tags applied if provided. Flow continues on success | Medium |
| AUTO-132 | Create contact email field optional | Logged in as Agent, email_session_key set but session has no value | 1. Create contact node executes with valid phone, no email 2. Node executes | Contact created with email=None. Other fields applied. Flow continues | Medium |
| AUTO-133 | Create contact exception handling | Logged in as Agent, database error or unexpected exception occurs during contact creation | 1. Create contact node executes 2. Unhandled exception raised in contact_service.create_contact() | Exception logged. Error path triggered. Flow continues on error. User not impacted | Medium |
| AUTO-134 | Create contact output variable populated on success | Logged in as Agent, output_contact_id_key="new_cid", contact created successfully | 1. Create contact node executes 2. Contact created with ID "12345678-abcd-..." 3. Subsequent node uses {{new_cid}} | Session variable new_cid set to string UUID of created contact. Subsequent nodes can access via {{new_cid}} | High |
| AUTO-135 | Create contact output variable not set on error | Logged in as Agent, output_contact_id_key="new_cid", phone is invalid/missing | 1. Create contact node executes 2. Error path triggered | Session variable new_cid NOT set. Flow advances via error path | Medium |
| AUTO-136 | Configure mark_as_lead setting on create_contact node | Logged in as Agent, create_contact node in builder | 1. Click create_contact node to open config panel 2. Locate "Mark as Lead" checkbox 3. Check the checkbox 4. Click Save | Node config persists. mark_as_lead=true stored | High |
| AUTO-137 | Create contact with mark_as_lead enabled | Logged in as Agent, flow running with create_contact node where mark_as_lead=true | 1. Flow receives WhatsApp message with phone number 2. Create contact node executes with valid phone and mark_as_lead=true 3. New contact created successfully | Contact created with phone, name, email, tags. Contact automatically marked as lead. Lead record created with source="chatbot". "lead" tag added to contact tags. System logs "create_contact_mark_as_lead" | High |
| AUTO-138 | Create contact with mark_as_lead disabled | Logged in as Agent, flow running with create_contact node where mark_as_lead=false | 1. Flow receives message with valid phone 2. Create contact node executes with mark_as_lead=false or unchecked | Contact created without lead record. No "lead" tag automatically added. Contact treated as regular contact | High |
| AUTO-139 | Mark as lead on duplicate contact merge | Logged in as Agent, existing contact without "lead" tag, create_contact node with merge_on_duplicate=true and mark_as_lead=true | 1. Flow attempts to create contact with existing phone 2. Create contact node executes with merge_on_duplicate=true and mark_as_lead=true | Existing contact merged with new data. If contact is not already tagged as "lead", "lead" tag added. Lead record created for contact if not already a lead. Flow advances via success | High |
| AUTO-140 | Mark as lead on duplicate with existing lead tag | Logged in as Agent, existing contact already tagged as "lead", create_contact node with merge_on_duplicate=true and mark_as_lead=true | 1. Flow attempts to create contact with existing phone and existing lead tag 2. Create contact node executes | Contact updated with merge. No duplicate "lead" tag added (idempotent). Lead record already exists. Flow advances via success | Medium |
| AUTO-141 | Flow simulation shows mark_as_lead note | Logged in as Agent, flow builder is open with create_contact node configured with mark_as_lead=true | 1. Open flow builder with create_contact node 2. Click Simulate or Preview button 3. Observe simulation panel or builder UI showing node details | Node configuration description or simulation notes include "; mark as lead" text indicating the option is enabled | Medium |
| AUTO-142 | Create contact node with mark_as_lead syncs lead assignees to contact | Logged in as Agent, create_contact node with mark_as_lead=true, assigned_user_id="user-123" | 1. Flow receives message with valid phone 2. Create contact node executes with mark_as_lead=true and contact assigned to user-123 | Contact created and assigned to user-123. Lead record created for contact. Lead's assigned_user_id synchronized to user-123. sync_assignees flag set to true on lead upsert | High |
| AUTO-143 | Create contact node with mark_as_lead syncs team assignees to lead | Logged in as Agent, create_contact node with mark_as_lead=true, assigned_team_id="team-456" | 1. Flow receives message with valid phone 2. Create contact node executes with mark_as_lead=true and contact assigned to team-456 | Contact created and assigned to team-456. Lead record created for contact. Lead's assigned_team_id synchronized to team-456. sync_assignees flag set to true on lead upsert | High |
| AUTO-144 | Create contact node with mark_as_lead and no assignment | Logged in as Agent, create_contact node with mark_as_lead=true, contact_assignment_mode="none" | 1. Flow receives message with valid phone 2. Create contact node executes with mark_as_lead=true but no assignment configured | Contact created with no assignment. Lead record created. sync_assignees flag set to false. Lead has no assignee sync | Medium |
| AUTO-145 | Create contact node mark_as_lead updates existing lead assignees on merge | Logged in as Agent, existing contact already a lead assigned to user-A, create_contact node with mark_as_lead=true and assigned_user_id="user-B" | 1. Flow attempts to create contact with existing phone 2. Create contact node executes with merge_on_duplicate=true and mark_as_lead=true with new assignment to user-B | Contact merged. Lead record exists and updated. Lead's assigned_user_id changed from user-A to user-B via sync_assignees=true. User sees updated assignment in lead detail | High |
Keyword Rules
| ID | Test Case | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| AUTO-025 | List all keyword rules | Logged in as Agent, org has 4 keyword rules | 1. Navigate to /automation?tab=keywords | List of 4 rules appears. Each row shows keyword, response type, priority, status toggle | High |
| AUTO-026 | Create keyword rule with text response | Logged in as Agent, at least one WhatsApp account | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "hello" 4. Select match type "Exact" 5. Select response type "Text" 6. Enter response text "Hi there!" 7. Click Save | Rule created and appears in list. Success toast: "Rule created". Rule ID generated | High |
| AUTO-027 | Create keyword rule with multiple keywords | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword field: "help, support, assist" 4. Select match type "Exact" 5. Enter text response 6. Click Save | Rule created. Keyword field normalized to "help, support, assist". All three keywords trigger this rule | High |
| AUTO-028 | Create keyword rule with contains match type | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "promo" 4. Select match type "Contains" 5. Enter response 6. Click Save | Rule created with match_type="contains". Any message containing "promo" triggers response | High |
| AUTO-029 | Create keyword rule with starts_with match type | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "order" 4. Select match type "Starts With" 5. Enter response 6. Click Save | Rule created. Messages starting with "order" trigger rule | High |
| AUTO-030 | Create keyword rule with regex match type | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "^(hello\ | hi)\\s" 4. Select match type "Regex" 5. Enter response 6. Click Save | Rule created with regex pattern. Valid regex accepted. Rule applies regex matching |
| AUTO-031 | Create keyword rule with template response | Logged in as Agent, WhatsApp templates exist | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "invoice" 4. Select response type "WhatsApp Template" 5. Select a template from dropdown 6. Click Save | Rule created with response_type="template". Selected template ID stored | High |
| AUTO-032 | Create keyword rule with custom template response | Logged in as Agent, custom templates exist | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "receipt" 4. Select response type "My Template" 5. Search and select a custom template 6. Click Save | Rule created with response_type="custom_template". Custom template ID stored | High |
| AUTO-033 | Set keyword rule priority | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "test" 4. Set priority to 5 5. Enter response 6. Click Save | Rule created with priority=5. Rules with higher priority evaluated first | Medium |
| AUTO-034 | Edit keyword rule | Logged in as Agent, keyword rule "hello" exists | 1. Navigate to /automation?tab=keywords 2. Click "hello" rule row 3. Click Edit 4. Change keyword to "hey" 5. Change response text 6. Click Save | Rule updated. List shows new keyword. Success toast displayed | High |
| AUTO-035 | Delete keyword rule with confirmation | Logged in as Agent, rule "hello" exists | 1. Navigate to /automation?tab=keywords 2. Click trash icon on "hello" rule 3. Confirmation modal appears 4. Click "Delete" | Rule removed from list. Success toast: "Rule deleted" | High |
| AUTO-036 | Cancel delete keyword rule | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click trash icon 3. Confirmation modal appears 4. Click "Cancel" | Modal closes. Rule remains in list | Medium |
| AUTO-037 | Duplicate keyword validation | Logged in as Agent, rule with keyword "hello" exists | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "hello, hello" 4. Click Save | Error shown: "Duplicate keyword found: 'hello'". Save button disabled. Modal stays open | Medium |
| AUTO-038 | Empty keyword input validation | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Leave keyword empty 4. Click Save | Error: "Please add at least one non-empty keyword." Save disabled | Medium |
| AUTO-039 | Whitespace-only keyword validation | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword " , , " 4. Click Save | Error: "Please add at least one non-empty keyword." Save disabled | Medium |
| AUTO-040 | Activate/deactivate keyword rule | Logged in as Agent, rule "hello" exists as active | 1. Navigate to /automation?tab=keywords 2. Click toggle on "hello" rule row | Rule status changes to "Inactive". Toggle state reflected. Success toast shown | Medium |
| AUTO-041 | Keyword rule empty list state | Logged in as Agent, no keyword rules exist | 1. Navigate to /automation?tab=keywords | Empty state message displayed: "No keyword rules yet. Create your first rule." Create button visible | Medium |
| AUTO-042 | Keyword rule for specific WhatsApp account | Logged in as Agent, 2 accounts connected | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "hello" 4. Select first account from dropdown 5. Click Save | Rule created with whatsapp_account_id set. Rule only applies to selected account | High |
| AUTO-043 | Keyword rule for all WhatsApp accounts | Logged in as Agent | 1. Navigate to /automation?tab=keywords 2. Click 'New Rule' 3. Enter keyword "hello" 4. Leave account selection empty or select "All Accounts" 5. Click Save | Rule created with whatsapp_account_id=null. Rule applies to all accounts | High |