* fix: return not_found status for missing messages in WhatsApp webhook * feat: enhance message handling to support image attachments * chore: Handle incoming whatsapp baileys service attachments and implement specs for images and videos * fix: add file_content_type method to incoming baileys messages * chore: specs for stickers, audio and files * fix: handle media attachment errors * chore: convert file_content_type to string when attaching media * fix: add handling for attachment not found error in incoming message service * chore: refactor file_content_type method and simplify filename method * chore: update media attachment tests * feat: baileys unsupported message alert (#27) * feat: create alert message for unsupported message types * chore: fail message when try send not supported type in baileys * chore: add tests for unsupported message handling in Baileys service * chore: correct spelling * chore: NIT in spec name * chore: remove unnecessary message reload in unsupported message type test * feat: baileys support to send attachments (#28) * feat: enhance message sending logic with support for attachments and interactive messages * fix: update message format to use messageContent for text messages * feat: attachment message sending * fix: use strict encoding for attachment file download * chore: streamline message sending logic and remove unused error classes * chore: remove type from message sending logic * chore: update message sending specs * chore: raise MessageNotSentError instead of updating message status to failed * chore: change baileys contact name preferences (#30) * refactor: improve contact name handling and extraction from JID * test: enhance message handling to update contact names based on pushName and verifiedBizName * chore: update contact name condition to match phone number from JID * chore: correct method name typo * chore: correct variable names for phone number consistency in tests * chore: update message payload structure and improve error handling in send_message * test: re-add testing for error handling * feat: enhance contact name handling and add self-message detection * fix: ensure presence check for verified business name in contact name retrieval * test: improve specs --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai> * fix: try to disconnect baileys before destroy inbox (#29) * fix: ensure proper disconnection of Baileys provider on channel destruction * test: add callback tests for disconnecting channel provider in Whatsapp spec * refactor: simplify condition for disconnecting Baileys provider on channel destruction * refactor: enhance disconnect_channel_provider specs for Baileys provider * test: verify channel destruction does not call disconnect_channel_provider --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>
134 lines
4.9 KiB
Ruby
134 lines
4.9 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe Attachment do
|
|
let!(:message) { create(:message) }
|
|
|
|
describe 'external url validations' do
|
|
let(:attachment) { message.attachments.new(account_id: message.account_id, file_type: :image) }
|
|
|
|
before do
|
|
attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
|
|
end
|
|
|
|
context 'when it validates external url length' do
|
|
it 'valid when within limit' do
|
|
attachment.external_url = 'a' * Limits::URL_LENGTH_LIMIT
|
|
expect(attachment.valid?).to be true
|
|
end
|
|
|
|
it 'invalid when crossed the limit' do
|
|
attachment.external_url = 'a' * (Limits::URL_LENGTH_LIMIT + 5)
|
|
attachment.valid?
|
|
expect(attachment.errors[:external_url]).to include("is too long (maximum is #{Limits::URL_LENGTH_LIMIT} characters)")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'download_url' do
|
|
it 'returns valid download url' do
|
|
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
|
attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
|
|
expect(attachment.download_url).not_to be_nil
|
|
end
|
|
end
|
|
|
|
describe 'with_attached_file?' do
|
|
it 'returns true if its an attachment with file' do
|
|
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
|
attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png')
|
|
expect(attachment.with_attached_file?).to be true
|
|
end
|
|
|
|
it 'returns false if its an attachment with out a file' do
|
|
attachment = message.attachments.new(account_id: message.account_id, file_type: :fallback)
|
|
expect(attachment.with_attached_file?).to be false
|
|
end
|
|
end
|
|
|
|
describe 'push_event_data for instagram story mentions' do
|
|
let(:instagram_message) { create(:message, :instagram_story_mention) }
|
|
|
|
before do
|
|
# stubbing the request to facebook api during the message creation
|
|
stub_request(:get, %r{https://graph.facebook.com/.*}).to_return(status: 200, body: {
|
|
story: { mention: { link: 'http://graph.facebook.com/test-story-mention', id: '17920786367196703' } },
|
|
from: { username: 'Sender-id-1', id: 'Sender-id-1' },
|
|
id: 'instagram-message-id-1234'
|
|
}.to_json, headers: {})
|
|
end
|
|
|
|
it 'returns external url as data and thumb urls when message is incoming' do
|
|
external_url = instagram_message.attachments.first.external_url
|
|
expect(instagram_message.attachments.first.push_event_data[:data_url]).to eq external_url
|
|
end
|
|
|
|
it 'returns original attachment url as data url if the message is outgoing' do
|
|
message = create(:message, :instagram_story_mention, message_type: :outgoing)
|
|
expect(message.attachments.first.push_event_data[:data_url]).not_to eq message.attachments.first.external_url
|
|
end
|
|
end
|
|
|
|
describe 'meta data handling' do
|
|
let(:message) { create(:message) }
|
|
|
|
context 'when attachment is a contact type' do
|
|
let(:contact_attachment) do
|
|
message.attachments.create!(
|
|
account_id: message.account_id,
|
|
file_type: :contact,
|
|
fallback_title: '+1234567890',
|
|
meta: {
|
|
first_name: 'John',
|
|
last_name: 'Doe'
|
|
}
|
|
)
|
|
end
|
|
|
|
it 'stores and retrieves meta data correctly' do
|
|
expect(contact_attachment.meta['first_name']).to eq('John')
|
|
expect(contact_attachment.meta['last_name']).to eq('Doe')
|
|
end
|
|
|
|
it 'includes meta data in push_event_data' do
|
|
event_data = contact_attachment.push_event_data
|
|
expect(event_data[:meta]).to eq({
|
|
'first_name' => 'John',
|
|
'last_name' => 'Doe'
|
|
})
|
|
end
|
|
|
|
it 'returns empty hash for meta if not set' do
|
|
attachment = message.attachments.create!(
|
|
account_id: message.account_id,
|
|
file_type: :contact,
|
|
fallback_title: '+1234567890'
|
|
)
|
|
expect(attachment.push_event_data[:meta]).to eq({})
|
|
end
|
|
end
|
|
|
|
context 'when meta is used with other file types' do
|
|
let(:image_attachment) do
|
|
attachment = message.attachments.new(
|
|
account_id: message.account_id,
|
|
file_type: :image,
|
|
meta: { description: 'Test image' }
|
|
)
|
|
attachment.file.attach(
|
|
io: Rails.root.join('spec/assets/avatar.png').open,
|
|
filename: 'avatar.png',
|
|
content_type: 'image/png'
|
|
)
|
|
attachment.save!
|
|
attachment
|
|
end
|
|
|
|
it 'preserves meta data with file attachments' do
|
|
expect(image_attachment.meta['description']).to eq('Test image')
|
|
expect(image_attachment.file.filename.to_s).to eq('avatar.png')
|
|
expect(image_attachment.file.content_type).to eq('image/png')
|
|
end
|
|
end
|
|
end
|
|
end
|