…on (#11584)"
This reverts commit b5ebc47637.
# Pull Request Template
## Description
Please include a summary of the change and issue(s) fixed. Also, mention
relevant motivation, context, and any dependencies that this change
requires.
Fixes # (issue)
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update
## How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide
instructions so we can reproduce. Please also list any relevant details
for your test configuration.
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules
274 lines
14 KiB
Ruby
274 lines
14 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe MessageTemplates::HookExecutionService do
|
|
context 'when there is no incoming message in conversation' do
|
|
it 'will not call any hooks' do
|
|
contact = create(:contact, email: nil)
|
|
conversation = create(:conversation, contact: contact)
|
|
# ensure greeting hook is enabled
|
|
conversation.inbox.update(greeting_enabled: true, enable_email_collect: true)
|
|
|
|
email_collect_service = double
|
|
|
|
allow(MessageTemplates::Template::EmailCollect).to receive(:new).and_return(email_collect_service)
|
|
allow(email_collect_service).to receive(:perform).and_return(true)
|
|
allow(MessageTemplates::Template::Greeting).to receive(:new)
|
|
|
|
# described class gets called in message after commit
|
|
create(:message, conversation: conversation, message_type: 'activity', content: 'Conversation marked resolved!!')
|
|
|
|
expect(MessageTemplates::Template::Greeting).not_to have_received(:new)
|
|
expect(MessageTemplates::Template::EmailCollect).not_to have_received(:new)
|
|
end
|
|
end
|
|
|
|
context 'when Greeting Message' do
|
|
it 'doesnot calls ::MessageTemplates::Template::Greeting if greeting_message is empty' do
|
|
contact = create(:contact, email: nil)
|
|
conversation = create(:conversation, contact: contact)
|
|
# ensure greeting hook is enabled
|
|
conversation.inbox.update(greeting_enabled: true, enable_email_collect: true)
|
|
|
|
email_collect_service = double
|
|
|
|
allow(MessageTemplates::Template::EmailCollect).to receive(:new).and_return(email_collect_service)
|
|
allow(email_collect_service).to receive(:perform).and_return(true)
|
|
allow(MessageTemplates::Template::Greeting).to receive(:new)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::Greeting).not_to have_received(:new)
|
|
expect(MessageTemplates::Template::EmailCollect).to have_received(:new).with(conversation: message.conversation)
|
|
expect(email_collect_service).to have_received(:perform)
|
|
end
|
|
|
|
it 'will not call ::MessageTemplates::Template::Greeting if its a tweet conversation' do
|
|
twitter_channel = create(:channel_twitter_profile)
|
|
twitter_inbox = create(:inbox, channel: twitter_channel)
|
|
# ensure greeting hook is enabled and greeting_message is present
|
|
twitter_inbox.update(greeting_enabled: true, greeting_message: 'Hi, this is a greeting message')
|
|
|
|
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
|
greeting_service = double
|
|
allow(MessageTemplates::Template::Greeting).to receive(:new).and_return(greeting_service)
|
|
allow(greeting_service).to receive(:perform).and_return(true)
|
|
|
|
message = create(:message, conversation: conversation)
|
|
expect(MessageTemplates::Template::Greeting).not_to have_received(:new).with(conversation: message.conversation)
|
|
end
|
|
end
|
|
|
|
context 'when it is a first message from web widget' do
|
|
it 'calls ::MessageTemplates::Template::EmailCollect' do
|
|
contact = create(:contact, email: nil)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
# ensure greeting hook is enabled and greeting_message is present
|
|
conversation.inbox.update(greeting_enabled: true, enable_email_collect: true, greeting_message: 'Hi, this is a greeting message')
|
|
|
|
email_collect_service = double
|
|
greeting_service = double
|
|
allow(MessageTemplates::Template::EmailCollect).to receive(:new).and_return(email_collect_service)
|
|
allow(email_collect_service).to receive(:perform).and_return(true)
|
|
allow(MessageTemplates::Template::Greeting).to receive(:new).and_return(greeting_service)
|
|
allow(greeting_service).to receive(:perform).and_return(true)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::Greeting).to have_received(:new).with(conversation: message.conversation)
|
|
expect(greeting_service).to have_received(:perform)
|
|
expect(MessageTemplates::Template::EmailCollect).to have_received(:new).with(conversation: message.conversation)
|
|
expect(email_collect_service).to have_received(:perform)
|
|
end
|
|
|
|
it 'doesnot calls ::MessageTemplates::Template::EmailCollect on campaign conversations' do
|
|
contact = create(:contact, email: nil)
|
|
conversation = create(:conversation, contact: contact, campaign: create(:campaign))
|
|
|
|
allow(MessageTemplates::Template::EmailCollect).to receive(:new).and_return(true)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::EmailCollect).not_to have_received(:new).with(conversation: message.conversation)
|
|
end
|
|
|
|
it 'doesnot calls ::MessageTemplates::Template::EmailCollect when enable_email_collect form is disabled' do
|
|
contact = create(:contact, email: nil)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
conversation.inbox.update(enable_email_collect: false)
|
|
# ensure prechat form is enabled
|
|
conversation.inbox.channel.update(pre_chat_form_enabled: true)
|
|
allow(MessageTemplates::Template::EmailCollect).to receive(:new).and_return(true)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::EmailCollect).not_to have_received(:new).with(conversation: message.conversation)
|
|
end
|
|
end
|
|
|
|
context 'when CSAT Survey' do
|
|
let(:csat_survey) { double }
|
|
let(:conversation) { create(:conversation) }
|
|
|
|
before do
|
|
allow(MessageTemplates::Template::CsatSurvey).to receive(:new).and_return(csat_survey)
|
|
allow(csat_survey).to receive(:perform).and_return(true)
|
|
create(:message, conversation: conversation, message_type: 'incoming')
|
|
end
|
|
|
|
it 'calls ::MessageTemplates::Template::CsatSurvey when a conversation is resolved in an inbox with survey enabled' do
|
|
conversation.inbox.update(csat_survey_enabled: true)
|
|
|
|
conversation.resolved!
|
|
Conversations::ActivityMessageJob.perform_now(conversation,
|
|
{ account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
|
content: 'Conversation marked resolved!!' })
|
|
|
|
expect(MessageTemplates::Template::CsatSurvey).to have_received(:new).with(conversation: conversation)
|
|
expect(csat_survey).to have_received(:perform)
|
|
end
|
|
|
|
it 'will not call ::MessageTemplates::Template::CsatSurvey when Csat is not enabled' do
|
|
conversation.inbox.update(csat_survey_enabled: false)
|
|
|
|
conversation.resolved!
|
|
Conversations::ActivityMessageJob.perform_now(conversation,
|
|
{ account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
|
content: 'Conversation marked resolved!!' })
|
|
|
|
expect(MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation)
|
|
expect(csat_survey).not_to have_received(:perform)
|
|
end
|
|
|
|
it 'will not call ::MessageTemplates::Template::CsatSurvey if its a tweet conversation' do
|
|
twitter_channel = create(:channel_twitter_profile)
|
|
twitter_inbox = create(:inbox, channel: twitter_channel)
|
|
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
|
conversation.inbox.update(csat_survey_enabled: true)
|
|
|
|
conversation.resolved!
|
|
Conversations::ActivityMessageJob.perform_now(conversation,
|
|
{ account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
|
content: 'Conversation marked resolved!!' })
|
|
|
|
expect(MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation)
|
|
expect(csat_survey).not_to have_received(:perform)
|
|
end
|
|
|
|
it 'will not call ::MessageTemplates::Template::CsatSurvey if another Csat was already sent' do
|
|
conversation.inbox.update(csat_survey_enabled: true)
|
|
conversation.messages.create!(message_type: 'outgoing', content_type: :input_csat, account: conversation.account, inbox: conversation.inbox)
|
|
|
|
conversation.resolved!
|
|
Conversations::ActivityMessageJob.perform_now(conversation,
|
|
{ account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
|
content: 'Conversation marked resolved!!' })
|
|
|
|
expect(MessageTemplates::Template::CsatSurvey).not_to have_received(:new).with(conversation: conversation)
|
|
expect(csat_survey).not_to have_received(:perform)
|
|
end
|
|
end
|
|
|
|
context 'when it is after working hours' do
|
|
it 'calls ::MessageTemplates::Template::OutOfOffice' do
|
|
contact = create(:contact)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
|
conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
|
|
|
out_of_office_service = double
|
|
|
|
allow(MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
|
allow(out_of_office_service).to receive(:perform).and_return(true)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::OutOfOffice).to have_received(:new).with(conversation: message.conversation)
|
|
expect(out_of_office_service).to have_received(:perform)
|
|
end
|
|
|
|
context 'with recent outgoing messages' do
|
|
it 'does not call ::MessageTemplates::Template::OutOfOffice when there are recent outgoing messages' do
|
|
contact = create(:contact)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
|
conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
|
|
|
create(:message, conversation: conversation, message_type: :outgoing, created_at: 2.minutes.ago)
|
|
|
|
out_of_office_service = double
|
|
allow(MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
|
allow(out_of_office_service).to receive(:perform).and_return(true)
|
|
|
|
create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::OutOfOffice).not_to have_received(:new)
|
|
expect(out_of_office_service).not_to have_received(:perform)
|
|
end
|
|
|
|
it 'ignores private note and calls ::MessageTemplates::Template::OutOfOffice' do
|
|
contact = create(:contact)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
|
conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
|
|
|
create(:message, conversation: conversation, private: true, message_type: :outgoing, created_at: 2.minutes.ago)
|
|
|
|
out_of_office_service = double
|
|
allow(MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
|
allow(out_of_office_service).to receive(:perform).and_return(true)
|
|
|
|
create(:message, conversation: conversation)
|
|
|
|
expect(MessageTemplates::Template::OutOfOffice).to have_received(:new).with(conversation: conversation)
|
|
expect(out_of_office_service).to have_received(:perform)
|
|
end
|
|
end
|
|
|
|
it 'will not calls ::MessageTemplates::Template::OutOfOffice when outgoing message' do
|
|
contact = create(:contact)
|
|
conversation = create(:conversation, contact: contact)
|
|
|
|
conversation.inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
|
conversation.inbox.working_hours.today.update!(closed_all_day: true)
|
|
|
|
out_of_office_service = double
|
|
|
|
allow(MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
|
allow(out_of_office_service).to receive(:perform).and_return(true)
|
|
|
|
# described class gets called in message after commit
|
|
message = create(:message, conversation: conversation, message_type: 'outgoing')
|
|
|
|
expect(MessageTemplates::Template::OutOfOffice).not_to have_received(:new).with(conversation: message.conversation)
|
|
expect(out_of_office_service).not_to have_received(:perform)
|
|
end
|
|
|
|
it 'will not call ::MessageTemplates::Template::OutOfOffice if its a tweet conversation' do
|
|
twitter_channel = create(:channel_twitter_profile)
|
|
twitter_inbox = create(:inbox, channel: twitter_channel)
|
|
twitter_inbox.update(working_hours_enabled: true, out_of_office_message: 'We are out of office')
|
|
|
|
conversation = create(:conversation, inbox: twitter_inbox, additional_attributes: { type: 'tweet' })
|
|
|
|
out_of_office_service = double
|
|
|
|
allow(MessageTemplates::Template::OutOfOffice).to receive(:new).and_return(out_of_office_service)
|
|
allow(out_of_office_service).to receive(:perform).and_return(false)
|
|
|
|
message = create(:message, conversation: conversation)
|
|
expect(MessageTemplates::Template::OutOfOffice).not_to have_received(:new).with(conversation: message.conversation)
|
|
expect(out_of_office_service).not_to receive(:perform)
|
|
end
|
|
end
|
|
end
|