mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-10-10 00:02:25 -04:00
Fix for updating subscriptions.
Also switches tests to 'shoulda' from 'context'.
This commit is contained in:
parent
e5e57bf992
commit
98a5766381
@ -314,7 +314,7 @@ module Stripe
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update_subscription(params)
|
def update_subscription(params)
|
||||||
response, api_key = Stripe.request(:post, subscription_url, @api_key)
|
response, api_key = Stripe.request(:post, subscription_url, @api_key, params)
|
||||||
refresh_from({ :subscription => response }, api_key, true)
|
refresh_from({ :subscription => response }, api_key, true)
|
||||||
subscription
|
subscription
|
||||||
end
|
end
|
||||||
|
@ -97,6 +97,27 @@ def test_card(params={})
|
|||||||
}.merge(params)
|
}.merge(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#FIXME nested overrides would be better than hardcoding plan_id
|
||||||
|
def test_subscription(plan_id="gold")
|
||||||
|
{
|
||||||
|
:current_period_end => 1308681468,
|
||||||
|
:status => "trialing",
|
||||||
|
:plan => {
|
||||||
|
:interval => "month",
|
||||||
|
:amount => 7500,
|
||||||
|
:trial_period_days => 30,
|
||||||
|
:object => "plan",
|
||||||
|
:identifier => plan_id
|
||||||
|
},
|
||||||
|
:current_period_start => 1308595038,
|
||||||
|
:start => 1308595038,
|
||||||
|
:object => "subscription",
|
||||||
|
:trial_start => 1308595038,
|
||||||
|
:trial_end => 1308681468,
|
||||||
|
:customer => "c_test_customer"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def test_invalid_api_key_error
|
def test_invalid_api_key_error
|
||||||
{
|
{
|
||||||
"error" => {
|
"error" => {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
require File.dirname(__FILE__) + '/test_helper.rb'
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
require 'context'
|
require 'shoulda'
|
||||||
require 'mocha'
|
require 'mocha'
|
||||||
require 'pp'
|
require 'pp'
|
||||||
require 'rest-client'
|
require 'rest-client'
|
||||||
@ -10,21 +10,21 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
include Mocha
|
include Mocha
|
||||||
|
|
||||||
context "API Bindings" do
|
context "API Bindings" do
|
||||||
before do
|
setup do
|
||||||
@mock = mock
|
@mock = mock
|
||||||
Stripe.mock_rest_client = @mock
|
Stripe.mock_rest_client = @mock
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
teardown do
|
||||||
Stripe.mock_rest_client = nil
|
Stripe.mock_rest_client = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
test "creating a new APIResource should not fetch over the network" do
|
should "creating a new APIResource should not fetch over the network" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
c = Stripe::Customer.new("someid")
|
c = Stripe::Customer.new("someid")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "creating a new APIResource from a hash should not fetch over the network" do
|
should "creating a new APIResource from a hash should not fetch over the network" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
c = Stripe::Customer.construct_from({
|
c = Stripe::Customer.construct_from({
|
||||||
:id => "somecustomer",
|
:id => "somecustomer",
|
||||||
@ -33,26 +33,26 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "setting an attribute should not cause a network request" do
|
should "setting an attribute should not cause a network request" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
@mock.expects(:post).never
|
@mock.expects(:post).never
|
||||||
c = Stripe::Customer.new("test_customer");
|
c = Stripe::Customer.new("test_customer");
|
||||||
c.card = {:id => "somecard", :object => "card"}
|
c.card = {:id => "somecard", :object => "card"}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "accessing id should not issue a fetch" do
|
should "accessing id should not issue a fetch" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
c = Stripe::Customer.new("test_customer");
|
c = Stripe::Customer.new("test_customer");
|
||||||
c.id
|
c.id
|
||||||
end
|
end
|
||||||
|
|
||||||
test "not specifying api credentials should raise an exception" do
|
should "not specifying api credentials should raise an exception" do
|
||||||
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
|
||||||
|
|
||||||
test "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
|
||||||
@ -62,33 +62,33 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "with valid credentials" do
|
context "with valid credentials" do
|
||||||
before do
|
setup do
|
||||||
Stripe.api_key="foo"
|
Stripe.api_key="foo"
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
teardown do
|
||||||
Stripe.api_key=nil
|
Stripe.api_key=nil
|
||||||
end
|
end
|
||||||
|
|
||||||
test "requesting with a unicode ID should result in a request" do
|
should "requesting with a unicode ID should result in a request" do
|
||||||
response = test_response(test_missing_id_error, 404)
|
response = test_response(test_missing_id_error, 404)
|
||||||
@mock.expects(:get).once.with("https://api.stripe.com/v1/customers/%E2%98%83").raises(RestClient::ExceptionWithResponse.new(response, 404))
|
@mock.expects(:get).once.with("https://api.stripe.com/v1/customers/%E2%98%83").raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
c = Stripe::Customer.new("☃")
|
c = Stripe::Customer.new("☃")
|
||||||
assert_raises(Stripe::InvalidRequestError) { c.refresh }
|
assert_raises(Stripe::InvalidRequestError) { c.refresh }
|
||||||
end
|
end
|
||||||
|
|
||||||
test "requesting with no ID shuold result in an InvalidRequestError with no request" do
|
should "requesting with no ID shuold result in an InvalidRequestError with no request" do
|
||||||
c = Stripe::Customer.new
|
c = Stripe::Customer.new
|
||||||
assert_raises(Stripe::InvalidRequestError) { c.refresh }
|
assert_raises(Stripe::InvalidRequestError) { c.refresh }
|
||||||
end
|
end
|
||||||
|
|
||||||
test "loading an object should issue a GET request" do
|
should "loading an object should issue a GET request" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer))
|
@mock.expects(:get).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.new("test_customer")
|
c = Stripe::Customer.new("test_customer")
|
||||||
c.refresh
|
c.refresh
|
||||||
end
|
end
|
||||||
|
|
||||||
test "using array accessors should be the same as the method interface" do
|
should "using array accessors should be the same as the method interface" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer))
|
@mock.expects(:get).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.new("test_customer")
|
c = Stripe::Customer.new("test_customer")
|
||||||
c.refresh
|
c.refresh
|
||||||
@ -98,20 +98,20 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert_equal c.created, 12345
|
assert_equal c.created, 12345
|
||||||
end
|
end
|
||||||
|
|
||||||
test "accessing a property other than id or parent on an unfetched object should fetch it" do
|
should "accessing a property other than id or parent on an unfetched object should fetch it" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer))
|
@mock.expects(:get).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.new("test_customer")
|
c = Stripe::Customer.new("test_customer")
|
||||||
c.charges
|
c.charges
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updating an object should issue a POST request with only the changed properties" do
|
should "updating an object should issue a POST request with only the changed properties" do
|
||||||
@mock.expects(:post).with("https://api.stripe.com/v1/customers/c_test_customer", {:mnemonic => 'another_mn'}).once.returns(test_response(test_customer))
|
@mock.expects(:post).with("https://api.stripe.com/v1/customers/c_test_customer", {:mnemonic => 'another_mn'}).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.construct_from(test_customer)
|
c = Stripe::Customer.construct_from(test_customer)
|
||||||
c.mnemonic = "another_mn"
|
c.mnemonic = "another_mn"
|
||||||
c.save
|
c.save
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updating should merge in returned properties" do
|
should "updating should merge in returned properties" do
|
||||||
@mock.expects(:post).once.returns(test_response(test_customer))
|
@mock.expects(:post).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.new("c_test_customer")
|
c = Stripe::Customer.new("c_test_customer")
|
||||||
c.mnemonic = "another_mn"
|
c.mnemonic = "another_mn"
|
||||||
@ -119,7 +119,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert_equal false, c.livemode
|
assert_equal false, c.livemode
|
||||||
end
|
end
|
||||||
|
|
||||||
test "deleting should send no props and result in an object that has no props other deleted" do
|
should "deleting should send no props and result in an object that has no props other deleted" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
@mock.expects(:post).never
|
@mock.expects(:post).never
|
||||||
@mock.expects(:delete).with("https://api.stripe.com/v1/customers/c_test_customer").once.returns(test_response({ "id" => "test_customer", "deleted" => true }))
|
@mock.expects(:delete).with("https://api.stripe.com/v1/customers/c_test_customer").once.returns(test_response({ "id" => "test_customer", "deleted" => true }))
|
||||||
@ -133,13 +133,13 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "loading an object with properties that have specific types should instantiate those classes" do
|
should "loading an object with properties that have specific types should instantiate those classes" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge))
|
@mock.expects(:get).once.returns(test_response(test_charge))
|
||||||
c = Stripe::Charge.retrieve("test_charge")
|
c = Stripe::Charge.retrieve("test_charge")
|
||||||
assert c.card.kind_of?(Stripe::StripeObject) && c.card.object == 'card'
|
assert c.card.kind_of?(Stripe::StripeObject) && c.card.object == 'card'
|
||||||
end
|
end
|
||||||
|
|
||||||
test "loading all of an APIResource should return an array of recursively instantiated objects" do
|
should "loading all of an APIResource should return an array of recursively instantiated objects" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge_array))
|
@mock.expects(:get).once.returns(test_response(test_charge_array))
|
||||||
c = Stripe::Charge.all
|
c = Stripe::Charge.all
|
||||||
assert c.kind_of? Array
|
assert c.kind_of? Array
|
||||||
@ -149,13 +149,13 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
|
|
||||||
context "charge tests" do
|
context "charge tests" do
|
||||||
|
|
||||||
test "charges should be listable" do
|
should "charges should be listable" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge_array))
|
@mock.expects(:get).once.returns(test_response(test_charge_array))
|
||||||
c = Stripe::Charge.all
|
c = Stripe::Charge.all
|
||||||
assert c.kind_of? Array
|
assert c.kind_of? Array
|
||||||
end
|
end
|
||||||
|
|
||||||
test "charges should be refundable" do
|
should "charges should be refundable" do
|
||||||
@mock.expects(:get).never
|
@mock.expects(:get).never
|
||||||
@mock.expects(:post).once.returns(test_response({:id => "ch_test_charge", :refunded => true}))
|
@mock.expects(:post).once.returns(test_response({:id => "ch_test_charge", :refunded => true}))
|
||||||
c = Stripe::Charge.new("test_charge")
|
c = Stripe::Charge.new("test_charge")
|
||||||
@ -163,7 +163,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert c.refunded
|
assert c.refunded
|
||||||
end
|
end
|
||||||
|
|
||||||
test "charges should not be deletable" do
|
should "charges should not be deletable" do
|
||||||
assert_raises NoMethodError do
|
assert_raises NoMethodError do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge))
|
@mock.expects(:get).once.returns(test_response(test_charge))
|
||||||
c = Stripe::Charge.retrieve("test_charge")
|
c = Stripe::Charge.retrieve("test_charge")
|
||||||
@ -171,7 +171,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "charges should not be updateable" do
|
should "charges should not be updateable" do
|
||||||
assert_raises NoMethodError do
|
assert_raises NoMethodError do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge))
|
@mock.expects(:get).once.returns(test_response(test_charge))
|
||||||
c = Stripe::Charge.new("test_charge")
|
c = Stripe::Charge.new("test_charge")
|
||||||
@ -181,13 +181,13 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "charges should have Card objects associated with their Card property" do
|
should "charges should have Card objects associated with their Card property" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_charge))
|
@mock.expects(:get).once.returns(test_response(test_charge))
|
||||||
c = Stripe::Charge.retrieve("test_charge")
|
c = Stripe::Charge.retrieve("test_charge")
|
||||||
assert c.card.kind_of?(Stripe::StripeObject) && c.card.object == 'card'
|
assert c.card.kind_of?(Stripe::StripeObject) && c.card.object == 'card'
|
||||||
end
|
end
|
||||||
|
|
||||||
test "execute should return a new, fully executed charge when passed correct parameters" do
|
should "execute should return a new, fully executed charge when passed correct parameters" do
|
||||||
@mock.expects(:post).with('https://api.stripe.com/v1/charges', {
|
@mock.expects(:post).with('https://api.stripe.com/v1/charges', {
|
||||||
:currency => 'usd', :amount => 100,
|
:currency => 'usd', :amount => 100,
|
||||||
:card => {:exp_year => 2012, :number => '4242424242424242', :exp_month => 11}
|
:card => {:exp_year => 2012, :number => '4242424242424242', :exp_month => 11}
|
||||||
@ -209,21 +209,21 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
|
|
||||||
context "customer tests" do
|
context "customer tests" do
|
||||||
|
|
||||||
test "customers should be listable" do
|
should "customers should be listable" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer_array))
|
@mock.expects(:get).once.returns(test_response(test_customer_array))
|
||||||
c = Stripe::Customer.all
|
c = Stripe::Customer.all
|
||||||
assert c.kind_of? Array
|
assert c.kind_of? Array
|
||||||
assert c[0].kind_of? Stripe::Customer
|
assert c[0].kind_of? Stripe::Customer
|
||||||
end
|
end
|
||||||
|
|
||||||
test "customers should be deletable" do
|
should "customers should be deletable" do
|
||||||
@mock.expects(:delete).once.returns(test_response(test_customer({:deleted => true})))
|
@mock.expects(:delete).once.returns(test_response(test_customer({:deleted => true})))
|
||||||
c = Stripe::Customer.new("test_customer")
|
c = Stripe::Customer.new("test_customer")
|
||||||
c.delete
|
c.delete
|
||||||
assert c.deleted
|
assert c.deleted
|
||||||
end
|
end
|
||||||
|
|
||||||
test "customers should be updateable" do
|
should "customers should be updateable" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer({:mnemonic => "foo"})))
|
@mock.expects(:get).once.returns(test_response(test_customer({:mnemonic => "foo"})))
|
||||||
@mock.expects(:post).once.returns(test_response(test_customer({:mnemonic => "bar"})))
|
@mock.expects(:post).once.returns(test_response(test_customer({:mnemonic => "bar"})))
|
||||||
c = Stripe::Customer.new("test_customer").refresh
|
c = Stripe::Customer.new("test_customer").refresh
|
||||||
@ -233,18 +233,29 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert_equal c.mnemonic, "bar"
|
assert_equal c.mnemonic, "bar"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "customers should have Card objects associated with their active_ard property" do
|
should "customers should have Card objects associated with their active_ard property" do
|
||||||
@mock.expects(:get).once.returns(test_response(test_customer))
|
@mock.expects(:get).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.retrieve("test_customer")
|
c = Stripe::Customer.retrieve("test_customer")
|
||||||
assert c.active_card.kind_of?(Stripe::StripeObject) && c.active_card.object == 'card'
|
assert c.active_card.kind_of?(Stripe::StripeObject) && c.active_card.object == 'card'
|
||||||
end
|
end
|
||||||
|
|
||||||
test "create should return a new customer" do
|
should "create should return a new customer" do
|
||||||
@mock.expects(:post).once.returns(test_response(test_customer))
|
@mock.expects(:post).once.returns(test_response(test_customer))
|
||||||
c = Stripe::Customer.create
|
c = Stripe::Customer.create
|
||||||
assert_equal "c_test_customer", c.id
|
assert_equal "c_test_customer", c.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "be able to update a customers subscription" do
|
||||||
|
@mock.expects(:get).once.returns(test_response(test_customer))
|
||||||
|
c = Stripe::Customer.retrieve("test_customer")
|
||||||
|
|
||||||
|
@mock.expects(:post).once.with("https://api.stripe.com/v1/customers/c_test_customer/subscription", {:plan => 'silver'}).returns(test_response(test_subscription('silver')))
|
||||||
|
s = c.update_subscription({:plan => 'silver'})
|
||||||
|
|
||||||
|
assert_equal 'subscription', s.object
|
||||||
|
assert_equal 'silver', s.plan.identifier
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context "card tests" do
|
context "card tests" do
|
||||||
@ -252,7 +263,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
|
|
||||||
context "error checking" do
|
context "error checking" do
|
||||||
|
|
||||||
test "404s should raise an InvalidRequestError" do
|
should "404s should raise an InvalidRequestError" do
|
||||||
response = test_response(test_missing_id_error, 404)
|
response = test_response(test_missing_id_error, 404)
|
||||||
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
|
||||||
|
|
||||||
@ -269,7 +280,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert false #shouldn't get here
|
assert false #shouldn't get here
|
||||||
end
|
end
|
||||||
|
|
||||||
test "5XXs should raise an APIError" do
|
should "5XXs should raise an APIError" do
|
||||||
response = test_response(test_api_error, 500)
|
response = test_response(test_api_error, 500)
|
||||||
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
|
||||||
|
|
||||||
@ -284,7 +295,7 @@ class TestStripeRuby < Test::Unit::TestCase
|
|||||||
assert false #shouldn't get here
|
assert false #shouldn't get here
|
||||||
end
|
end
|
||||||
|
|
||||||
test "402s should raise a CardError" do
|
should "402s should raise a CardError" do
|
||||||
response = test_response(test_invalid_exp_year_error, 402)
|
response = test_response(test_invalid_exp_year_error, 402)
|
||||||
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 402))
|
@mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 402))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user