chore: Append incoming SMS to last conversation (#4906)

- Append incoming SMS to the last conversation created for a contact
This commit is contained in:
Sojan Jose 2022-07-05 17:49:41 +02:00 committed by GitHub
parent 4b405dc052
commit ac2adfbd57
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 37 deletions

View file

@ -57,7 +57,7 @@ class Sms::IncomingMessageService
end end
def set_conversation def set_conversation
@conversation = @contact_inbox.conversations.first @conversation = @contact_inbox.conversations.last
return if @conversation return if @conversation
@conversation = ::Conversation.create!(conversation_params) @conversation = ::Conversation.create!(conversation_params)

View file

@ -3,55 +3,54 @@ require 'rails_helper'
describe Sms::IncomingMessageService do describe Sms::IncomingMessageService do
describe '#perform' do describe '#perform' do
let!(:sms_channel) { create(:channel_sms) } let!(:sms_channel) { create(:channel_sms) }
let(:params) do
{
'id': '3232420-2323-234324',
'owner': sms_channel.phone_number,
'applicationId': '2342349-324234d-32432432',
'time': '2022-02-02T23:14:05.262Z',
'segmentCount': 1,
'direction': 'in',
'to': [
sms_channel.phone_number
],
'from': '+14234234234',
'text': 'test message'
}.with_indifferent_access
end
context 'when valid text message params' do context 'when valid text message params' do
it 'creates appropriate conversations, message and contacts' do it 'creates appropriate conversations, message and contacts' do
params = {
'id': '3232420-2323-234324',
'owner': sms_channel.phone_number,
'applicationId': '2342349-324234d-32432432',
'time': '2022-02-02T23:14:05.262Z',
'segmentCount': 1,
'direction': 'in',
'to': [
sms_channel.phone_number
],
'from': '+14234234234',
'text': 'test message'
}.with_indifferent_access
described_class.new(inbox: sms_channel.inbox, params: params).perform described_class.new(inbox: sms_channel.inbox, params: params).perform
expect(sms_channel.inbox.conversations.count).not_to eq(0) expect(sms_channel.inbox.conversations.count).not_to eq(0)
expect(Contact.all.first.name).to eq('+1 423-423-4234') expect(Contact.all.first.name).to eq('+1 423-423-4234')
expect(sms_channel.inbox.messages.first.content).to eq('test message') expect(sms_channel.inbox.messages.first.content).to eq(params[:text])
end
it 'appends to last conversation when if conversation already exisits' do
contact_inbox = create(:contact_inbox, inbox: sms_channel.inbox, source_id: params[:from])
2.times.each { create(:conversation, inbox: sms_channel.inbox, contact_inbox: contact_inbox) }
last_conversation = create(:conversation, inbox: sms_channel.inbox, contact_inbox: contact_inbox)
described_class.new(inbox: sms_channel.inbox, params: params).perform
# no new conversation should be created
expect(sms_channel.inbox.conversations.count).to eq(3)
# message appended to the last conversation
expect(last_conversation.messages.last.content).to eq('test message')
end end
it 'creates attachment messages and ignores .smil files' do it 'creates attachment messages and ignores .smil files' do
stub_request(:get, 'http://test.com/test.png').to_return(status: 200, body: File.read('spec/assets/sample.png'), headers: {}) stub_request(:get, 'http://test.com/test.png').to_return(status: 200, body: File.read('spec/assets/sample.png'), headers: {})
stub_request(:get, 'http://test.com/test2.png').to_return(status: 200, body: File.read('spec/assets/sample.png'), headers: {}) stub_request(:get, 'http://test.com/test2.png').to_return(status: 200, body: File.read('spec/assets/sample.png'), headers: {})
params = { media_params = { 'media': [
'http://test.com/test.smil',
'http://test.com/test.png',
'http://test.com/test2.png'
] }.with_indifferent_access
'id': '3232420-2323-234324', described_class.new(inbox: sms_channel.inbox, params: params.merge(media_params)).perform
'owner': sms_channel.phone_number,
'applicationId': '2342349-324234d-32432432',
'time': '2022-02-02T23:14:05.262Z',
'segmentCount': 1,
'direction': 'in',
'to': [
sms_channel.phone_number
],
'media': [
'http://test.com/test.smil',
'http://test.com/test.png',
'http://test.com/test2.png'
],
'from': '+14234234234',
'text': 'test message'
}.with_indifferent_access
described_class.new(inbox: sms_channel.inbox, params: params).perform
expect(sms_channel.inbox.conversations.count).not_to eq(0) expect(sms_channel.inbox.conversations.count).not_to eq(0)
expect(Contact.all.first.name).to eq('+1 423-423-4234') expect(Contact.all.first.name).to eq('+1 423-423-4234')
expect(sms_channel.inbox.messages.first.content).to eq('test message') expect(sms_channel.inbox.messages.first.content).to eq('test message')

View file

@ -20,6 +20,23 @@ describe Whatsapp::IncomingMessageService do
expect(Contact.all.first.name).to eq('Sojan Jose') expect(Contact.all.first.name).to eq('Sojan Jose')
expect(whatsapp_channel.inbox.messages.first.content).to eq('Test') expect(whatsapp_channel.inbox.messages.first.content).to eq('Test')
end end
it 'appends to last conversation when if conversation already exisits' do
params = {
'contacts' => [{ 'profile' => { 'name' => 'Sojan Jose' }, 'wa_id' => '2423423243' }],
'messages' => [{ 'from' => '2423423243', 'id' => 'SDFADSf23sfasdafasdfa', 'text' => { 'body' => 'Test' },
'timestamp' => '1633034394', 'type' => 'text' }]
}.with_indifferent_access
contact_inbox = create(:contact_inbox, inbox: whatsapp_channel.inbox, source_id: params[:messages].first[:from])
2.times.each { create(:conversation, inbox: whatsapp_channel.inbox, contact_inbox: contact_inbox) }
last_conversation = create(:conversation, inbox: whatsapp_channel.inbox, contact_inbox: contact_inbox)
described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
# no new conversation should be created
expect(whatsapp_channel.inbox.conversations.count).to eq(3)
# message appended to the last conversation
expect(last_conversation.messages.last.content).to eq(params[:messages].first[:text][:body])
end
end end
context 'when valid interactive message params' do context 'when valid interactive message params' do