diff --git a/lib/integrations/dialogflow/processor_service.rb b/lib/integrations/dialogflow/processor_service.rb index cb75bc78f..7a425be68 100644 --- a/lib/integrations/dialogflow/processor_service.rb +++ b/lib/integrations/dialogflow/processor_service.rb @@ -39,14 +39,22 @@ class Integrations::Dialogflow::ProcessorService end def process_response(message, response) - text_response = response.query_result['fulfillment_text'] + fulfillment_messages = response.query_result['fulfillment_messages'] + fulfillment_messages.each do |fulfillment_message| + content_params = generate_content_params(fulfillment_message) + if content_params['action'].present? + process_action(message, content_params['action']) + else + create_conversation(message, content_params) + end + end + end - content_params = { content: text_response } if text_response.present? - content_params ||= response.query_result['fulfillment_messages'].first['payload'].to_h - - process_action(message, content_params['action']) and return if content_params['action'].present? - - create_conversation(message, content_params) + def generate_content_params(fulfillment_message) + text_response = fulfillment_message['text'].to_h + content_params = { content: text_response[:text].first } if text_response[:text].present? + content_params ||= fulfillment_message['payload'].to_h + content_params end def create_conversation(message, content_params) diff --git a/spec/lib/integrations/dialogflow/processor_service_spec.rb b/spec/lib/integrations/dialogflow/processor_service_spec.rb index ca852a943..c0c6ac795 100644 --- a/spec/lib/integrations/dialogflow/processor_service_spec.rb +++ b/spec/lib/integrations/dialogflow/processor_service_spec.rb @@ -7,12 +7,15 @@ describe Integrations::Dialogflow::ProcessorService do let(:message) { create(:message, account: account, conversation: conversation) } let(:event_name) { 'message.created' } let(:event_data) { { message: message } } + let(:dialogflow_text_double) { double } describe '#perform' do let(:dialogflow_service) { double } let(:dialogflow_response) do ActiveSupport::HashWithIndifferentAccess.new( - fulfillment_text: 'hello' + fulfillment_messages: [ + { text: dialogflow_text_double } + ] ) end @@ -21,23 +24,26 @@ describe Integrations::Dialogflow::ProcessorService do before do allow(dialogflow_service).to receive(:query_result).and_return(dialogflow_response) allow(processor).to receive(:get_dialogflow_response).and_return(dialogflow_service) + allow(dialogflow_text_double).to receive(:to_h).and_return({ text: ['hello payload'] }) end context 'when valid message and dialogflow returns fullfillment text' do it 'creates the response message' do - expect(processor.perform.content).to eql('hello') + processor.perform + expect(conversation.reload.messages.last.content).to eql('hello payload') end end context 'when dialogflow returns fullfillment text to be empty' do let(:dialogflow_response) do ActiveSupport::HashWithIndifferentAccess.new( - fulfillment_messages: [{ payload: { content: 'hello payload' } }] + fulfillment_messages: [{ payload: { content: 'hello payload random' } }] ) end it 'creates the response message based on fulfillment messages' do - expect(processor.perform.content).to eql('hello payload') + processor.perform + expect(conversation.reload.messages.last.content).to eql('hello payload random') end end @@ -54,6 +60,20 @@ describe Integrations::Dialogflow::ProcessorService do end end + context 'when dialogflow returns action and messages if available' do + let(:dialogflow_response) do + ActiveSupport::HashWithIndifferentAccess.new( + fulfillment_messages: [{ payload: { action: 'handoff' } }, { text: dialogflow_text_double }] + ) + end + + it 'handsoff the conversation to agent' do + processor.perform + expect(conversation.reload.status).to eql('open') + expect(conversation.messages.last.content).to eql('hello payload') + end + end + context 'when conversation is not bot' do let(:conversation) { create(:conversation, account: account, status: :open) }