Fix: Consider bot message on slack integration (#6793)

This commit is contained in:
Tejaswini Chile
2023-03-31 18:56:51 +05:30
committed by GitHub
parent bd5ff7a8bf
commit 21da03fe5b
7 changed files with 48 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ class HookJob < ApplicationJob
return unless ['message.created'].include?(event_name) return unless ['message.created'].include?(event_name)
message = event_data[:message] message = event_data[:message]
Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
end end

View File

@@ -1,14 +1,12 @@
class HookListener < BaseListener class HookListener < BaseListener
def message_created(event) def message_created(event)
message = extract_message_and_account(event)[0] message = extract_message_and_account(event)[0]
return unless message.webhook_sendable?
execute_hooks(event, message) execute_hooks(event, message)
end end
def message_updated(event) def message_updated(event)
message = extract_message_and_account(event)[0] message = extract_message_and_account(event)[0]
return unless message.webhook_sendable?
execute_hooks(event, message) execute_hooks(event, message)
end end

View File

@@ -9,6 +9,10 @@ module MessageFilterHelpers
incoming? || outgoing? incoming? || outgoing?
end end
def slack_hook_sendable?
incoming? || outgoing? || template?
end
def notifiable? def notifiable?
incoming? || outgoing? incoming? || outgoing?
end end

View File

@@ -9,7 +9,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
# we don't want message loop in slack # we don't want message loop in slack
return if message.external_source_id_slack.present? return if message.external_source_id_slack.present?
# we don't want to start slack thread from agent conversation as of now # we don't want to start slack thread from agent conversation as of now
return if message.outgoing? && conversation.identifier.blank? return if invalid_message?
perform_reply perform_reply
end end
@@ -23,6 +23,10 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
true true
end end
def invalid_message?
(message.outgoing? && conversation.identifier.blank?) || !message.slack_hook_sendable?
end
def perform_reply def perform_reply
send_message send_message

View File

@@ -29,6 +29,14 @@ RSpec.describe HookJob, type: :job do
described_class.perform_now(hook, event_name, event_data) described_class.perform_now(hook, event_name, event_data)
end end
it 'calls Integrations::Slack::SendOnSlackService when its a slack hook for template message' do
event_data = { message: create(:message, account: account, message_type: :template) }
hook = create(:integrations_hook, app_id: 'slack', account: account)
allow(Integrations::Slack::SendOnSlackService).to receive(:new).and_return(process_service)
expect(Integrations::Slack::SendOnSlackService).to receive(:new)
described_class.perform_now(hook, event_name, event_data)
end
it 'calls Integrations::Dialogflow::ProcessorService when its a dialogflow intergation' do it 'calls Integrations::Dialogflow::ProcessorService when its a dialogflow intergation' do
hook = create(:integrations_hook, :dialogflow, inbox: inbox, account: account) hook = create(:integrations_hook, :dialogflow, inbox: inbox, account: account)
allow(Integrations::Dialogflow::ProcessorService).to receive(:new).and_return(process_service) allow(Integrations::Dialogflow::ProcessorService).to receive(:new).and_return(process_service)

View File

@@ -6,6 +6,7 @@ describe Integrations::Dialogflow::ProcessorService do
let(:hook) { create(:integrations_hook, :dialogflow, inbox: inbox, account: account) } let(:hook) { create(:integrations_hook, :dialogflow, inbox: inbox, account: account) }
let(:conversation) { create(:conversation, account: account, status: :pending) } let(:conversation) { create(:conversation, account: account, status: :pending) }
let(:message) { create(:message, account: account, conversation: conversation) } let(:message) { create(:message, account: account, conversation: conversation) }
let(:template_message) { create(:message, account: account, conversation: conversation, message_type: :template, content: 'Bot message') }
let(:event_name) { 'message.created' } let(:event_name) { 'message.created' }
let(:event_data) { { message: message } } let(:event_data) { { message: message } }
let(:dialogflow_text_double) { double } let(:dialogflow_text_double) { double }
@@ -35,6 +36,15 @@ describe Integrations::Dialogflow::ProcessorService do
end end
end end
context 'when invalid message and dialogflow returns empty block' do
it 'will not create the response message' do
event_data = { message: template_message }
processor = described_class.new(event_name: event_name, hook: hook, event_data: event_data)
processor.perform
expect(conversation.reload.messages.last.content).not_to eql('hello payload')
end
end
context 'when dilogflow raises exception' do context 'when dilogflow raises exception' do
it 'tracks hook into exception tracked' do it 'tracks hook into exception tracked' do
last_message = conversation.reload.messages.last.content last_message = conversation.reload.messages.last.content

View File

@@ -9,6 +9,9 @@ describe Integrations::Slack::SendOnSlackService do
let!(:message) do let!(:message) do
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation) create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation)
end end
let!(:template_message) do
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, message_type: :template)
end
let(:slack_message) { double } let(:slack_message) { double }
let(:file_attachment) { double } let(:file_attachment) { double }
@@ -119,6 +122,23 @@ describe Integrations::Slack::SendOnSlackService do
expect(message.attachments).to be_any expect(message.attachments).to be_any
end end
it 'sent a template message on slack' do
builder = described_class.new(message: template_message, hook: hook)
allow(builder).to receive(:slack_client).and_return(slack_client)
expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id,
text: template_message.content,
username: "#{template_message.sender.name} (Contact)",
thread_ts: conversation.identifier,
icon_url: anything
).and_return(slack_message)
builder.perform
expect(template_message.external_source_id_slack).to eq 'cw-origin-6789.12345'
end
it 'disables hook on Slack AccountInactive error' do it 'disables hook on Slack AccountInactive error' do
expect(slack_client).to receive(:chat_postMessage).with( expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id, channel: hook.reference_id,