From f2bfa1dbcba058e0e2f398f7814be3b5af238a10 Mon Sep 17 00:00:00 2001 From: Max Rozenoer Date: Tue, 28 May 2024 21:41:19 +0300 Subject: [PATCH 1/2] In Rails (some versions at least), nil responds to `:load` (via ActiveSupport::Dependencies::Loadable mixin). Enable default json decoder to work in this case --- lib/faraday/response/json.rb | 2 +- spec/faraday/response/json_spec.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/faraday/response/json.rb b/lib/faraday/response/json.rb index eaae6bc2..3aad5146 100644 --- a/lib/faraday/response/json.rb +++ b/lib/faraday/response/json.rb @@ -60,7 +60,7 @@ def process_parser_options @decoder_options = if @decoder_options.is_a?(Array) && @decoder_options.size >= 2 @decoder_options.slice(0, 2) - elsif @decoder_options.respond_to?(:load) + elsif @decoder_options&.respond_to?(:load) [@decoder_options, :load] else [::JSON, :parse] diff --git a/spec/faraday/response/json_spec.rb b/spec/faraday/response/json_spec.rb index 6108c5fd..775c1dfb 100644 --- a/spec/faraday/response/json_spec.rb +++ b/spec/faraday/response/json_spec.rb @@ -184,6 +184,23 @@ def process(body, content_type = 'application/json', options = {}) response = process(body) expect(response.body).to eq(result) end + + it 'passes relevant options to JSON parse even when nil responds to :load' do + original_allow_message_expectations_on_nil = RSpec::Mocks.configuration.allow_message_expectations_on_nil + RSpec::Mocks.configuration.allow_message_expectations_on_nil = true + allow(nil).to receive(:respond_to?) + .with(:load) + .and_return(true) + + expect(JSON).to receive(:parse) + .with(body, { symbolize_names: true }) + .and_return(result) + + response = process(body) + expect(response.body).to eq(result) + ensure + RSpec::Mocks.configuration.allow_message_expectations_on_nil = original_allow_message_expectations_on_nil + end end end end From b80e1a724d567dc7cea2223082877a87bddf092f Mon Sep 17 00:00:00 2001 From: Max Rozenoer Date: Wed, 5 Jun 2024 16:35:12 +0300 Subject: [PATCH 2/2] Fix Rubocop/code review comments --- lib/faraday/response/json.rb | 3 ++- spec/faraday/response/json_spec.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/faraday/response/json.rb b/lib/faraday/response/json.rb index 3aad5146..71a57edb 100644 --- a/lib/faraday/response/json.rb +++ b/lib/faraday/response/json.rb @@ -60,7 +60,8 @@ def process_parser_options @decoder_options = if @decoder_options.is_a?(Array) && @decoder_options.size >= 2 @decoder_options.slice(0, 2) - elsif @decoder_options&.respond_to?(:load) + elsif @decoder_options&.respond_to?(:load) # rubocop:disable Lint/RedundantSafeNavigation + # In some versions of Rails, `nil` responds to `load` - hence the safe navigation check above [@decoder_options, :load] else [::JSON, :parse] diff --git a/spec/faraday/response/json_spec.rb b/spec/faraday/response/json_spec.rb index 775c1dfb..e6cbda39 100644 --- a/spec/faraday/response/json_spec.rb +++ b/spec/faraday/response/json_spec.rb @@ -198,7 +198,7 @@ def process(body, content_type = 'application/json', options = {}) response = process(body) expect(response.body).to eq(result) - ensure + ensure RSpec::Mocks.configuration.allow_message_expectations_on_nil = original_allow_message_expectations_on_nil end end