diff --git a/app/listeners/webhook_listener.rb b/app/listeners/webhook_listener.rb index 6463f29b6..98a694f2c 100644 --- a/app/listeners/webhook_listener.rb +++ b/app/listeners/webhook_listener.rb @@ -22,6 +22,13 @@ class WebhookListener < BaseListener deliver_webhook_payloads(payload, inbox) end + def conversation_created(event) + conversation = extract_conversation_and_account(event)[0] + inbox = conversation.inbox + payload = conversation.webhook_data.merge(event: __method__.to_s) + deliver_webhook_payloads(payload, inbox) + end + def message_created(event) message = extract_message_and_account(event)[0] inbox = message.inbox diff --git a/spec/listeners/webhook_listener_spec.rb b/spec/listeners/webhook_listener_spec.rb index cb06dd6c0..0bebc8d15 100644 --- a/spec/listeners/webhook_listener_spec.rb +++ b/spec/listeners/webhook_listener_spec.rb @@ -10,7 +10,8 @@ describe WebhookListener do create(:message, message_type: 'outgoing', account: account, inbox: inbox, conversation: conversation) end - let!(:event) { Events::Base.new(event_name, Time.zone.now, message: message) } + let!(:message_created_event) { Events::Base.new(event_name, Time.zone.now, message: message) } + let!(:conversation_created_event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) } describe '#message_created' do let(:event_name) { :'message.created' } @@ -18,7 +19,7 @@ describe WebhookListener do context 'when webhook is not configured' do it 'does not trigger webhook' do expect(WebhookJob).to receive(:perform_later).exactly(0).times - listener.message_created(event) + listener.message_created(message_created_event) end end @@ -26,7 +27,7 @@ describe WebhookListener do it 'triggers webhook' do webhook = create(:webhook, inbox: inbox, account: account) expect(WebhookJob).to receive(:perform_later).with(webhook.url, message.webhook_data.merge(event: 'message_created')).once - listener.message_created(event) + listener.message_created(message_created_event) end end @@ -64,4 +65,44 @@ describe WebhookListener do end end end + + describe '#conversation_created' do + let(:event_name) { :'conversation.created' } + + context 'when webhook is not configured' do + it 'does not trigger webhook' do + expect(WebhookJob).to receive(:perform_later).exactly(0).times + listener.conversation_created(conversation_created_event) + end + end + + context 'when webhook is configured' do + it 'triggers webhook' do + webhook = create(:webhook, inbox: inbox, account: account) + expect(WebhookJob).to receive(:perform_later).with(webhook.url, conversation.webhook_data.merge(event: 'conversation_created')).once + listener.conversation_created(conversation_created_event) + end + end + + context 'when inbox is an API Channel' do + it 'triggers webhook if webhook_url is present' do + channel_api = create(:channel_api, account: account) + api_inbox = channel_api.inbox + api_conversation = create(:conversation, account: account, inbox: api_inbox, assignee: user) + api_event = Events::Base.new(event_name, Time.zone.now, conversation: api_conversation) + expect(WebhookJob).to receive(:perform_later).with(channel_api.webhook_url, + api_conversation.webhook_data.merge(event: 'conversation_created')).once + listener.conversation_created(api_event) + end + + it 'does not trigger webhook if webhook_url is not present' do + channel_api = create(:channel_api, webhook_url: nil, account: account) + api_inbox = channel_api.inbox + api_conversation = create(:conversation, account: account, inbox: api_inbox, assignee: user) + api_event = Events::Base.new(event_name, Time.zone.now, conversation: api_conversation) + expect(WebhookJob).not_to receive(:perform_later) + listener.conversation_created(api_event) + end + end + end end