diff --git a/lib/stripe.rb b/lib/stripe.rb index a7a6894c..d3a9b6a2 100644 --- a/lib/stripe.rb +++ b/lib/stripe.rb @@ -41,6 +41,7 @@ require 'stripe/card' require 'stripe/subscription' require 'stripe/application_fee' require 'stripe/refund' +require 'stripe/reversal' require 'stripe/application_fee_refund' require 'stripe/bitcoin_receiver' require 'stripe/bitcoin_transaction' diff --git a/lib/stripe/account.rb b/lib/stripe/account.rb index 163e7ca9..7f539b8e 100644 --- a/lib/stripe/account.rb +++ b/lib/stripe/account.rb @@ -14,7 +14,15 @@ module Stripe # @override To make id optional def self.retrieve(id=nil, opts={}) - super + # Account used to be a singleton, where this method's signature was `(opts={})`. + # For the sake of not breaking folks who pass in an OAuth key in opts, let's lurkily + # string match for it. + if opts == {} && id.is_a?(String) && id.start_with?('sk_') + # `super` properly assumes a String opts is the apiKey and normalizes as expected. + opts = id + id = nil + end + super(id, opts) end def deauthorize(client_id, opts={}) diff --git a/lib/stripe/reversal.rb b/lib/stripe/reversal.rb new file mode 100644 index 00000000..fdb1e050 --- /dev/null +++ b/lib/stripe/reversal.rb @@ -0,0 +1,14 @@ +module Stripe + class Reversal < APIResource + include Stripe::APIOperations::Update + include Stripe::APIOperations::List + + def url + "#{Transfer.url}/#{CGI.escape(transfer)}/reversals/#{CGI.escape(id)}" + end + + def self.retrieve(id, opts={}) + raise NotImplementedError.new("Reversals cannot be retrieved without a transfer ID. Retrieve a reversal using transfer.reversals.retrieve('reversal_id')") + end + end +end diff --git a/lib/stripe/util.rb b/lib/stripe/util.rb index b8f37277..2aa618a2 100644 --- a/lib/stripe/util.rb +++ b/lib/stripe/util.rb @@ -39,6 +39,7 @@ module Stripe 'subscription' => Subscription, 'file_upload' => FileUpload, 'transfer' => Transfer, + 'transfer_reversal' => Reversal, 'bitcoin_receiver' => BitcoinReceiver, 'bitcoin_transaction' => BitcoinTransaction } diff --git a/test/stripe/reversal_test.rb b/test/stripe/reversal_test.rb new file mode 100644 index 00000000..58707e8b --- /dev/null +++ b/test/stripe/reversal_test.rb @@ -0,0 +1,47 @@ +require File.expand_path('../../test_helper', __FILE__) + +module Stripe + class ReversalTest < Test::Unit::TestCase + should "reversals should be listable" do + @mock.expects(:get).once.returns(test_response(test_transfer)) + + transfer = Stripe::Transfer.retrieve('test_transfer') + + assert transfer.reversals.first.kind_of?(Stripe::Reversal) + end + + should "reversals should be refreshable" do + @mock.expects(:get).twice.returns(test_response(test_transfer), test_response(test_reversal(:id => 'refreshed_reversal'))) + + transfer = Stripe::Transfer.retrieve('test_transfer') + reversal = transfer.reversals.first + reversal.refresh + + assert_equal 'refreshed_reversal', reversal.id + end + + should "reversals should be updateable" do + @mock.expects(:get).once.returns(test_response(test_transfer)) + @mock.expects(:post).once.returns(test_response(test_reversal(:metadata => {'key' => 'value'}))) + + transfer = Stripe::Transfer.retrieve('test_transfer') + reversal = transfer.reversals.first + + assert_equal nil, reversal.metadata['key'] + + reversal.metadata['key'] = 'value' + reversal.save + + assert_equal 'value', reversal.metadata['key'] + end + + should "create should return a new reversal" do + @mock.expects(:get).once.returns(test_response(test_transfer)) + @mock.expects(:post).once.returns(test_response(test_reversal(:id => 'test_new_reversal'))) + + transfer = Stripe::Transfer.retrieve('test_transfer') + reversals = transfer.reversals.create(:amount => 20) + assert_equal 'test_new_reversal', reversals.id + end + end +end diff --git a/test/test_data.rb b/test/test_data.rb index 75a570bb..a7a4233d 100644 --- a/test/test_data.rb +++ b/test/test_data.rb @@ -254,6 +254,13 @@ module Stripe } end + def test_reversal_array(transfer_id) + { + :data => [test_reversal, test_reversal, test_reversal], + :object => 'list', + :url => '/v1/transfers/' + transfer_id + '/reversals' + } + end def test_invoice { @@ -359,6 +366,7 @@ module Stripe :fee => 0, :fee_details => [], :id => "tr_test_transfer", + :reversals => test_reversal_array('tr_test_transfer'), :livemode => false, :currency => "usd", :object => "transfer", @@ -381,6 +389,18 @@ module Stripe }) end + def test_reversal(params={}) + { + :object => 'transfer_reversal', + :amount => 30, + :currency => "usd", + :created => 1308595038, + :id => "ref_test_reversal", + :transfer => "tr_test_transfer", + :metadata => {} + }.merge(params) + end + def test_bitcoin_receiver(params={}) { :id => 'btcrcv_test_receiver',