chore: Append incoming SMS to last conversation (#4906)
- Append incoming SMS to the last conversation created for a contact
This commit is contained in:
parent
4b405dc052
commit
ac2adfbd57
3 changed files with 53 additions and 37 deletions
|
@ -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)
|
||||||
|
|
|
@ -3,10 +3,8 @@ 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
|
||||||
context 'when valid text message params' do
|
{
|
||||||
it 'creates appropriate conversations, message and contacts' do
|
|
||||||
params = {
|
|
||||||
|
|
||||||
'id': '3232420-2323-234324',
|
'id': '3232420-2323-234324',
|
||||||
'owner': sms_channel.phone_number,
|
'owner': sms_channel.phone_number,
|
||||||
|
@ -21,37 +19,38 @@ describe Sms::IncomingMessageService do
|
||||||
'text': 'test message'
|
'text': 'test message'
|
||||||
|
|
||||||
}.with_indifferent_access
|
}.with_indifferent_access
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when valid text message params' do
|
||||||
|
it 'creates appropriate conversations, message and contacts' do
|
||||||
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': [
|
||||||
|
|
||||||
'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
|
|
||||||
],
|
|
||||||
'media': [
|
|
||||||
'http://test.com/test.smil',
|
'http://test.com/test.smil',
|
||||||
'http://test.com/test.png',
|
'http://test.com/test.png',
|
||||||
'http://test.com/test2.png'
|
'http://test.com/test2.png'
|
||||||
],
|
] }.with_indifferent_access
|
||||||
'from': '+14234234234',
|
|
||||||
'text': 'test message'
|
|
||||||
|
|
||||||
}.with_indifferent_access
|
described_class.new(inbox: sms_channel.inbox, params: params.merge(media_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('test message')
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue