From 0e903d23657971aad0c269b026bd11b742e0935c Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Mon, 22 May 2023 13:51:14 +0530 Subject: [PATCH] chore: Add delay for slack job when message has attachments (#7107) --- app/jobs/hook_job.rb | 10 +++++++-- app/jobs/send_on_slack_job.rb | 8 ++++++++ spec/jobs/hook_job_spec.rb | 15 +++++++------- spec/jobs/send_on_slack_job_spec.rb | 32 +++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 app/jobs/send_on_slack_job.rb create mode 100644 spec/jobs/send_on_slack_job_spec.rb diff --git a/app/jobs/hook_job.rb b/app/jobs/hook_job.rb index 9d54462e2..15efa40f2 100644 --- a/app/jobs/hook_job.rb +++ b/app/jobs/hook_job.rb @@ -20,8 +20,14 @@ class HookJob < ApplicationJob return unless ['message.created'].include?(event_name) message = event_data[:message] - - Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform + if message.attachments.blank? + ::SendOnSlackJob.perform_later(message: message, + hook: hook) + else + ::SendOnSlackJob.set(wait: 2.seconds).perform_later( + message: message, hook: hook + ) + end end def process_dialogflow_integration(hook, event_name, event_data) diff --git a/app/jobs/send_on_slack_job.rb b/app/jobs/send_on_slack_job.rb new file mode 100644 index 000000000..521510ff9 --- /dev/null +++ b/app/jobs/send_on_slack_job.rb @@ -0,0 +1,8 @@ +class SendOnSlackJob < ApplicationJob + queue_as :medium + pattr_initialize [:message!, :hook!] + + def perform + Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform + end +end diff --git a/spec/jobs/hook_job_spec.rb b/spec/jobs/hook_job_spec.rb index 67dfcaf5f..d3cd46223 100644 --- a/spec/jobs/hook_job_spec.rb +++ b/spec/jobs/hook_job_spec.rb @@ -22,18 +22,19 @@ RSpec.describe HookJob do allow(process_service).to receive(:perform) end - it 'calls Integrations::Slack::SendOnSlackService when its a slack hook' do + it 'calls SendOnSlackJob when its a slack hook' do 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).with(message: event_data[:message], hook: hook) + allow(SendOnSlackJob).to receive(:perform_later).and_return(process_service) + expect(SendOnSlackJob).to receive(:perform_later).with(message: event_data[:message], hook: hook) 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) } + it 'calls SendOnSlackJob when its a slack hook for message with attachments' do + event_data = { message: create(:message, :with_attachment, account: account) } 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) + allow(SendOnSlackJob).to receive(:set).with(wait: 2.seconds).and_return(SendOnSlackJob) + allow(SendOnSlackJob).to receive(:perform_later).and_return(process_service) + expect(SendOnSlackJob).to receive(:perform_later).with(message: event_data[:message], hook: hook) described_class.perform_now(hook, event_name, event_data) end diff --git a/spec/jobs/send_on_slack_job_spec.rb b/spec/jobs/send_on_slack_job_spec.rb new file mode 100644 index 000000000..59f15a9b5 --- /dev/null +++ b/spec/jobs/send_on_slack_job_spec.rb @@ -0,0 +1,32 @@ +require 'rails_helper' + +RSpec.describe SendOnSlackJob do + let(:account) { create(:account) } + let(:hook) { create(:integrations_hook, account: account) } + let(:inbox) { create(:inbox, account: account) } + let(:event_name) { 'message.created' } + let(:event_data) { { message: create(:message, account: account, content: 'muchas muchas gracias', message_type: :incoming) } } + + context 'when handleable events like message.created' do + let(:process_service) { double } + + before do + allow(process_service).to receive(:perform) + end + + it 'calls Integrations::Slack::SendOnSlackService when its a slack hook' do + 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).with(message: event_data[:message], hook: hook) + described_class.perform_now(message: event_data[:message], hook: hook) + 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).with(message: event_data[:message], hook: hook) + described_class.perform_now(message: event_data[:message], hook: hook) + end + end +end