From 5f1ddf2a96e3ff2b0c04ef92467749d5bfaaf6ca Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Mon, 12 Feb 2018 11:20:19 -0800 Subject: [PATCH] Skip calling to_hash for nil --- lib/stripe/stripe_object.rb | 2 +- test/stripe/stripe_object_test.rb | 47 +++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/lib/stripe/stripe_object.rb b/lib/stripe/stripe_object.rb index 18300480..85827ffb 100644 --- a/lib/stripe/stripe_object.rb +++ b/lib/stripe/stripe_object.rb @@ -116,7 +116,7 @@ module Stripe def to_hash maybe_to_hash = lambda do |value| - value.respond_to?(:to_hash) ? value.to_hash : value + value && value.respond_to?(:to_hash) ? value.to_hash : value end @values.each_with_object({}) do |(key, value), acc| diff --git a/test/stripe/stripe_object_test.rb b/test/stripe/stripe_object_test.rb index 5e6429f5..75f6d04f 100644 --- a/test/stripe/stripe_object_test.rb +++ b/test/stripe/stripe_object_test.rb @@ -115,23 +115,40 @@ module Stripe end end - should "recursively call to_hash on its values" do - # deep nested hash (when contained in an array) or StripeObject - nested_hash = { id: 7, foo: "bar" } - nested = Stripe::StripeObject.construct_from(nested_hash) + context "#to_hash" do + should "skip calling to_hash on nil" do + module NilWithToHash + def to_hash + raise "Can't call to_hash on nil" + end + end + # include is private in Ruby 2.0 + NilClass.send(:include, NilWithToHash) - obj = Stripe::StripeObject.construct_from(id: 1, - # simple hash that contains a StripeObject to help us test deep - # recursion - nested: { object: "list", data: [nested] }, - list: [nested]) + hash_with_nil = { id: 3, foo: nil } + obj = StripeObject.construct_from(hash_with_nil) + expected_hash = { id: 3, foo: nil } + assert_equal expected_hash, obj.to_hash + end - expected_hash = { - id: 1, - nested: { object: "list", data: [nested_hash] }, - list: [nested_hash], - } - assert_equal expected_hash, obj.to_hash + should "recursively call to_hash on its values" do + # deep nested hash (when contained in an array) or StripeObject + nested_hash = { id: 7, foo: "bar" } + nested = Stripe::StripeObject.construct_from(nested_hash) + + obj = Stripe::StripeObject.construct_from(id: 1, + # simple hash that contains a StripeObject to help us test deep + # recursion + nested: { object: "list", data: [nested] }, + list: [nested]) + + expected_hash = { + id: 1, + nested: { object: "list", data: [nested_hash] }, + list: [nested_hash], + } + assert_equal expected_hash, obj.to_hash + end end should "assign question mark accessors for booleans" do