Files
leadchat/spec/enterprise/models/message_spec.rb
2026-03-03 16:13:34 +05:30

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