feat: Handle instagram test service (#11244)

This PR will handle the Instagram test events. We are using the last
created Instagram channel as the test channel since we don't have any
other channels for testing purposes at the time of Meta approval.



https://github.com/user-attachments/assets/98302b7a-d72c-4950-9660-861a5e08d55f

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
This commit is contained in:
Muhsin Keloth
2025-04-11 19:11:29 +05:30
committed by GitHub
parent 50344a282b
commit bdcb080e40
4 changed files with 199 additions and 0 deletions

View File

@@ -361,4 +361,34 @@ FactoryBot.define do
end
initialize_with { attributes }
end
factory :instagram_test_event, class: Hash do
entry do
[
{
'id': '0',
'time': '2021-09-08T06:34:04+0000',
'changes': [
{
'field': 'messages',
'value': {
'sender': {
'id': '12334'
},
'recipient': {
'id': '23245'
},
'timestamp': '1527459824',
'message': {
'mid': 'random_mid',
'text': 'random_text'
}
}
}
]
}
]
end
initialize_with { attributes }
end
end

View File

@@ -0,0 +1,71 @@
require 'rails_helper'
describe Instagram::TestEventService do
let(:account) { create(:account) }
let(:instagram_channel) { create(:channel_instagram, account: account) }
let(:inbox) { create(:inbox, channel: instagram_channel, account: account) }
describe '#perform' do
context 'when validating test webhook event' do
let(:test_messaging) do
{
'sender': {
'id': '12334'
},
'recipient': {
'id': '23245'
},
'timestamp': '1527459824',
'message': {
'mid': 'random_mid',
'text': 'random_text'
}
}.with_indifferent_access
end
it 'creates test message for valid test webhook event' do
# Ensure inbox exists before test
inbox
service = described_class.new(test_messaging)
expect { service.perform }.to change(Message, :count).by(1)
message = Message.last
expect(message.content).to eq('random_text')
expect(message.source_id).to eq('random_mid')
expect(message.message_type).to eq('incoming')
end
it 'creates a contact with sender_username' do
# Ensure inbox exists before test
inbox
service = described_class.new(test_messaging)
service.perform
contact = Contact.last
expect(contact.name).to eq('sender_username')
end
it 'returns false for non-test webhook events' do
invalid_messaging = test_messaging.deep_dup
invalid_messaging[:sender][:id] = 'different_id'
service = described_class.new(invalid_messaging)
expect(service.perform).to be(false)
end
it 'returns nil when no Instagram channel exists' do
# Delete all inboxes and channels
Inbox.destroy_all
Channel::Instagram.destroy_all
service = described_class.new(test_messaging)
expect(service.perform).to be_nil
end
end
end
end