chore: Refactor Automation Specs (#6796)
The current way of writing specs for automation in one single file automation_listener isn't effective. Hence we are breaking down the specs for each class into separate spec files. fixes: CW-1447
This commit is contained in:
91
spec/services/automation_rules/action_service_spec.rb
Normal file
91
spec/services/automation_rules/action_service_spec.rb
Normal file
@@ -0,0 +1,91 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe AutomationRules::ActionService do
|
||||
let(:account) { create(:account) }
|
||||
let(:agent) { create(:user, account: account) }
|
||||
let(:conversation) { create(:conversation, account: account) }
|
||||
let!(:rule) do
|
||||
create(:automation_rule, account: account,
|
||||
actions: [
|
||||
{ action_name: 'send_webhook_event', action_params: ['https://example.com'] },
|
||||
{ action_name: 'send_message', action_params: { message: 'Hello' } }
|
||||
])
|
||||
end
|
||||
|
||||
describe '#perform' do
|
||||
context 'when actions are defined in the rule' do
|
||||
it 'will call the actions' do
|
||||
expect(Messages::MessageBuilder).to receive(:new)
|
||||
expect(WebhookJob).to receive(:perform_later)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
end
|
||||
|
||||
describe '#perform with send_attachment action' do
|
||||
let(:message_builder) { double }
|
||||
|
||||
before do
|
||||
allow(Messages::MessageBuilder).to receive(:new).and_return(message_builder)
|
||||
rule.actions.delete_if { |a| a['action_name'] == 'send_message' }
|
||||
rule.files.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png')
|
||||
rule.save!
|
||||
rule.actions << { action_name: 'send_attachment', action_params: [rule.files.first.blob_id] }
|
||||
end
|
||||
|
||||
it 'will send attachment' do
|
||||
expect(message_builder).to receive(:perform)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
|
||||
it 'will not send attachment is conversation is a tweet' do
|
||||
twitter_inbox = create(:inbox, channel: create(:channel_twitter_profile, account: account))
|
||||
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
||||
expect(message_builder).not_to receive(:perform)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
end
|
||||
|
||||
describe '#perform with send_webhook_event action' do
|
||||
it 'will send webhook event' do
|
||||
expect(rule.actions.map { |r| r['action_name'] }).to include('send_webhook_event')
|
||||
expect(WebhookJob).to receive(:perform_later)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
end
|
||||
|
||||
describe '#perform with send_message action' do
|
||||
let(:message_builder) { double }
|
||||
|
||||
before do
|
||||
allow(Messages::MessageBuilder).to receive(:new).and_return(message_builder)
|
||||
end
|
||||
|
||||
it 'will send message' do
|
||||
expect(rule.actions.map { |r| r['action_name'] }).to include('send_message')
|
||||
expect(message_builder).to receive(:perform)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
|
||||
it 'will not send message if conversation is a tweet' do
|
||||
expect(rule.actions.map { |r| r['action_name'] }).to include('send_message')
|
||||
twitter_inbox = create(:inbox, channel: create(:channel_twitter_profile, account: account))
|
||||
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
||||
expect(message_builder).not_to receive(:perform)
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
end
|
||||
|
||||
describe '#perform with send_email_to_team action' do
|
||||
let!(:team) { create(:team, account: account) }
|
||||
|
||||
before do
|
||||
rule.actions << { action_name: 'send_email_to_team', action_params: [{ team_ids: [team.id], message: 'Hello' }] }
|
||||
end
|
||||
|
||||
it 'will send email to team' do
|
||||
expect(TeamNotifications::AutomationNotificationMailer).to receive(:conversation_creation).with(conversation, team, 'Hello').and_call_original
|
||||
described_class.new(rule, account, conversation).perform
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe AutomationRules::ConditionsFilterService do
|
||||
let(:account) { create(:account) }
|
||||
let(:conversation) { create(:conversation, account: account) }
|
||||
let(:rule) { create(:automation_rule, account: account) }
|
||||
|
||||
describe '#perform' do
|
||||
before do
|
||||
rule.conditions = [{ 'values': ['open'], 'attribute_key': 'status', 'query_operator': nil, 'filter_operator': 'equal_to' }]
|
||||
rule.save
|
||||
end
|
||||
|
||||
context 'when conditions in rule matches with object' do
|
||||
it 'will return true' do
|
||||
expect(described_class.new(rule, conversation, { changed_attributes: { status: [nil, 'open'] } }).perform).to be(true)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when conditions in rule does not match with object' do
|
||||
it 'will return false' do
|
||||
conversation.update(status: 'resolved')
|
||||
expect(described_class.new(rule, conversation, { changed_attributes: { status: %w[open resolved] } }).perform).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
## TODO: add tests for the other conditions
|
||||
end
|
||||
Reference in New Issue
Block a user