stripe 1.18.0 → 1.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +11 -1
  4. data/History.txt +98 -0
  5. data/README.rdoc +19 -10
  6. data/VERSION +1 -1
  7. data/lib/stripe/account.rb +46 -4
  8. data/lib/stripe/api_operations/create.rb +3 -10
  9. data/lib/stripe/api_operations/delete.rb +4 -4
  10. data/lib/stripe/api_operations/list.rb +17 -9
  11. data/lib/stripe/api_operations/request.rb +41 -0
  12. data/lib/stripe/api_operations/update.rb +41 -40
  13. data/lib/stripe/api_resource.rb +7 -4
  14. data/lib/stripe/application_fee.rb +3 -4
  15. data/lib/stripe/application_fee_refund.rb +1 -1
  16. data/lib/stripe/balance_transaction.rb +1 -1
  17. data/lib/stripe/bank_account.rb +19 -0
  18. data/lib/stripe/bitcoin_receiver.rb +12 -2
  19. data/lib/stripe/bitcoin_transaction.rb +5 -0
  20. data/lib/stripe/card.rb +6 -4
  21. data/lib/stripe/charge.rb +14 -22
  22. data/lib/stripe/coupon.rb +2 -2
  23. data/lib/stripe/customer.rb +24 -26
  24. data/lib/stripe/dispute.rb +16 -0
  25. data/lib/stripe/errors/card_error.rb +3 -2
  26. data/lib/stripe/errors/invalid_request_error.rb +3 -2
  27. data/lib/stripe/errors/rate_limit_error.rb +4 -0
  28. data/lib/stripe/errors/stripe_error.rb +8 -2
  29. data/lib/stripe/event.rb +1 -1
  30. data/lib/stripe/file_upload.rb +12 -22
  31. data/lib/stripe/invoice.rb +8 -8
  32. data/lib/stripe/invoice_item.rb +2 -2
  33. data/lib/stripe/list_object.rb +77 -13
  34. data/lib/stripe/order.rb +19 -0
  35. data/lib/stripe/plan.rb +2 -2
  36. data/lib/stripe/product.rb +16 -0
  37. data/lib/stripe/recipient.rb +2 -2
  38. data/lib/stripe/refund.rb +2 -9
  39. data/lib/stripe/reversal.rb +14 -0
  40. data/lib/stripe/singleton_api_resource.rb +2 -2
  41. data/lib/stripe/sku.rb +8 -0
  42. data/lib/stripe/stripe_object.rb +232 -46
  43. data/lib/stripe/subscription.rb +3 -3
  44. data/lib/stripe/token.rb +1 -1
  45. data/lib/stripe/transfer.rb +3 -3
  46. data/lib/stripe/util.rb +64 -21
  47. data/lib/stripe/version.rb +1 -1
  48. data/lib/stripe.rb +102 -67
  49. data/stripe.gemspec +0 -2
  50. data/test/stripe/account_test.rb +135 -6
  51. data/test/stripe/api_resource_test.rb +326 -42
  52. data/test/stripe/application_fee_refund_test.rb +6 -6
  53. data/test/stripe/application_fee_test.rb +3 -3
  54. data/test/stripe/balance_test.rb +11 -0
  55. data/test/stripe/bitcoin_receiver_test.rb +30 -7
  56. data/test/stripe/bitcoin_transaction_test.rb +29 -0
  57. data/test/stripe/charge_refund_test.rb +55 -0
  58. data/test/stripe/charge_test.rb +32 -13
  59. data/test/stripe/coupon_test.rb +3 -3
  60. data/test/stripe/customer_card_test.rb +20 -14
  61. data/test/stripe/customer_test.rb +15 -15
  62. data/test/stripe/dispute_test.rb +45 -0
  63. data/test/stripe/file_upload_test.rb +17 -6
  64. data/test/stripe/invoice_test.rb +18 -4
  65. data/test/stripe/list_object_test.rb +126 -2
  66. data/test/stripe/metadata_test.rb +28 -13
  67. data/test/stripe/order_test.rb +52 -0
  68. data/test/stripe/product_test.rb +41 -0
  69. data/test/stripe/recipient_card_test.rb +9 -9
  70. data/test/stripe/refund_test.rb +23 -15
  71. data/test/stripe/reversal_test.rb +47 -0
  72. data/test/stripe/sku_test.rb +24 -0
  73. data/test/stripe/stripe_object_test.rb +67 -6
  74. data/test/stripe/subscription_test.rb +13 -13
  75. data/test/stripe/transfer_test.rb +4 -4
  76. data/test/stripe/util_test.rb +45 -29
  77. data/test/stripe_test.rb +16 -0
  78. data/test/test_data.rb +273 -66
  79. metadata +47 -76
  80. data/lib/stripe/certificate_blacklist.rb +0 -55
  81. data/test/stripe/certificate_blacklist_test.rb +0 -18
@@ -2,8 +2,125 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class ListObjectTest < Test::Unit::TestCase
5
+ should "provide .empty_list" do
6
+ list = Stripe::ListObject.empty_list
7
+ assert list.empty?
8
+ end
9
+
10
+ should "provide #count via enumerable" do
11
+ list = Stripe::ListObject.construct_from(make_charge_array)
12
+ assert_equal 3, list.count
13
+ end
14
+
15
+ should "provide #each" do
16
+ arr = [
17
+ { :id => 1 },
18
+ { :id => 2 },
19
+ { :id => 3 },
20
+ ]
21
+ expected = Util.convert_to_stripe_object(arr, {})
22
+ list = Stripe::ListObject.construct_from({ :data => arr })
23
+ assert_equal expected, list.each.to_a
24
+ end
25
+
26
+ should "provide #auto_paging_each" do
27
+ arr = [
28
+ { :id => 1 },
29
+ { :id => 2 },
30
+ { :id => 3 },
31
+ ]
32
+ expected = Util.convert_to_stripe_object(arr, {})
33
+
34
+ list = TestListObject.construct_from({ :data => [{ :id => 1 }], :has_more => true })
35
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?starting_after=1", nil, nil).
36
+ returns(make_response({ :data => [{ :id => 2 }, { :id => 3}], :has_more => false }))
37
+
38
+ assert_equal expected, list.auto_paging_each.to_a
39
+ end
40
+
41
+ should "provide #auto_paging_each that responds to a block" do
42
+ arr = [
43
+ { :id => 1 },
44
+ { :id => 2 },
45
+ { :id => 3 },
46
+ ]
47
+ expected = Util.convert_to_stripe_object(arr, {})
48
+
49
+ list = TestListObject.construct_from({ :data => [{ :id => 1 }], :has_more => true })
50
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?starting_after=1", nil, nil).
51
+ returns(make_response({ :data => [{ :id => 2 }, { :id => 3}], :has_more => false }))
52
+
53
+ actual = []
54
+ list.auto_paging_each do |obj|
55
+ actual << obj
56
+ end
57
+
58
+ assert_equal expected, actual
59
+ end
60
+
61
+ should "provide #empty?" do
62
+ list = Stripe::ListObject.construct_from({ :data => [] })
63
+ assert list.empty?
64
+ list = Stripe::ListObject.construct_from({ :data => [{}] })
65
+ refute list.empty?
66
+ end
67
+
68
+ #
69
+ # next_page
70
+ #
71
+
72
+ should "fetch a next page through #next_page" do
73
+ list = TestListObject.construct_from({ :data => [{ :id => 1 }], :has_more => true })
74
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?starting_after=1", nil, nil).
75
+ returns(make_response({ :data => [{ :id => 2 }], :has_more => false }))
76
+ next_list = list.next_page
77
+ refute next_list.empty?
78
+ end
79
+
80
+ should "fetch a next page through #next_page and respect limit" do
81
+ list = TestListObject.construct_from({ :data => [{ :id => 1 }], :has_more => true })
82
+ list.limit = 3
83
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?limit=3&starting_after=1", nil, nil).
84
+ returns(make_response({ :data => [{ :id => 2 }], :has_more => false }))
85
+ next_list = list.next_page
86
+ assert_equal 3, next_list.limit
87
+ end
88
+
89
+ should "fetch an empty page through #next_page" do
90
+ list = TestListObject.construct_from({ :data => [{ :id => 1 }], :has_more => false })
91
+ next_list = list.next_page
92
+ assert_equal Stripe::ListObject.empty_list, next_list
93
+ end
94
+
95
+ #
96
+ # previous_page
97
+ #
98
+
99
+ should "fetch a next page through #previous_page" do
100
+ list = TestListObject.construct_from({ :data => [{ :id => 2 }] })
101
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?ending_before=2", nil, nil).
102
+ returns(make_response({ :data => [{ :id => 1 }] }))
103
+ next_list = list.previous_page
104
+ refute next_list.empty?
105
+ end
106
+
107
+ should "fetch a next page through #previous_page and respect limit" do
108
+ list = TestListObject.construct_from({ :data => [{ :id => 2 }] })
109
+ list.limit = 3
110
+ @mock.expects(:get).once.with("#{Stripe.api_base}/things?ending_before=2&limit=3", nil, nil).
111
+ returns(make_response({ :data => [{ :id => 1 }] }))
112
+ next_list = list.previous_page
113
+ assert_equal 3, next_list.limit
114
+ end
115
+
116
+ #
117
+ # backward compatibility
118
+ #
119
+
120
+ # note that the name #all is deprecated, as is using it fetch the next page
121
+ # in a list
5
122
  should "be able to retrieve full lists given a listobject" do
6
- @mock.expects(:get).twice.returns(test_response(test_charge_array))
123
+ @mock.expects(:get).twice.returns(make_response(make_charge_array))
7
124
  c = Stripe::Charge.all
8
125
  assert c.kind_of?(Stripe::ListObject)
9
126
  assert_equal('/v1/charges', c.url)
@@ -13,4 +130,11 @@ module Stripe
13
130
  assert all.data.kind_of?(Array)
14
131
  end
15
132
  end
16
- end
133
+ end
134
+
135
+ # A helper class with a URL that allows us to try out pagination.
136
+ class TestListObject < Stripe::ListObject
137
+ def url
138
+ "/things"
139
+ end
140
+ end
@@ -6,24 +6,39 @@ module Stripe
6
6
  @metadata_supported = {
7
7
  :charge => {
8
8
  :new => Stripe::Charge.method(:new),
9
- :test => method(:test_charge),
10
- :url => "/v1/charges/#{test_charge()[:id]}"
9
+ :test => method(:make_charge),
10
+ :url => "/v1/charges/#{make_charge()[:id]}"
11
11
  },
12
12
  :customer => {
13
13
  :new => Stripe::Customer.method(:new),
14
- :test => method(:test_customer),
15
- :url => "/v1/customers/#{test_customer()[:id]}"
14
+ :test => method(:make_customer),
15
+ :url => "/v1/customers/#{make_customer()[:id]}"
16
16
  },
17
17
  :recipient => {
18
18
  :new => Stripe::Recipient.method(:new),
19
- :test => method(:test_recipient),
20
- :url => "/v1/recipients/#{test_recipient()[:id]}"
19
+ :test => method(:make_recipient),
20
+ :url => "/v1/recipients/#{make_recipient()[:id]}"
21
21
  },
22
22
  :transfer => {
23
23
  :new => Stripe::Transfer.method(:new),
24
- :test => method(:test_transfer),
25
- :url => "/v1/transfers/#{test_transfer()[:id]}"
26
- }
24
+ :test => method(:make_transfer),
25
+ :url => "/v1/transfers/#{make_transfer()[:id]}"
26
+ },
27
+ :product => {
28
+ :new => Stripe::Product.method(:new),
29
+ :test => method(:make_product),
30
+ :url => "/v1/products/#{make_product()[:id]}"
31
+ },
32
+ :order => {
33
+ :new => Stripe::Order.method(:new),
34
+ :test => method(:make_order),
35
+ :url => "/v1/orders/#{make_order()[:id]}"
36
+ },
37
+ :sku => {
38
+ :new => Stripe::SKU.method(:new),
39
+ :test => method(:make_sku),
40
+ :url => "/v1/skus/#{make_sku()[:id]}"
41
+ },
27
42
  }
28
43
 
29
44
  @base_url = 'https://api.stripe.com'
@@ -45,7 +60,7 @@ module Stripe
45
60
 
46
61
  if is_greater_than_ruby_1_9?
47
62
  check_metadata({:metadata => {:initial => 'true'}},
48
- 'metadata[uuid]=6735&metadata[initial]=',
63
+ 'metadata[initial]=&metadata[uuid]=6735',
49
64
  update_actions)
50
65
  end
51
66
  end
@@ -78,7 +93,7 @@ module Stripe
78
93
  obj.metadata['uuid'] = '6735'
79
94
  end
80
95
  params = {:metadata => {'type' => 'summer', 'uuid' => '6735'}}
81
- curl_args = Stripe.uri_encode(params)
96
+ curl_args = Stripe::Util.encode_parameters(params)
82
97
  check_metadata({:metadata => {'type' => 'christmas'}},
83
98
  curl_args,
84
99
  update_actions)
@@ -92,11 +107,11 @@ module Stripe
92
107
  url = @base_url + methods[:url]
93
108
 
94
109
  initial_test_obj = test.call(initial_params)
95
- @mock.expects(:get).once.returns(test_response(initial_test_obj))
110
+ @mock.expects(:get).once.returns(make_response(initial_test_obj))
96
111
 
97
112
  final_test_obj = test.call()
98
113
  @mock.expects(:post).once.
99
- returns(test_response(final_test_obj)).
114
+ returns(make_response(final_test_obj)).
100
115
  with(url, nil, curl_args)
101
116
 
102
117
  obj = neu.call("test")
@@ -0,0 +1,52 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class OrderTest < Test::Unit::TestCase
5
+ should "orders should be listable" do
6
+ @mock.expects(:get).once.returns(make_response(make_order_array))
7
+ orders = Stripe::Order.list
8
+ assert orders.data.kind_of?(Array)
9
+ orders.each do |order|
10
+ assert order.kind_of?(Stripe::Order)
11
+ end
12
+ end
13
+
14
+ should "orders should not be deletable" do
15
+ assert_raises NoMethodError do
16
+ @mock.expects(:get).once.returns(make_response(make_order))
17
+ p = Stripe::Order.retrieve("test_order")
18
+ p.delete
19
+ end
20
+ end
21
+
22
+ should "orders should be updateable" do
23
+ @mock.expects(:get).once.returns(make_response(make_order))
24
+ @mock.expects(:post).once.returns(make_response(make_order))
25
+ p = Stripe::Order.new("test_order")
26
+ p.refresh
27
+ p.status = "fulfilled"
28
+ p.save
29
+ end
30
+
31
+ should "orders should allow metadata updates" do
32
+ @mock.expects(:get).once.returns(make_response(make_order))
33
+ @mock.expects(:post).once.returns(make_response(make_order))
34
+ p = Stripe::Order.new("test_order")
35
+ p.refresh
36
+ p.metadata['key'] = 'value'
37
+ p.save
38
+ end
39
+
40
+ should "pay should pay an order" do
41
+ @mock.expects(:get).once.
42
+ returns(make_response(make_order(:id => 'or_test_order')))
43
+ order = Stripe::Order.retrieve('or_test_order')
44
+
45
+ @mock.expects(:post).once.
46
+ with('https://api.stripe.com/v1/orders/or_test_order/pay', nil, 'token=test_token').
47
+ returns(make_response(make_paid_order))
48
+ order.pay(:token => 'test_token')
49
+ assert_equal "paid", order.status
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,41 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class ProductTest < Test::Unit::TestCase
5
+ should "products should be listable" do
6
+ @mock.expects(:get).once.returns(make_response(make_product_array))
7
+ products = Stripe::Product.list
8
+ assert products.data.kind_of?(Array)
9
+ products.each do |product|
10
+ assert product.kind_of?(Stripe::Product)
11
+ end
12
+ end
13
+
14
+ should "products should not be deletable" do
15
+ assert_raises NoMethodError do
16
+ @mock.expects(:get).once.returns(make_response(make_product))
17
+ p = Stripe::Product.retrieve("test_product")
18
+ p.delete
19
+ end
20
+ end
21
+
22
+ should "products should be updateable" do
23
+ @mock.expects(:get).once.returns(make_response(make_product))
24
+ @mock.expects(:post).once.returns(make_response(make_product))
25
+ p = Stripe::Product.new("test_product")
26
+ p.refresh
27
+ p.description = "New product description"
28
+ p.save
29
+ end
30
+
31
+ should "products should allow metadata updates" do
32
+ @mock.expects(:get).once.returns(make_response(make_product))
33
+ @mock.expects(:post).once.returns(make_response(make_product))
34
+ p = Stripe::Product.new("test_product")
35
+ p.refresh
36
+ p.metadata['key'] = 'value'
37
+ p.save
38
+ end
39
+
40
+ end
41
+ end
@@ -5,21 +5,21 @@ module Stripe
5
5
  RECIPIENT_CARD_URL = '/v1/recipients/test_recipient/cards/test_card'
6
6
 
7
7
  def recipient
8
- @mock.expects(:get).once.returns(test_response(test_recipient))
8
+ @mock.expects(:get).once.returns(make_response(make_recipient))
9
9
  Stripe::Recipient.retrieve('test_recipient')
10
10
  end
11
11
 
12
12
  should "recipient cards should be listable" do
13
13
  c = recipient
14
- @mock.expects(:get).once.returns(test_response(test_card_array(recipient.id)))
15
- cards = c.cards.all.data
14
+ @mock.expects(:get).once.returns(make_response(make_recipient_card_array(recipient.id)))
15
+ cards = c.cards.list.data
16
16
  assert cards.kind_of? Array
17
17
  assert cards[0].kind_of? Stripe::Card
18
18
  end
19
19
 
20
20
  should "recipient cards should have the correct url" do
21
21
  c = recipient
22
- @mock.expects(:get).once.returns(test_response(test_card(
22
+ @mock.expects(:get).once.returns(make_response(make_card(
23
23
  :id => 'test_card',
24
24
  :recipient => 'test_recipient'
25
25
  )))
@@ -29,8 +29,8 @@ module Stripe
29
29
 
30
30
  should "recipient cards should be deletable" do
31
31
  c = recipient
32
- @mock.expects(:get).once.returns(test_response(test_card))
33
- @mock.expects(:delete).once.returns(test_response(test_card(:deleted => true)))
32
+ @mock.expects(:get).once.returns(make_response(make_card))
33
+ @mock.expects(:delete).once.returns(make_response(make_card(:deleted => true)))
34
34
  card = c.cards.retrieve('card')
35
35
  card.delete
36
36
  assert card.deleted
@@ -38,8 +38,8 @@ module Stripe
38
38
 
39
39
  should "recipient cards should be updateable" do
40
40
  c = recipient
41
- @mock.expects(:get).once.returns(test_response(test_card(:exp_year => "2000")))
42
- @mock.expects(:post).once.returns(test_response(test_card(:exp_year => "2100")))
41
+ @mock.expects(:get).once.returns(make_response(make_card(:exp_year => "2000")))
42
+ @mock.expects(:post).once.returns(make_response(make_card(:exp_year => "2100")))
43
43
  card = c.cards.retrieve('card')
44
44
  assert_equal "2000", card.exp_year
45
45
  card.exp_year = "2100"
@@ -49,7 +49,7 @@ module Stripe
49
49
 
50
50
  should "create should return a new recipient card" do
51
51
  c = recipient
52
- @mock.expects(:post).once.returns(test_response(test_card(:id => "test_card")))
52
+ @mock.expects(:post).once.returns(make_response(make_card(:id => "test_card")))
53
53
  card = c.cards.create(:card => "tok_41YJ05ijAaWaFS")
54
54
  assert_equal "test_card", card.id
55
55
  end
@@ -3,44 +3,52 @@ require File.expand_path('../../test_helper', __FILE__)
3
3
  module Stripe
4
4
  class RefundTest < Test::Unit::TestCase
5
5
  should "refunds should be listable" do
6
- @mock.expects(:get).once.returns(test_response(test_charge))
6
+ @mock.expects(:get).
7
+ with("#{Stripe.api_base}/v1/refunds", nil, nil).
8
+ once.returns(make_response(make_refund_array))
7
9
 
8
- charge = Stripe::Charge.retrieve('test_charge')
10
+ refunds = Stripe::Refund.list
9
11
 
10
- assert charge.refunds.first.kind_of?(Stripe::Refund)
12
+ assert refunds.first.kind_of?(Stripe::Refund)
11
13
  end
12
14
 
13
15
  should "refunds should be refreshable" do
14
- @mock.expects(:get).twice.returns(test_response(test_charge), test_response(test_refund(:id => 'refreshed_refund')))
16
+ @mock.expects(:get).
17
+ with("#{Stripe.api_base}/v1/refunds/test_refund", nil, nil).
18
+ twice.returns(make_response(make_refund(:id => 'test_refund')),
19
+ make_response(make_refund(:id => 'refreshed_refund')))
15
20
 
16
- charge = Stripe::Charge.retrieve('test_charge')
17
- refund = charge.refunds.first
21
+ refund = Stripe::Refund.retrieve('test_refund')
18
22
  refund.refresh
19
23
 
20
24
  assert_equal 'refreshed_refund', refund.id
21
25
  end
22
26
 
23
27
  should "refunds should be updateable" do
24
- @mock.expects(:get).once.returns(test_response(test_charge))
25
- @mock.expects(:post).once.returns(test_response(test_refund(:metadata => {'key' => 'value'})))
28
+ @mock.expects(:get).
29
+ with("#{Stripe.api_base}/v1/refunds/get_refund", nil, nil).
30
+ once.returns(make_response(make_refund(:id => 'save_refund')))
26
31
 
27
- charge = Stripe::Charge.retrieve('test_charge')
28
- refund = charge.refunds.first
32
+ @mock.expects(:post).
33
+ with("#{Stripe.api_base}/v1/refunds/save_refund", nil, 'metadata[key]=value').
34
+ once.returns(make_response(make_refund(:metadata => {'key' => 'value'})))
35
+
36
+ refund = Stripe::Refund.retrieve('get_refund')
29
37
 
30
38
  assert_equal nil, refund.metadata['key']
31
39
 
32
- refund.metadata['key'] = 'valu'
40
+ refund.metadata['key'] = 'value'
33
41
  refund.save
34
42
 
35
43
  assert_equal 'value', refund.metadata['key']
36
44
  end
37
45
 
38
46
  should "create should return a new refund" do
39
- @mock.expects(:get).once.returns(test_response(test_charge))
40
- @mock.expects(:post).once.returns(test_response(test_refund(:id => 'test_new_refund')))
47
+ @mock.expects(:post).
48
+ with("#{Stripe.api_base}/v1/refunds", nil, 'charge=test_charge').
49
+ once.returns(make_response(make_refund(:id => 'test_new_refund')))
41
50
 
42
- charge = Stripe::Charge.retrieve('test_charge')
43
- refund = charge.refunds.create(:amount => 20)
51
+ refund = Stripe::Refund.create(:charge => 'test_charge')
44
52
  assert_equal 'test_new_refund', refund.id
45
53
  end
46
54
  end
@@ -0,0 +1,47 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class ReversalTest < Test::Unit::TestCase
5
+ should "reversals should be listable" do
6
+ @mock.expects(:get).once.returns(make_response(make_transfer))
7
+
8
+ transfer = Stripe::Transfer.retrieve('test_transfer')
9
+
10
+ assert transfer.reversals.first.kind_of?(Stripe::Reversal)
11
+ end
12
+
13
+ should "reversals should be refreshable" do
14
+ @mock.expects(:get).twice.returns(make_response(make_transfer), make_response(make_reversal(:id => 'refreshed_reversal')))
15
+
16
+ transfer = Stripe::Transfer.retrieve('test_transfer')
17
+ reversal = transfer.reversals.first
18
+ reversal.refresh
19
+
20
+ assert_equal 'refreshed_reversal', reversal.id
21
+ end
22
+
23
+ should "reversals should be updateable" do
24
+ @mock.expects(:get).once.returns(make_response(make_transfer))
25
+ @mock.expects(:post).once.returns(make_response(make_reversal(:metadata => {'key' => 'value'})))
26
+
27
+ transfer = Stripe::Transfer.retrieve('test_transfer')
28
+ reversal = transfer.reversals.first
29
+
30
+ assert_equal nil, reversal.metadata['key']
31
+
32
+ reversal.metadata['key'] = 'value'
33
+ reversal.save
34
+
35
+ assert_equal 'value', reversal.metadata['key']
36
+ end
37
+
38
+ should "create should return a new reversal" do
39
+ @mock.expects(:get).once.returns(make_response(make_transfer))
40
+ @mock.expects(:post).once.returns(make_response(make_reversal(:id => 'test_new_reversal')))
41
+
42
+ transfer = Stripe::Transfer.retrieve('test_transfer')
43
+ reversals = transfer.reversals.create(:amount => 20)
44
+ assert_equal 'test_new_reversal', reversals.id
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class SKUTest < Test::Unit::TestCase
5
+ should "SKUs should be listable" do
6
+ @mock.expects(:get).once.
7
+ returns(make_response(make_sku_array("test_product")))
8
+ skus = Stripe::SKU.list
9
+ assert skus.data.kind_of? Array
10
+ skus.each do |sku|
11
+ assert sku.kind_of?(Stripe::SKU)
12
+ end
13
+ end
14
+
15
+ should "SKUs should not be deletable" do
16
+ assert_raises NoMethodError do
17
+ @mock.expects(:get).once.returns(make_response(make_sku))
18
+ p = Stripe::SKU.retrieve("test_product")
19
+ p.delete
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -2,26 +2,87 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class StripeObjectTest < Test::Unit::TestCase
5
- should "implement #respond_to correctly" do
5
+ should "implement #==" do
6
+ obj1 = Stripe::StripeObject.construct_from({ :id => 1, :foo => "bar" })
7
+ obj2 = Stripe::StripeObject.construct_from({ :id => 1, :foo => "bar" })
8
+ obj3 = Stripe::StripeObject.construct_from({ :id => 1, :foo => "rab" })
9
+
10
+ assert obj1 == obj2
11
+ refute obj1 == obj3
12
+ end
13
+
14
+ should "implement #deleted?" do
15
+ obj = Stripe::StripeObject.construct_from({})
16
+ refute obj.deleted?
17
+
18
+ obj = Stripe::StripeObject.construct_from({ :deleted => false })
19
+ refute obj.deleted?
20
+
21
+ obj = Stripe::StripeObject.construct_from({ :deleted => true })
22
+ assert obj.deleted?
23
+ end
24
+
25
+ should "implement #respond_to" do
6
26
  obj = Stripe::StripeObject.construct_from({ :id => 1, :foo => 'bar' })
7
27
  assert obj.respond_to?(:id)
8
28
  assert obj.respond_to?(:foo)
9
29
  assert !obj.respond_to?(:baz)
10
30
  end
11
31
 
32
+ should "marshal be insensitive to strings vs. symbols when constructin" do
33
+ obj = Stripe::StripeObject.construct_from({ :id => 1, 'name' => 'Stripe' })
34
+ assert_equal 1, obj[:id]
35
+ assert_equal 'Stripe', obj[:name]
36
+ end
37
+
12
38
  should "marshal a stripe object correctly" do
13
- obj = Stripe::StripeObject.construct_from({ :id => 1, :name => 'Stripe' }, 'apikey')
39
+ obj = Stripe::StripeObject.construct_from({ :id => 1, :name => 'Stripe' }, {:api_key => 'apikey'})
14
40
  m = Marshal.load(Marshal.dump(obj))
15
41
  assert_equal 1, m.id
16
42
  assert_equal 'Stripe', m.name
17
- assert_equal 'apikey', m.api_key
43
+ expected_hash = {:api_key => 'apikey'}
44
+ assert_equal expected_hash, m.instance_variable_get('@opts')
18
45
  end
19
46
 
20
47
  should "recursively call to_hash on its values" do
21
- nested = Stripe::StripeObject.construct_from({ :id => 7, :foo => 'bar' })
22
- obj = Stripe::StripeObject.construct_from({ :id => 1, :nested => nested })
23
- expected_hash = { :id => 1, :nested => { :id => 7, :foo => 'bar' } }
48
+ nested_hash = { :id => 7, :foo => 'bar' }
49
+ nested = Stripe::StripeObject.construct_from(nested_hash)
50
+ obj = Stripe::StripeObject.construct_from({ :id => 1, :nested => nested, :list => [nested] })
51
+ expected_hash = { :id => 1, :nested => nested_hash, :list => [nested_hash] }
24
52
  assert_equal expected_hash, obj.to_hash
25
53
  end
54
+
55
+ should "assign question mark accessors for booleans" do
56
+ obj = Stripe::StripeObject.construct_from({ :id => 1, :bool => true, :not_bool => 'bar' })
57
+ assert obj.respond_to?(:bool?)
58
+ assert obj.bool?
59
+ refute obj.respond_to?(:not_bool?)
60
+ end
61
+
62
+ should "mass assign values with #update_attributes" do
63
+ obj = Stripe::StripeObject.construct_from({ :id => 1, :name => 'Stripe' })
64
+ obj.update_attributes(:name => 'STRIPE')
65
+ assert_equal "STRIPE", obj.name
66
+
67
+ # unfortunately, we even assign unknown properties to duplicate the
68
+ # behavior that we currently have via magic accessors with
69
+ # method_missing
70
+ obj.update_attributes(:unknown => 'foo')
71
+ assert_equal "foo", obj.unknown
72
+ end
73
+
74
+ should "warn that #refresh_from is deprecated" do
75
+ old_stderr = $stderr
76
+ $stderr = StringIO.new
77
+ begin
78
+ obj = Stripe::StripeObject.construct_from({})
79
+ obj.refresh_from({}, {})
80
+ message = "NOTE: Stripe::StripeObject#refresh_from is " +
81
+ "deprecated; use #update_attributes instead"
82
+ assert_match Regexp.new(message), $stderr.string
83
+ ensure
84
+ $stderr = old_stderr
85
+ end
86
+ end
26
87
  end
27
88
  end