feat: Add support for conversation attribute automation conditions in message event (#4518)

Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
Tejaswini Chile
2022-04-21 20:52:23 +05:30
committed by GitHub
parent b082b0e58c
commit 2acb48bbe0
7 changed files with 255 additions and 37 deletions

View File

@@ -10,9 +10,6 @@ describe AutomationRuleListener do
let(:team) { create(:team, account: account) }
let(:user_1) { create(:user, role: 0) }
let(:user_2) { create(:user, role: 0) }
let!(:event) do
Events::Base.new('conversation_status_changed', Time.zone.now, { conversation: conversation })
end
before do
create(:custom_attribute_definition,
@@ -39,7 +36,7 @@ describe AutomationRuleListener do
{ 'action_name' => 'add_label', 'action_params' => %w[support priority_customer] },
{ 'action_name' => 'send_webhook_event', 'action_params' => ['https://www.example.com'] },
{ 'action_name' => 'assign_best_agent', 'action_params' => [user_1.id] },
{ 'action_name' => 'send_email_transcript', 'action_params' => 'new_agent@example.com' },
{ 'action_name' => 'send_email_transcript', 'action_params' => ['new_agent@example.com'] },
{ 'action_name' => 'mute_conversation', 'action_params' => nil },
{ 'action_name' => 'change_status', 'action_params' => ['snoozed'] },
{ 'action_name' => 'send_message', 'action_params' => ['Send this message.'] },
@@ -70,6 +67,12 @@ describe AutomationRuleListener do
attribute_key: 'customer_type',
filter_operator: 'equal_to',
values: ['platinum'],
query_operator: 'AND'
}.with_indifferent_access,
{
attribute_key: 'inbox_id',
filter_operator: 'equal_to',
values: [inbox.id],
query_operator: nil
}.with_indifferent_access
]
@@ -150,6 +153,40 @@ describe AutomationRuleListener do
expect(conversation.team_id).to eq(team.id)
end
end
context 'when inbox condition does not match' do
let!(:inbox_1) { create(:inbox, account: account) }
let!(:event) do
Events::Base.new('conversation_updated', Time.zone.now, { conversation: conversation })
end
before do
automation_rule.update!(
event_name: 'conversation_updated',
name: 'Call actions conversation updated',
description: 'Add labels, assign team after conversation updated',
conditions: [
{
attribute_key: 'inbox_id',
filter_operator: 'equal_to',
values: [inbox_1.id],
query_operator: nil
}.with_indifferent_access
]
)
end
it 'triggers automation rule would not send message to the contacts' do
expect(conversation.messages.count).to eq(0)
expect(conversation.messages).to be_empty
listener.conversation_updated(event)
conversation.reload
expect(conversation.messages.count).to eq(0)
end
end
end
describe '#conversation_updated' do
@@ -305,4 +342,154 @@ describe AutomationRuleListener do
end
end
end
describe '#message_created with conversation and contacts based conditions' do
before do
automation_rule.update!(
event_name: 'message_created',
name: 'Call actions message created',
description: 'Send Message in the conversation',
conditions: [
{ attribute_key: 'team_id', filter_operator: 'equal_to', values: [team.id], query_operator: 'AND' }.with_indifferent_access,
{ attribute_key: 'message_type', filter_operator: 'equal_to', values: ['incoming'], query_operator: 'AND' }.with_indifferent_access,
{ attribute_key: 'email', filter_operator: 'contains', values: ['example.com'], query_operator: 'AND' }.with_indifferent_access,
{ attribute_key: 'company', filter_operator: 'equal_to', values: ['Marvel'], query_operator: nil }.with_indifferent_access
],
actions: [
{ 'action_name' => 'send_message', 'action_params' => ['Send this message.'] },
{ 'action_name' => 'send_email_transcript', 'action_params' => ['new_agent@example.com'] }
]
)
conversation.update!(team_id: team.id)
conversation.contact.update!(email: 'tj@example.com', additional_attributes: { 'company': 'Marvel' })
end
let!(:message) { create(:message, account: account, conversation: conversation, message_type: 'incoming') }
let!(:event) do
Events::Base.new('message_created', Time.zone.now, { conversation: conversation, message: message })
end
context 'when rule matches' do
it 'triggers automation rule send email transcript to the mentioned email' do
mailer = double
automation_rule
listener.message_created(event)
conversation.reload
allow(mailer).to receive(:conversation_transcript)
end
it 'triggers automation rule send message to the contacts' do
expect(conversation.messages.count).to eq(1)
listener.message_created(event)
conversation.reload
expect(conversation.messages.count).to eq(2)
expect(conversation.messages.last.content).to eq('Send this message.')
end
end
context 'when rule does not match' do
before do
conversation.update!(team_id: team.id)
conversation.contact.update!(email: 'tj@ex.com', additional_attributes: { 'company': 'DC' })
end
let!(:message) { create(:message, account: account, conversation: conversation, message_type: 'outgoing') }
let!(:event) do
Events::Base.new('message_created', Time.zone.now, { conversation: conversation, message: message })
end
it 'triggers automation rule but wont send message' do
expect(conversation.messages.count).to eq(1)
listener.message_created(event)
conversation.reload
expect(conversation.messages.count).to eq(1)
expect(conversation.messages.last.content).to eq('Incoming Message')
end
end
end
describe '#conversation_created with contacts based conditions' do
before do
automation_rule.update!(
event_name: 'conversation_created',
name: 'Call actions message created',
description: 'Send Message in the conversation',
conditions: [
{ attribute_key: 'team_id', filter_operator: 'equal_to', values: [team.id], query_operator: 'AND' }.with_indifferent_access,
{ attribute_key: 'email', filter_operator: 'contains', values: ['example.com'], query_operator: 'AND' }.with_indifferent_access,
{ attribute_key: 'company', filter_operator: 'equal_to', values: ['Marvel'], query_operator: nil }.with_indifferent_access
],
actions: [
{ 'action_name' => 'send_message', 'action_params' => ['Send this message.'] },
{ 'action_name' => 'send_email_transcript', 'action_params' => ['new_agent@example.com'] }
]
)
conversation.update!(team_id: team.id)
conversation.contact.update!(email: 'tj@example.com', additional_attributes: { 'company': 'Marvel' })
end
let!(:message) { create(:message, account: account, conversation: conversation, message_type: 'incoming') }
let!(:event) do
Events::Base.new('conversation_created', Time.zone.now, { conversation: conversation, message: message })
end
context 'when rule matches' do
it 'triggers automation rule send email transcript to the mentioned email' do
mailer = double
automation_rule
listener.conversation_created(event)
conversation.reload
allow(mailer).to receive(:conversation_transcript)
end
it 'triggers automation rule send message to the contacts' do
expect(conversation.messages.count).to eq(1)
listener.conversation_created(event)
conversation.reload
expect(conversation.messages.count).to eq(2)
expect(conversation.messages.last.content).to eq('Send this message.')
expect(conversation.messages.last.content_attributes[:automation_rule_id]).to eq(automation_rule.id)
end
end
context 'when rule does not match' do
before do
conversation.update!(team_id: team.id)
conversation.contact.update!(email: 'tj@ex.com', additional_attributes: { 'company': 'DC' })
end
let!(:message) { create(:message, account: account, conversation: conversation, message_type: 'outgoing') }
let!(:event) do
Events::Base.new('conversation_created', Time.zone.now, { conversation: conversation, message: message })
end
it 'triggers automation rule but wont send message' do
expect(conversation.messages.count).to eq(1)
listener.conversation_created(event)
conversation.reload
expect(conversation.messages.count).to eq(1)
expect(conversation.messages.last.content).to eq('Incoming Message')
end
end
end
end