mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-11-30 00:00:47 -05:00
Store the HTTP status code, HTTP body, and parsed JSON body on exceptions
This commit is contained in:
parent
e05c49350b
commit
cfef69ac06
@ -442,14 +442,26 @@ module Stripe
|
|||||||
include Stripe::APIOperations::Create
|
include Stripe::APIOperations::Create
|
||||||
end
|
end
|
||||||
|
|
||||||
class StripeError < StandardError; end
|
class StripeError < StandardError
|
||||||
|
attr_reader :message
|
||||||
|
attr_reader :http_status
|
||||||
|
attr_reader :http_body
|
||||||
|
attr_reader :json_body
|
||||||
|
|
||||||
|
def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil)
|
||||||
|
@message = message
|
||||||
|
@http_status = http_status
|
||||||
|
@http_body = http_body
|
||||||
|
@json_body = json_body
|
||||||
|
end
|
||||||
|
end
|
||||||
class APIError < StripeError; end
|
class APIError < StripeError; end
|
||||||
class APIConnectionError < StripeError; end
|
class APIConnectionError < StripeError; end
|
||||||
class CardError < StripeError
|
class CardError < StripeError
|
||||||
attr_reader :param, :code
|
attr_reader :param, :code
|
||||||
|
|
||||||
def initialize(message, param, code)
|
def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil)
|
||||||
super(message)
|
super(message, http_status, http_body, json_body)
|
||||||
@param = param
|
@param = param
|
||||||
@code = code
|
@code = code
|
||||||
end
|
end
|
||||||
@ -457,8 +469,8 @@ module Stripe
|
|||||||
class InvalidRequestError < StripeError
|
class InvalidRequestError < StripeError
|
||||||
attr_accessor :param
|
attr_accessor :param
|
||||||
|
|
||||||
def initialize(message, param)
|
def initialize(message, param, http_status=nil, http_body=nil, json_body=nil)
|
||||||
super(message)
|
super(message, http_status, http_body, json_body)
|
||||||
@param = param
|
@param = param
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -568,7 +580,7 @@ module Stripe
|
|||||||
# some library out there that makes symbolize_names not work.
|
# some library out there that makes symbolize_names not work.
|
||||||
resp = JSON.parse(rbody)
|
resp = JSON.parse(rbody)
|
||||||
rescue JSON::ParserError
|
rescue JSON::ParserError
|
||||||
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})")
|
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
|
||||||
end
|
end
|
||||||
|
|
||||||
resp = Util.symbolize_names(resp)
|
resp = Util.symbolize_names(resp)
|
||||||
@ -585,27 +597,27 @@ module Stripe
|
|||||||
begin
|
begin
|
||||||
error_obj = JSON.parse(rbody)
|
error_obj = JSON.parse(rbody)
|
||||||
error_obj = Util.symbolize_names(error_obj)
|
error_obj = Util.symbolize_names(error_obj)
|
||||||
error = error_obj[:error] or raise StripeError.new
|
error = error_obj[:error] or raise StripeError.new # escape from parsing
|
||||||
rescue JSON::ParserError, StripeError
|
rescue JSON::ParserError, StripeError
|
||||||
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})")
|
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
|
||||||
end
|
end
|
||||||
|
|
||||||
case rcode
|
case rcode
|
||||||
when 400, 404 then
|
when 400, 404 then
|
||||||
raise invalid_request_error(error)
|
raise invalid_request_error(error, rcode, rbody, error_obj)
|
||||||
when 401
|
when 401
|
||||||
raise authentication_error(error)
|
raise authentication_error(error, rcode, rbody, error_obj)
|
||||||
when 402
|
when 402
|
||||||
raise card_error(error)
|
raise card_error(error, rcode, rbody, error_obj)
|
||||||
else
|
else
|
||||||
raise api_error(error)
|
raise api_error(error, rcode, rbody, error_obj)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.invalid_request_error(error); InvalidRequestError.new(error[:message], error[:param]); end
|
def self.invalid_request_error(error, rcode, rbody, error_obj); InvalidRequestError.new(error[:message], error[:param], rcode, rbody, error_obj); end
|
||||||
def self.authentication_error(error); AuthenticationError.new(error[:message]); end
|
def self.authentication_error(error, rcode, rbody, error_obj); AuthenticationError.new(error[:message], rcode, rbody, error_obj); end
|
||||||
def self.card_error(error); CardError.new(error[:message], error[:param], error[:code]); end
|
def self.card_error(error, rcode, rbody, error_obj); CardError.new(error[:message], error[:param], error[:code], rcode, rbody, error_obj); end
|
||||||
def self.api_error(error); APIError.new(error[:message]); end
|
def self.api_error(error, rcode, rbody, error_obj); APIError.new(error[:message], rcode, rbody, error_obj); end
|
||||||
|
|
||||||
def self.handle_restclient_error(e)
|
def self.handle_restclient_error(e)
|
||||||
case e
|
case e
|
||||||
|
|||||||
@ -73,13 +73,14 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "not specifying api credentials should raise an exception" do
|
should "not specifying api credentials should raise an exception" do
|
||||||
|
Stripe.api_key = nil
|
||||||
assert_raises Stripe::AuthenticationError do
|
assert_raises Stripe::AuthenticationError do
|
||||||
Stripe::Customer.new("test_customer").refresh
|
Stripe::Customer.new("test_customer").refresh
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
should "specifying invalid api credentials should raise an exception" do
|
should "specifying invalid api credentials should raise an exception" do
|
||||||
Stripe.api_key="invalid"
|
Stripe.api_key = "invalid"
|
||||||
response = test_response(test_invalid_api_key_error, 401)
|
response = test_response(test_invalid_api_key_error, 401)
|
||||||
assert_raises Stripe::AuthenticationError do
|
assert_raises Stripe::AuthenticationError do
|
||||||
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
|
||||||
@ -87,6 +88,20 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "AuthenticationErrors should have an http status, http body, and JSON body" do
|
||||||
|
Stripe.api_key = "invalid"
|
||||||
|
response = test_response(test_invalid_api_key_error, 401)
|
||||||
|
begin
|
||||||
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
|
||||||
|
Stripe::Customer.retrieve("failing_customer")
|
||||||
|
rescue Stripe::AuthenticationError => e
|
||||||
|
assert_equal(401, e.http_status)
|
||||||
|
assert_equal(true, !!e.http_body)
|
||||||
|
assert_equal(true, !!e.json_body[:error][:message])
|
||||||
|
assert_equal(test_invalid_api_key_error['error']['message'], e.json_body[:error][:message])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "with valid credentials" do
|
context "with valid credentials" do
|
||||||
setup do
|
setup do
|
||||||
Stripe.api_key="foo"
|
Stripe.api_key="foo"
|
||||||
@ -96,6 +111,54 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
Stripe.api_key=nil
|
Stripe.api_key=nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "a 400 should give an InvalidRequestError with http status, body, and JSON body" do
|
||||||
|
response = test_response(test_missing_id_error, 400)
|
||||||
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
|
begin
|
||||||
|
Stripe::Customer.retrieve("foo")
|
||||||
|
rescue Stripe::InvalidRequestError => e
|
||||||
|
assert_equal(400, e.http_status)
|
||||||
|
assert_equal(true, !!e.http_body)
|
||||||
|
assert_equal(true, e.json_body.kind_of?(Hash))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "a 401 should give an AuthenticationError with http status, body, and JSON body" do
|
||||||
|
response = test_response(test_missing_id_error, 401)
|
||||||
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
|
begin
|
||||||
|
Stripe::Customer.retrieve("foo")
|
||||||
|
rescue Stripe::AuthenticationError => e
|
||||||
|
assert_equal(401, e.http_status)
|
||||||
|
assert_equal(true, !!e.http_body)
|
||||||
|
assert_equal(true, e.json_body.kind_of?(Hash))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "a 402 should give a CardError with http status, body, and JSON body" do
|
||||||
|
response = test_response(test_missing_id_error, 402)
|
||||||
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
|
begin
|
||||||
|
Stripe::Customer.retrieve("foo")
|
||||||
|
rescue Stripe::CardError => e
|
||||||
|
assert_equal(402, e.http_status)
|
||||||
|
assert_equal(true, !!e.http_body)
|
||||||
|
assert_equal(true, e.json_body.kind_of?(Hash))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "a 404 should give an InvalidRequestError with http status, body, and JSON body" do
|
||||||
|
response = test_response(test_missing_id_error, 404)
|
||||||
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
|
begin
|
||||||
|
Stripe::Customer.retrieve("foo")
|
||||||
|
rescue Stripe::InvalidRequestError => e
|
||||||
|
assert_equal(404, e.http_status)
|
||||||
|
assert_equal(true, !!e.http_body)
|
||||||
|
assert_equal(true, e.json_body.kind_of?(Hash))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
should "setting a nil value for a param should exclude that param from the request" do
|
should "setting a nil value for a param should exclude that param from the request" do
|
||||||
@mock.expects(:get).with('https://api.stripe.com/v1/charges', { :offset => 5, :sad => false }, nil).returns(test_response({ :count => 1, :data => [test_charge] }))
|
@mock.expects(:get).with('https://api.stripe.com/v1/charges', { :offset => 5, :sad => false }, nil).returns(test_response({ :count => 1, :data => [test_charge] }))
|
||||||
c = Stripe::Charge.all(:count => nil, :offset => 5, :sad => false)
|
c = Stripe::Charge.all(:count => nil, :offset => 5, :sad => false)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user