Files
leadchat/spec/controllers/public/api/v1/inbox/conversations_controller_spec.rb
Muhsin Keloth 24fbab94c3 chore: Refactor MarkMessagesAsReadJob based on conversation id and time stamp (#8217)
- Mark all messages as read by providing the conversation ID and timestamp.
- For Instagram, ensure all previous messages that weren't marked as failed are now marked as read. This is because the read events are only triggered for the most recent message and not for any previous ones.
2023-10-27 15:21:39 -07:00

94 lines
4.7 KiB
Ruby

require 'rails_helper'
RSpec.describe 'Public Inbox Contact Conversations API', type: :request do
let!(:api_channel) { create(:channel_api) }
let!(:contact) { create(:contact) }
let!(:contact_inbox) { create(:contact_inbox, contact: contact, inbox: api_channel.inbox) }
describe 'GET /public/api/v1/inboxes/{identifier}/contact/{source_id}/conversations' do
it 'return the conversations for that contact' do
create(:conversation, contact_inbox: contact_inbox)
get "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations"
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data.length).to eq 1
expect(data.first['uuid']).to eq contact_inbox.conversations.first.uuid
end
it 'does not return any private or activity message' do
conversation = create(:conversation, contact_inbox: contact_inbox)
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, content: 'message-1')
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, content: 'message-2')
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, content: 'private-message-1',
private: true)
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, content: 'activity-message-1',
message_type: :activity)
get "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations"
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data.length).to eq 1
expect(data.first['messages'].length).to eq 2
expect(data.first['messages'].pluck('content')).not_to include('private-message-1')
expect(data.first['messages'].pluck('message_type')).not_to include('activity')
end
end
describe 'POST /public/api/v1/inboxes/{identifier}/contact/{source_id}/conversations' do
it 'creates a conversation for that contact' do
post "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations"
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data['id']).not_to be_nil
end
it 'creates a conversation with custom attributes but prevents other attributes' do
post "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations",
params: { custom_attributes: { 'test' => 'test' }, additional_attributes: { 'test' => 'test' } }
expect(response).to have_http_status(:success)
data = response.parsed_body
conversation = api_channel.inbox.conversations.find_by(display_id: data['id'])
expect(conversation.custom_attributes).to eq('test' => 'test')
expect(conversation.additional_attributes).to be_empty
end
end
describe 'POST /public/api/v1/inboxes/{identifier}/contact/{source_id}/conversations/{conversation_id}/toggle_typing' do
let!(:conversation) { create(:conversation, contact_inbox: contact_inbox, contact: contact) }
let(:toggle_typing_path) do
"/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations/#{conversation.display_id}/toggle_typing"
end
it 'dispatches the correct typing status' do
allow(Rails.configuration.dispatcher).to receive(:dispatch)
post toggle_typing_path, params: { typing_status: 'on' }
expect(response).to have_http_status(:success)
expect(Rails.configuration.dispatcher).to have_received(:dispatch)
.with(Conversation::CONVERSATION_TYPING_ON, kind_of(Time), { conversation: conversation, user: contact })
end
end
describe 'POST /public/api/v1/inboxes/{identifier}/contact/{source_id}/conversations/{conversation_id}/update_last_seen' do
let!(:conversation) { create(:conversation, contact_inbox: contact_inbox, contact: contact) }
let(:update_last_seen_path) do
"/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}/conversations/#{conversation.display_id}/update_last_seen"
end
it 'updates the last seen of the conversation contact' do
current_time = DateTime.now.utc
allow(DateTime).to receive(:now).and_return(current_time)
contact_last_seen_at = conversation.contact_last_seen_at
expect(Conversations::MarkMessagesAsReadJob).to receive(:perform_later).with(conversation.id, current_time)
post update_last_seen_path
expect(response).to have_http_status(:success)
expect(conversation.reload.contact_last_seen_at).not_to eq contact_last_seen_at
end
end
end