From d71cda7adf8333c5017ad81b3bb5023cdac84470 Mon Sep 17 00:00:00 2001 From: Brandur Date: Mon, 15 Jul 2019 16:32:21 -0700 Subject: [PATCH] Better error message when passing non-string to custom method Raises a slightly more helpful error message when passing a non-string to a custom method (currently, it reads "no implicit conversion of Hash into String", which is terrible). This a partial remediation for the problem encountered in #809. --- lib/stripe/api_resource.rb | 5 +++++ test/stripe/api_resource_test.rb | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/stripe/api_resource.rb b/lib/stripe/api_resource.rb index 058fa12f3..a6a50f5ef 100644 --- a/lib/stripe/api_resource.rb +++ b/lib/stripe/api_resource.rb @@ -70,6 +70,11 @@ def self.custom_method(name, http_verb:, http_path: nil) end http_path ||= name.to_s define_singleton_method(name) do |id, params = {}, opts = {}| + unless id.is_a?(String) + raise ArgumentError, + "id should be a string representing the ID of an API resource" + end + url = "#{resource_url}/#{CGI.escape(id)}/#{CGI.escape(http_path)}" resp, opts = request(http_verb, url, params, opts) Util.convert_to_stripe_object(resp.data, opts) diff --git a/test/stripe/api_resource_test.rb b/test/stripe/api_resource_test.rb index 9d3fe1f06..7d9c47e7e 100644 --- a/test/stripe/api_resource_test.rb +++ b/test/stripe/api_resource_test.rb @@ -4,10 +4,31 @@ module Stripe class ApiResourceTest < Test::Unit::TestCase + class CustomMethodAPIResource < APIResource + OBJECT_NAME = "custom_method".freeze + custom_method :my_method, http_verb: :post + end + class NestedTestAPIResource < APIResource save_nested_resource :external_account end + context ".custom_method" do + should "call to an RPC-style method" do + stub_request(:post, "#{Stripe.api_base}/v1/custom_methods/ch_123/my_method") + .to_return(body: JSON.generate({})) + CustomMethodAPIResource.my_method("ch_123") + end + + should "raise an error if a non-ID is passed" do + e = assert_raises ArgumentError do + CustomMethodAPIResource.my_method(id: "ch_123") + end + assert_equal "id should be a string representing the ID of an API resource", + e.message + end + end + context ".save_nested_resource" do should "can have a scalar set" do r = NestedTestAPIResource.new("test_resource")