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)
message = event_data[:message]
Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
end

View File

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

View File

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

View File

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

View File

@@ -29,6 +29,14 @@ RSpec.describe HookJob, type: :job do
described_class.perform_now(hook, event_name, event_data)
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
hook = create(:integrations_hook, :dialogflow, inbox: inbox, account: account)
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(:conversation) { create(:conversation, account: account, status: :pending) }
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_data) { { message: message } }
let(:dialogflow_text_double) { double }
@@ -35,6 +36,15 @@ describe Integrations::Dialogflow::ProcessorService do
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
it 'tracks hook into exception tracked' do
last_message = conversation.reload.messages.last.content

View File

@@ -9,6 +9,9 @@ describe Integrations::Slack::SendOnSlackService do
let!(:message) do
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation)
end
let!(:template_message) do
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, message_type: :template)
end
let(:slack_message) { double }
let(:file_attachment) { double }
@@ -119,6 +122,23 @@ describe Integrations::Slack::SendOnSlackService do
expect(message.attachments).to be_any
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
expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id,