diff --git a/lib/integrations/slack/send_on_slack_service.rb b/lib/integrations/slack/send_on_slack_service.rb index 6a8751e47..8752a4c4b 100644 --- a/lib/integrations/slack/send_on_slack_service.rb +++ b/lib/integrations/slack/send_on_slack_service.rb @@ -1,4 +1,5 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService + include RegexHelper pattr_initialize [:message!, :hook!] def perform @@ -34,12 +35,16 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService def message_content private_indicator = message.private? ? 'private: ' : '' if conversation.identifier.present? - "#{private_indicator}#{message.content}" + "#{private_indicator}#{message_text}" else - "#{formatted_inbox_name}#{email_subject_line}\n#{message.content}" + "#{formatted_inbox_name}#{email_subject_line}\n#{message_text}" end end + def message_text + message.content.present? ? message.content.gsub(MENTION_REGEX, '\1') : message.content + end + def formatted_inbox_name "\n*Inbox:* #{message.inbox.name} (#{message.inbox.inbox_type})\n" end diff --git a/spec/lib/integrations/slack/send_on_slack_service_spec.rb b/spec/lib/integrations/slack/send_on_slack_service_spec.rb index 5945fd0d5..be8685557 100644 --- a/spec/lib/integrations/slack/send_on_slack_service_spec.rb +++ b/spec/lib/integrations/slack/send_on_slack_service_spec.rb @@ -132,5 +132,46 @@ describe Integrations::Slack::SendOnSlackService do expect(hook).to have_received(:authorization_error!) end end + + context 'when message contains mentions' do + it 'sends formatted message to slack along with inbox name when identifier not present' do + inbox = conversation.inbox + message.update!(content: "Hi [@#{contact.name}](mention://user/#{contact.id}/#{contact.name}), welcome to Chatwoot!") + formatted_message_text = message.content.gsub(RegexHelper::MENTION_REGEX, '\1') + + expect(slack_client).to receive(:chat_postMessage).with( + channel: hook.reference_id, + text: "\n*Inbox:* #{inbox.name} (#{inbox.inbox_type})\n\n#{formatted_message_text}", + username: "#{message.sender.name} (Contact)", + thread_ts: nil, + icon_url: anything + ).and_return(slack_message) + + builder.perform + end + + it 'sends formatted message to slack when identifier is present' do + conversation.update!(identifier: 'random_slack_thread_ts') + message.update!(content: "Hi [@#{contact.name}](mention://user/#{contact.id}/#{contact.name}), welcome to Chatwoot!") + formatted_message_text = message.content.gsub(RegexHelper::MENTION_REGEX, '\1') + + expect(slack_client).to receive(:chat_postMessage).with( + channel: hook.reference_id, + text: formatted_message_text, + username: "#{message.sender.name} (Contact)", + thread_ts: 'random_slack_thread_ts', + icon_url: anything + ).and_return(slack_message) + + builder.perform + end + + it 'will not throw error if message content is nil' do + message.update!(content: nil) + conversation.update!(identifier: 'random_slack_thread_ts') + + expect { builder.perform }.not_to raise_error + end + end end end