diff --git a/lib/apimatic-core/response_handler.rb b/lib/apimatic-core/response_handler.rb index 3e80594..2989b83 100644 --- a/lib/apimatic-core/response_handler.rb +++ b/lib/apimatic-core/response_handler.rb @@ -16,6 +16,7 @@ def initialize @is_date_response = false @is_response_array = false @is_response_void = false + @is_nullable_response = false end # Sets deserializer for the response. @@ -138,6 +139,14 @@ def is_response_void(is_response_void) @is_response_void = is_response_void self end + + # Sets the is_nullable_response property. + # @param [Boolean] is_nullable_response Flag to return early in case of empty response payload. + # @return [ResponseHandler] An updated instance of ResponseHandler. + def is_nullable_response(is_nullable_response) + @is_nullable_response = is_nullable_response + self + end # rubocop:enable Naming/PredicateName # Main method to handle the response with all the set properties. @@ -191,7 +200,7 @@ def apply_xml_deserializer(response) # Applies deserializer to the response. # @param [Boolean] should_symbolize_hash Flag to symbolize the hash during response deserialization. def apply_deserializer(response, should_symbolize_hash) - return if response.raw_body.nil? || response.raw_body.to_s.strip.empty? + return if @is_nullable_response && (response.raw_body.nil? || response.raw_body.to_s.strip.empty?) return apply_xml_deserializer(response) if @is_xml_response return response.raw_body if @deserializer.nil? diff --git a/test/test-apimatic-core/response_handler_test.rb b/test/test-apimatic-core/response_handler_test.rb index e2b37a8..2046266 100644 --- a/test/test-apimatic-core/response_handler_test.rb +++ b/test/test-apimatic-core/response_handler_test.rb @@ -331,10 +331,55 @@ def test_empty_response_body response_body.to_i end) .handle(response_mock, MockHelper.get_global_errors) + expected_response = 0 + + refute_nil actual_response + assert_equal expected_response, actual_response + + actual_response = @response_handler + .deserializer(ApiHelper.method(:custom_type_deserializer)) + .deserialize_into(Validate.method(:from_hash)) + .handle(response_mock, MockHelper.get_global_errors) + + assert_nil actual_response + + response_body_mock = ' ' + response_mock = MockHelper.create_response status_code: 200, + raw_body: response_body_mock + actual_response = @response_handler.deserializer(ApiHelper.method(:deserialize_primitive_types)) + .is_primitive_response(true) + .deserialize_into(proc do |response_body| + response_body.to_i + end) + .handle(response_mock, MockHelper.get_global_errors) + + refute_nil actual_response + assert_equal expected_response, actual_response + + actual_response = @response_handler + .deserializer(ApiHelper.method(:custom_type_deserializer)) + .deserialize_into(Validate.method(:from_hash)) + .handle(response_mock, MockHelper.get_global_errors) + + assert_nil actual_response + end + + def test_empty_response_body_with_nullable_response_flag + response_body_mock = '' + response_mock = MockHelper.create_response status_code: 200, + raw_body: response_body_mock + actual_response = @response_handler.deserializer(ApiHelper.method(:deserialize_primitive_types)) + .is_primitive_response(true) + .is_nullable_response(true) + .deserialize_into(proc do |response_body| + response_body.to_i + end) + .handle(response_mock, MockHelper.get_global_errors) assert_nil actual_response actual_response = @response_handler + .is_nullable_response(true) .deserializer(ApiHelper.method(:custom_type_deserializer)) .deserialize_into(Validate.method(:from_hash)) .handle(response_mock, MockHelper.get_global_errors) @@ -345,6 +390,7 @@ def test_empty_response_body response_mock = MockHelper.create_response status_code: 200, raw_body: response_body_mock actual_response = @response_handler.deserializer(ApiHelper.method(:deserialize_primitive_types)) + .is_nullable_response(true) .is_primitive_response(true) .deserialize_into(proc do |response_body| response_body.to_i @@ -354,6 +400,7 @@ def test_empty_response_body assert_nil actual_response actual_response = @response_handler + .is_nullable_response(true) .deserializer(ApiHelper.method(:custom_type_deserializer)) .deserialize_into(Validate.method(:from_hash)) .handle(response_mock, MockHelper.get_global_errors)