92 lines
3.4 KiB
Ruby
92 lines
3.4 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe Message do
|
|
let!(:conversation) { create(:conversation) }
|
|
|
|
it 'updates first reply if the message is human and even if there are messages from captain' do
|
|
captain_assistant = create(:captain_assistant, account: conversation.account)
|
|
expect(conversation.first_reply_created_at).to be_nil
|
|
|
|
## There is a difference on how the time is stored in the database and how it is retrieved
|
|
# This is because of the precision of the time stored in the database
|
|
# In the test, we will check whether the time is within the range
|
|
expect(conversation.waiting_since).to be_within(0.000001.seconds).of(conversation.created_at)
|
|
|
|
create(:message, message_type: :outgoing, conversation: conversation, sender: captain_assistant)
|
|
|
|
# Captain::Assistant responses clear waiting_since (like AgentBot)
|
|
expect(conversation.first_reply_created_at).to be_nil
|
|
expect(conversation.waiting_since).to be_nil
|
|
|
|
create(:message, message_type: :outgoing, conversation: conversation)
|
|
|
|
expect(conversation.first_reply_created_at).not_to be_nil
|
|
expect(conversation.waiting_since).to be_nil
|
|
end
|
|
|
|
describe '#mark_pending_conversation_as_open_for_human_response' do
|
|
let(:conversation) { create(:conversation, status: :pending) }
|
|
let(:captain_assistant) { create(:captain_assistant, account: conversation.account) }
|
|
let(:auto_open_activity_content) { I18n.t('conversations.activity.captain.auto_opened_after_agent_reply', locale: conversation.account.locale) }
|
|
|
|
before do
|
|
create(:captain_inbox, inbox: conversation.inbox, captain_assistant: captain_assistant)
|
|
end
|
|
|
|
it 'marks the conversation open when a human sends a public outgoing message' do
|
|
create(:message, message_type: :outgoing, conversation: conversation)
|
|
|
|
expect(conversation.reload.open?).to be true
|
|
end
|
|
|
|
it 'creates an activity message when a human sends a public outgoing message' do
|
|
expect do
|
|
create(:message, message_type: :outgoing, conversation: conversation)
|
|
end.to have_enqueued_job(Conversations::ActivityMessageJob).with(
|
|
conversation,
|
|
{
|
|
account_id: conversation.account_id,
|
|
inbox_id: conversation.inbox_id,
|
|
message_type: :activity,
|
|
content: auto_open_activity_content
|
|
}
|
|
)
|
|
end
|
|
|
|
it 'creates an activity message for external echo replies' do
|
|
message = build(
|
|
:message,
|
|
message_type: :outgoing,
|
|
conversation: conversation,
|
|
content_attributes: { external_echo: true }
|
|
)
|
|
message.sender = nil
|
|
|
|
expect do
|
|
message.save!
|
|
end.to have_enqueued_job(Conversations::ActivityMessageJob).with(
|
|
conversation,
|
|
{
|
|
account_id: conversation.account_id,
|
|
inbox_id: conversation.inbox_id,
|
|
message_type: :activity,
|
|
content: auto_open_activity_content
|
|
}
|
|
)
|
|
end
|
|
|
|
it 'does not mark the conversation open for private outgoing messages' do
|
|
create(:message, message_type: :outgoing, conversation: conversation, private: true)
|
|
|
|
expect(conversation.reload.pending?).to be true
|
|
end
|
|
|
|
it 'does not mark the conversation open for bot outgoing messages' do
|
|
agent_bot = create(:agent_bot, account: conversation.account)
|
|
create(:message, message_type: :outgoing, conversation: conversation, sender: agent_bot)
|
|
|
|
expect(conversation.reload.pending?).to be true
|
|
end
|
|
end
|
|
end
|