Chore: Cleanup attachment handling for Facebook & Whatsapp (#1051)

* Chore: Enable file upload for facebook messenger
* Chore: Fix attachments
* Chore: Fix Specs
* Fix ReplyBox file attachment logic
* Set default value for message

Co-authored-by: Pranav Raj Sreepuram <pranavrajs@gmail.com>
This commit is contained in:
Sojan Jose
2020-07-17 00:32:32 +05:30
committed by GitHub
parent 196741d975
commit a18d54b706
14 changed files with 212 additions and 108 deletions

View File

@@ -10,8 +10,8 @@ FactoryBot.define do
after(:build) do |message|
message.sender ||= create(:user, account: message.account)
message.conversation ||= create(:conversation, account: message.account)
message.inbox ||= create(:inbox, account: message.account)
message.conversation ||= create(:conversation, account: message.account, inbox: message.inbox)
end
end
end

View File

@@ -6,6 +6,7 @@ describe Facebook::SendOnFacebookService do
before do
allow(Facebook::Messenger::Subscriptions).to receive(:subscribe).and_return(true)
allow(bot).to receive(:deliver)
create(:message, message_type: :incoming, inbox: facebook_inbox, account: account, conversation: conversation)
end
let!(:account) { create(:account) }
@@ -20,39 +21,43 @@ describe Facebook::SendOnFacebookService do
describe '#perform' do
context 'without reply' do
it 'if message is private' do
create(:message, message_type: 'outgoing', private: true, inbox: facebook_inbox, account: account)
message = create(:message, message_type: 'outgoing', private: true, inbox: facebook_inbox, account: account)
::Facebook::SendOnFacebookService.new(message: message).perform
expect(bot).not_to have_received(:deliver)
end
it 'if inbox channel is not facebook page' do
create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
message = create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
expect { ::Facebook::SendOnFacebookService.new(message: message).perform }.to raise_error 'Invalid channel service was called'
expect(bot).not_to have_received(:deliver)
end
it 'if message is not outgoing' do
create(:message, message_type: 'incoming', inbox: facebook_inbox, account: account)
message = create(:message, message_type: 'incoming', inbox: facebook_inbox, account: account)
::Facebook::SendOnFacebookService.new(message: message).perform
expect(bot).not_to have_received(:deliver)
end
it 'if message has an FB ID' do
create(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, source_id: SecureRandom.uuid)
message = create(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, source_id: SecureRandom.uuid)
::Facebook::SendOnFacebookService.new(message: message).perform
expect(bot).not_to have_received(:deliver)
end
end
context 'with reply' do
it 'if message is sent from chatwoot and is outgoing' do
create(:message, message_type: :incoming, inbox: facebook_inbox, account: account, conversation: conversation)
create(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, conversation: conversation)
message = create(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, conversation: conversation)
::Facebook::SendOnFacebookService.new(message: message).perform
expect(bot).to have_received(:deliver)
end
it 'if message with attachment is sent from chatwoot and is outgoing' do
create(:message, message_type: :incoming, inbox: facebook_inbox, account: account, conversation: conversation)
message = build(:message, message_type: 'outgoing', inbox: facebook_inbox, account: account, conversation: conversation)
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png')
message.save!
::Facebook::SendOnFacebookService.new(message: message).perform
expect(bot).to have_received(:deliver)
end
end

View File

@@ -25,22 +25,26 @@ describe Twilio::SendOnTwilioService do
describe '#perform' do
context 'without reply' do
it 'if message is private' do
create(:message, message_type: 'outgoing', private: true, inbox: twilio_inbox, account: account)
message = create(:message, message_type: 'outgoing', private: true, inbox: twilio_inbox, account: account)
::Twilio::SendOnTwilioService.new(message: message).perform
expect(twilio_client).not_to have_received(:messages)
end
it 'if inbox channel is not facebook page' do
create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
it 'if inbox channel is not twilio' do
message = create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
expect { ::Twilio::SendOnTwilioService.new(message: message).perform }.to raise_error 'Invalid channel service was called'
expect(twilio_client).not_to have_received(:messages)
end
it 'if message is not outgoing' do
create(:message, message_type: 'incoming', inbox: twilio_inbox, account: account)
message = create(:message, message_type: 'incoming', inbox: twilio_inbox, account: account)
::Twilio::SendOnTwilioService.new(message: message).perform
expect(twilio_client).not_to have_received(:messages)
end
it 'if message has an source id' do
create(:message, message_type: 'outgoing', inbox: twilio_inbox, account: account, source_id: SecureRandom.uuid)
message = create(:message, message_type: 'outgoing', inbox: twilio_inbox, account: account, source_id: SecureRandom.uuid)
::Twilio::SendOnTwilioService.new(message: message).perform
expect(twilio_client).not_to have_received(:messages)
end
end
@@ -53,6 +57,7 @@ describe Twilio::SendOnTwilioService do
outgoing_message = create(
:message, message_type: 'outgoing', inbox: twilio_inbox, account: account, conversation: conversation
)
::Twilio::SendOnTwilioService.new(message: outgoing_message).perform
expect(outgoing_message.reload.source_id).to eq('1234')
end
@@ -69,6 +74,8 @@ describe Twilio::SendOnTwilioService do
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png')
message.save!
::Twilio::SendOnTwilioService.new(message: message).perform
end
end
end

View File

@@ -41,22 +41,26 @@ describe Twitter::SendOnTwitterService do
describe '#perform' do
context 'without reply' do
it 'if inbox channel is not twitter profile' do
create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
message = create(:message, message_type: 'outgoing', inbox: widget_inbox, account: account)
expect { ::Twitter::SendOnTwitterService.new(message: message).perform }.to raise_error 'Invalid channel service was called'
expect(twitter_client).not_to have_received(:send_direct_message)
end
it 'if message is private' do
create(:message, message_type: 'outgoing', private: true, inbox: twitter_inbox, account: account)
message = create(:message, message_type: 'outgoing', private: true, inbox: twitter_inbox, account: account)
::Twitter::SendOnTwitterService.new(message: message).perform
expect(twitter_client).not_to have_received(:send_direct_message)
end
it 'if message has source_id' do
create(:message, message_type: 'outgoing', source_id: '123', inbox: widget_inbox, account: account)
message = create(:message, message_type: 'outgoing', source_id: '123', inbox: twitter_inbox, account: account)
::Twitter::SendOnTwitterService.new(message: message).perform
expect(twitter_client).not_to have_received(:send_direct_message)
end
it 'if message is not outgoing' do
create(:message, message_type: 'incoming', inbox: twitter_inbox, account: account)
message = create(:message, message_type: 'incoming', inbox: twitter_inbox, account: account)
::Twitter::SendOnTwitterService.new(message: message).perform
expect(twitter_client).not_to have_received(:send_direct_message)
end
end
@@ -64,15 +68,17 @@ describe Twitter::SendOnTwitterService do
context 'with reply' do
it 'if conversation is a direct message' do
create(:message, message_type: :incoming, inbox: twitter_inbox, account: account, conversation: dm_conversation)
create(:message, message_type: :outgoing, inbox: twitter_inbox, account: account, conversation: dm_conversation)
message = create(:message, message_type: :outgoing, inbox: twitter_inbox, account: account, conversation: dm_conversation)
::Twitter::SendOnTwitterService.new(message: message).perform
expect(twitter_client).to have_received(:send_direct_message)
end
it 'if conversation is a tweet' do
create(:message, message_type: :incoming, inbox: twitter_inbox, account: account, conversation: tweet_conversation)
tweet = create(:message, message_type: :outgoing, inbox: twitter_inbox, account: account, conversation: tweet_conversation)
message = create(:message, message_type: :outgoing, inbox: twitter_inbox, account: account, conversation: tweet_conversation)
::Twitter::SendOnTwitterService.new(message: message).perform
expect(twitter_client).to have_received(:send_tweet_reply)
expect(tweet.reload.source_id).to eq '12345'
expect(message.reload.source_id).to eq '12345'
end
end
end