stripe-ruby-mock 2.5.8 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/rspec_tests.yml +38 -0
  3. data/.gitignore +1 -1
  4. data/.rspec +2 -1
  5. data/CHANGELOG.md +77 -0
  6. data/Gemfile +1 -5
  7. data/README.md +19 -11
  8. data/lib/stripe_mock/api/client.rb +2 -2
  9. data/lib/stripe_mock/api/errors.rb +34 -28
  10. data/lib/stripe_mock/api/instance.rb +1 -1
  11. data/lib/stripe_mock/api/webhooks.rb +68 -24
  12. data/lib/stripe_mock/client.rb +2 -1
  13. data/lib/stripe_mock/data/list.rb +42 -9
  14. data/lib/stripe_mock/data.rb +359 -21
  15. data/lib/stripe_mock/instance.rb +23 -5
  16. data/lib/stripe_mock/request_handlers/account_links.rb +15 -0
  17. data/lib/stripe_mock/request_handlers/accounts.rb +17 -6
  18. data/lib/stripe_mock/request_handlers/balance_transactions.rb +2 -2
  19. data/lib/stripe_mock/request_handlers/charges.rb +31 -5
  20. data/lib/stripe_mock/request_handlers/checkout_session.rb +179 -0
  21. data/lib/stripe_mock/request_handlers/customers.rb +47 -19
  22. data/lib/stripe_mock/request_handlers/ephemeral_key.rb +1 -1
  23. data/lib/stripe_mock/request_handlers/events.rb +30 -3
  24. data/lib/stripe_mock/request_handlers/express_login_links.rb +15 -0
  25. data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +6 -0
  26. data/lib/stripe_mock/request_handlers/helpers/search_helpers.rb +67 -0
  27. data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +36 -12
  28. data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +1 -1
  29. data/lib/stripe_mock/request_handlers/invoices.rb +26 -6
  30. data/lib/stripe_mock/request_handlers/payment_intents.rb +202 -0
  31. data/lib/stripe_mock/request_handlers/payment_methods.rb +124 -0
  32. data/lib/stripe_mock/request_handlers/plans.rb +1 -1
  33. data/lib/stripe_mock/request_handlers/prices.rb +71 -0
  34. data/lib/stripe_mock/request_handlers/products.rb +15 -5
  35. data/lib/stripe_mock/request_handlers/promotion_codes.rb +43 -0
  36. data/lib/stripe_mock/request_handlers/refunds.rb +13 -2
  37. data/lib/stripe_mock/request_handlers/setup_intents.rb +100 -0
  38. data/lib/stripe_mock/request_handlers/sources.rb +12 -6
  39. data/lib/stripe_mock/request_handlers/subscriptions.rb +146 -25
  40. data/lib/stripe_mock/request_handlers/tokens.rb +6 -4
  41. data/lib/stripe_mock/request_handlers/transfers.rb +12 -1
  42. data/lib/stripe_mock/request_handlers/validators/param_validators.rb +124 -9
  43. data/lib/stripe_mock/server.rb +2 -2
  44. data/lib/stripe_mock/test_strategies/base.rb +98 -12
  45. data/lib/stripe_mock/test_strategies/live.rb +23 -12
  46. data/lib/stripe_mock/test_strategies/mock.rb +6 -2
  47. data/lib/stripe_mock/version.rb +1 -1
  48. data/lib/stripe_mock/webhook_fixtures/account.updated.json +1 -1
  49. data/lib/stripe_mock/webhook_fixtures/balance.available.json +27 -15
  50. data/lib/stripe_mock/webhook_fixtures/charge.captured.json +143 -0
  51. data/lib/stripe_mock/webhook_fixtures/charge.dispute.created.json +63 -16
  52. data/lib/stripe_mock/webhook_fixtures/charge.failed.json +101 -44
  53. data/lib/stripe_mock/webhook_fixtures/charge.refund.updated.json +35 -0
  54. data/lib/stripe_mock/webhook_fixtures/charge.refunded.json +145 -50
  55. data/lib/stripe_mock/webhook_fixtures/charge.succeeded.json +114 -43
  56. data/lib/stripe_mock/webhook_fixtures/checkout.session.completed.json +79 -0
  57. data/lib/stripe_mock/webhook_fixtures/checkout.session.completed.payment_mode.json +53 -0
  58. data/lib/stripe_mock/webhook_fixtures/checkout.session.completed.setup_mode.json +45 -0
  59. data/lib/stripe_mock/webhook_fixtures/customer.created.json +37 -45
  60. data/lib/stripe_mock/webhook_fixtures/customer.deleted.json +36 -32
  61. data/lib/stripe_mock/webhook_fixtures/customer.source.created.json +31 -22
  62. data/lib/stripe_mock/webhook_fixtures/customer.source.updated.json +36 -25
  63. data/lib/stripe_mock/webhook_fixtures/customer.subscription.created.json +135 -47
  64. data/lib/stripe_mock/webhook_fixtures/customer.subscription.deleted.json +134 -45
  65. data/lib/stripe_mock/webhook_fixtures/customer.subscription.updated.json +135 -56
  66. data/lib/stripe_mock/webhook_fixtures/customer.updated.json +38 -46
  67. data/lib/stripe_mock/webhook_fixtures/invoice.created.json +176 -49
  68. data/lib/stripe_mock/webhook_fixtures/invoice.finalized.json +171 -0
  69. data/lib/stripe_mock/webhook_fixtures/invoice.paid.json +171 -0
  70. data/lib/stripe_mock/webhook_fixtures/invoice.payment_action_required.json +171 -0
  71. data/lib/stripe_mock/webhook_fixtures/invoice.payment_failed.json +149 -83
  72. data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +149 -90
  73. data/lib/stripe_mock/webhook_fixtures/invoice.upcoming.json +70 -0
  74. data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +178 -50
  75. data/lib/stripe_mock/webhook_fixtures/invoiceitem.created.json +87 -13
  76. data/lib/stripe_mock/webhook_fixtures/invoiceitem.updated.json +88 -14
  77. data/lib/stripe_mock/webhook_fixtures/mandate.updated.json +34 -0
  78. data/lib/stripe_mock/webhook_fixtures/payment_intent.amount_capturable_updated.json +170 -0
  79. data/lib/stripe_mock/webhook_fixtures/payment_intent.canceled.json +73 -0
  80. data/lib/stripe_mock/webhook_fixtures/payment_intent.created.json +86 -0
  81. data/lib/stripe_mock/webhook_fixtures/payment_intent.payment_failed.json +225 -0
  82. data/lib/stripe_mock/webhook_fixtures/payment_intent.processing.json +162 -0
  83. data/lib/stripe_mock/webhook_fixtures/payment_intent.requires_action.json +191 -0
  84. data/lib/stripe_mock/webhook_fixtures/payment_intent.succeeded.json +196 -0
  85. data/lib/stripe_mock/webhook_fixtures/payment_link.created.json +47 -0
  86. data/lib/stripe_mock/webhook_fixtures/payment_link.updated.json +50 -0
  87. data/lib/stripe_mock/webhook_fixtures/payment_method.attached.json +63 -0
  88. data/lib/stripe_mock/webhook_fixtures/payment_method.detached.json +62 -0
  89. data/lib/stripe_mock/webhook_fixtures/payout.created.json +40 -0
  90. data/lib/stripe_mock/webhook_fixtures/payout.paid.json +40 -0
  91. data/lib/stripe_mock/webhook_fixtures/payout.updated.json +46 -0
  92. data/lib/stripe_mock/webhook_fixtures/plan.created.json +30 -13
  93. data/lib/stripe_mock/webhook_fixtures/plan.deleted.json +30 -13
  94. data/lib/stripe_mock/webhook_fixtures/plan.updated.json +34 -14
  95. data/lib/stripe_mock/webhook_fixtures/price.created.json +42 -0
  96. data/lib/stripe_mock/webhook_fixtures/price.deleted.json +42 -0
  97. data/lib/stripe_mock/webhook_fixtures/price.updated.json +48 -0
  98. data/lib/stripe_mock/webhook_fixtures/product.created.json +40 -0
  99. data/lib/stripe_mock/webhook_fixtures/product.deleted.json +40 -0
  100. data/lib/stripe_mock/webhook_fixtures/product.updated.json +47 -0
  101. data/lib/stripe_mock/webhook_fixtures/quote.accepted.json +92 -0
  102. data/lib/stripe_mock/webhook_fixtures/quote.canceled.json +92 -0
  103. data/lib/stripe_mock/webhook_fixtures/quote.created.json +92 -0
  104. data/lib/stripe_mock/webhook_fixtures/quote.finalized.json +92 -0
  105. data/lib/stripe_mock/webhook_fixtures/setup_intent.canceled.json +46 -0
  106. data/lib/stripe_mock/webhook_fixtures/setup_intent.created.json +51 -0
  107. data/lib/stripe_mock/webhook_fixtures/setup_intent.setup_failed.json +100 -0
  108. data/lib/stripe_mock/webhook_fixtures/setup_intent.succeeded.json +46 -0
  109. data/lib/stripe_mock/webhook_fixtures/subscription_schedule.canceled.json +119 -0
  110. data/lib/stripe_mock/webhook_fixtures/subscription_schedule.created.json +114 -0
  111. data/lib/stripe_mock/webhook_fixtures/subscription_schedule.released.json +111 -0
  112. data/lib/stripe_mock/webhook_fixtures/subscription_schedule.updated.json +125 -0
  113. data/lib/stripe_mock/webhook_fixtures/tax_rate.created.json +32 -0
  114. data/lib/stripe_mock/webhook_fixtures/tax_rate.updated.json +37 -0
  115. data/lib/stripe_mock.rb +11 -0
  116. data/spec/instance_spec.rb +13 -13
  117. data/spec/integration_examples/completing_checkout_sessions_example.rb +37 -0
  118. data/spec/list_spec.rb +38 -0
  119. data/spec/readme_spec.rb +1 -1
  120. data/spec/server_spec.rb +6 -3
  121. data/spec/shared_stripe_examples/account_examples.rb +10 -2
  122. data/spec/shared_stripe_examples/account_link_examples.rb +16 -0
  123. data/spec/shared_stripe_examples/balance_examples.rb +6 -0
  124. data/spec/shared_stripe_examples/balance_transaction_examples.rb +3 -3
  125. data/spec/shared_stripe_examples/bank_examples.rb +3 -3
  126. data/spec/shared_stripe_examples/bank_token_examples.rb +5 -7
  127. data/spec/shared_stripe_examples/card_examples.rb +4 -4
  128. data/spec/shared_stripe_examples/card_token_examples.rb +17 -21
  129. data/spec/shared_stripe_examples/charge_examples.rb +106 -22
  130. data/spec/shared_stripe_examples/checkout_session_examples.rb +99 -0
  131. data/spec/shared_stripe_examples/coupon_examples.rb +1 -1
  132. data/spec/shared_stripe_examples/customer_examples.rb +149 -53
  133. data/spec/shared_stripe_examples/dispute_examples.rb +2 -2
  134. data/spec/shared_stripe_examples/error_mock_examples.rb +8 -7
  135. data/spec/shared_stripe_examples/express_login_link_examples.rb +12 -0
  136. data/spec/shared_stripe_examples/external_account_examples.rb +3 -3
  137. data/spec/shared_stripe_examples/invoice_examples.rb +148 -40
  138. data/spec/shared_stripe_examples/invoice_item_examples.rb +1 -1
  139. data/spec/shared_stripe_examples/payment_intent_examples.rb +283 -0
  140. data/spec/shared_stripe_examples/payment_method_examples.rb +454 -0
  141. data/spec/shared_stripe_examples/payout_examples.rb +2 -2
  142. data/spec/shared_stripe_examples/plan_examples.rb +135 -92
  143. data/spec/shared_stripe_examples/price_examples.rb +292 -0
  144. data/spec/shared_stripe_examples/product_examples.rb +215 -0
  145. data/spec/shared_stripe_examples/promotion_code_examples.rb +68 -0
  146. data/spec/shared_stripe_examples/refund_examples.rb +38 -21
  147. data/spec/shared_stripe_examples/setup_intent_examples.rb +85 -0
  148. data/spec/shared_stripe_examples/subscription_examples.rb +706 -324
  149. data/spec/shared_stripe_examples/subscription_items_examples.rb +3 -2
  150. data/spec/shared_stripe_examples/transfer_examples.rb +16 -7
  151. data/spec/shared_stripe_examples/webhook_event_examples.rb +62 -16
  152. data/spec/spec_helper.rb +8 -5
  153. data/spec/stripe_mock_spec.rb +4 -4
  154. data/spec/support/shared_contexts/stripe_validator_spec.rb +8 -0
  155. data/spec/support/stripe_examples.rb +11 -1
  156. data/stripe-ruby-mock.gemspec +9 -5
  157. metadata +115 -47
  158. data/.travis.yml +0 -28
  159. data/spec/shared_stripe_examples/product_example.rb +0 -65
@@ -0,0 +1,215 @@
1
+ require "spec_helper"
2
+
3
+ shared_examples "Product API" do
4
+ let(:product_attributes) { {id: "prod_123", name: "My Mock Product"} }
5
+ let(:product) { Stripe::Product.create(product_attributes) }
6
+
7
+ it "creates a stripe product" do
8
+ expect(product.id).to eq("prod_123")
9
+ expect(product.name).to eq("My Mock Product")
10
+ expect(product.type).to eq("service")
11
+ end
12
+
13
+ it "stores a created stripe product in memory" do
14
+ product = Stripe::Product.create(product_attributes)
15
+ product2 = Stripe::Product.create(product_attributes.merge({id: "prod_456", name: "My Other Product"}))
16
+
17
+ data = test_data_source(:products)
18
+ expect(data[product.id]).to_not be_nil
19
+ expect(data[product.id][:id]).to eq("prod_123")
20
+ expect(data[product.id][:name]).to eq("My Mock Product")
21
+ expect(data[product2.id]).to_not be_nil
22
+ expect(data[product2.id][:id]).to eq("prod_456")
23
+ expect(data[product2.id][:name]).to eq("My Other Product")
24
+ end
25
+
26
+ it "retrieves a stripe product" do
27
+ original = stripe_helper.create_product(product_attributes)
28
+ product = Stripe::Product.retrieve(original.id)
29
+
30
+ expect(product.id).to eq(original.id)
31
+ expect(product.name).to eq(original.name)
32
+ end
33
+
34
+ it "updates a stripe product" do
35
+ stripe_helper.create_product(id: "prod_XYZ", name: "Future Product")
36
+
37
+ product = Stripe::Product.retrieve("prod_XYZ")
38
+ expect(product.name).to eq("Future Product")
39
+
40
+ product.name = "Updated Product"
41
+ product.save
42
+ product = Stripe::Product.retrieve("prod_XYZ")
43
+ expect(product.name).to eq("Updated Product")
44
+ end
45
+
46
+ it "cannot retrieve a stripe product that doesn't exist" do
47
+ expect { Stripe::Product.retrieve('nope') }.to raise_error {|e|
48
+ expect(e).to be_a Stripe::InvalidRequestError
49
+ expect(e.param).to eq("product")
50
+ expect(e.http_status).to eq(404)
51
+ }
52
+ end
53
+
54
+ it "deletes a stripe product" do
55
+ stripe_helper.create_product(id: "prod_DEL", name: "Aging Product")
56
+
57
+ product = Stripe::Product.retrieve("prod_DEL")
58
+ expect(product).to_not be_nil
59
+
60
+ product.delete
61
+
62
+ expect { Stripe::Product.retrieve("prod_DEL") }.to raise_error {|e|
63
+ expect(e).to be_a Stripe::InvalidRequestError
64
+ expect(e.param).to eq("product")
65
+ expect(e.http_status).to eq(404)
66
+ }
67
+ end
68
+
69
+ it "retrieves all products" do
70
+ stripe_helper.create_product(id: "prod_123", name: "First Product")
71
+ stripe_helper.create_product(id: "prod_456", name: "Second Product")
72
+
73
+ all = Stripe::Product.list
74
+ expect(all.count).to eq(2)
75
+ expect(all.map &:id).to include("prod_123", "prod_456")
76
+ expect(all.map &:name).to include("First Product", "Second Product")
77
+ end
78
+
79
+ it 'retrieves products with limit' do
80
+ 101.times do |i|
81
+ stripe_helper.create_product(id: "Product #{i}", name: "My Product ##{i}")
82
+ end
83
+ all = Stripe::Product.list(limit: 100)
84
+
85
+ expect(all.count).to eq(100)
86
+ end
87
+
88
+ context "searching products" do
89
+ # the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
90
+ it "searches products for exact matches", :aggregate_failures do
91
+ response = Stripe::Product.search({query: 'name:"one"'}, stripe_version: '2020-08-27')
92
+ expect(response.data.size).to eq(0)
93
+
94
+ one = stripe_helper.create_product(
95
+ id: "product_1",
96
+ name: "one",
97
+ description: "un",
98
+ shippable: true,
99
+ url: "http://example.com/one",
100
+ metadata: {key: "uno"},
101
+ )
102
+ two = stripe_helper.create_product(
103
+ id: "product_2",
104
+ name: "two",
105
+ active: false,
106
+ description: "deux",
107
+ url: "http://example.com/two",
108
+ metadata: {key: "dos"},
109
+ )
110
+
111
+ response = Stripe::Product.search({query: 'active:"true"'}, stripe_version: '2020-08-27')
112
+ expect(response.data.map(&:id)).to match_array([one.id])
113
+
114
+ response = Stripe::Product.search({query: 'description:"deux"'}, stripe_version: '2020-08-27')
115
+ expect(response.data.map(&:id)).to match_array([two.id])
116
+
117
+ response = Stripe::Product.search({query: 'name:"one"'}, stripe_version: '2020-08-27')
118
+ expect(response.data.map(&:id)).to match_array([one.id])
119
+
120
+ response = Stripe::Product.search({query: 'shippable:"true"'}, stripe_version: '2020-08-27')
121
+ expect(response.data.map(&:id)).to match_array([one.id])
122
+
123
+ response = Stripe::Product.search({query: 'url:"http://example.com/two"'}, stripe_version: '2020-08-27')
124
+ expect(response.data.map(&:id)).to match_array([two.id])
125
+
126
+ response = Stripe::Product.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
127
+ expect(response.data.map(&:id)).to match_array([one.id])
128
+ end
129
+
130
+ it "respects limit", :aggregate_failures do
131
+ 11.times do |i|
132
+ stripe_helper.create_product(id: "product_#{i}", name: "Product #{i}")
133
+ end
134
+
135
+ response = Stripe::Product.search({query: 'active:"true"'}, stripe_version: '2020-08-27')
136
+ expect(response.data.size).to eq(10)
137
+ response = Stripe::Product.search({query: 'active:"true"', limit: 1}, stripe_version: '2020-08-27')
138
+ expect(response.data.size).to eq(1)
139
+ end
140
+
141
+ it "reports search errors", :aggregate_failures do
142
+ expect {
143
+ Stripe::Product.search({limit: 1}, stripe_version: '2020-08-27')
144
+ }.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
145
+
146
+ expect {
147
+ Stripe::Product.search({query: 'asdf'}, stripe_version: '2020-08-27')
148
+ }.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
149
+
150
+ expect {
151
+ Stripe::Product.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
152
+ }.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `products`./)
153
+ end
154
+ end
155
+
156
+ describe "Validation", :live => true do
157
+ include_context "stripe validator"
158
+ let(:params) { stripe_helper.create_product_params }
159
+ let(:subject) { Stripe::Product.create(params) }
160
+ before { stripe_helper.delete_product(params[:id]) }
161
+
162
+ describe "Required Parameters" do
163
+ after do
164
+ params.delete(@attribute_name)
165
+ message = stripe_validator.missing_param_message(@attribute_name)
166
+ expect { subject }.to raise_error(Stripe::InvalidRequestError, message)
167
+ end
168
+
169
+ it("requires a name") { @attribute_name = :name }
170
+ end
171
+
172
+ describe "Uniqueness" do
173
+ let(:already_exists_message){ stripe_validator.already_exists_message(Stripe::Product) }
174
+
175
+ it "validates uniqueness of identifier" do
176
+ stripe_helper.delete_product(params[:id])
177
+
178
+ Stripe::Product.create(params)
179
+ expect {
180
+ Stripe::Product.create(params)
181
+ }.to raise_error(Stripe::InvalidRequestError, already_exists_message)
182
+ end
183
+ end
184
+ end
185
+
186
+ describe "Mock Data" do
187
+ let(:mock_object) { StripeMock::Data.mock_product }
188
+ let(:known_attributes) { [
189
+ :id,
190
+ :object,
191
+ :active,
192
+ :attributes,
193
+ :caption,
194
+ :created,
195
+ :deactivate_on,
196
+ :description,
197
+ :images,
198
+ :livemode,
199
+ :metadata,
200
+ :name,
201
+ :package_dimensions,
202
+ :shippable,
203
+ :statement_descriptor,
204
+ :type,
205
+ :unit_label,
206
+ :updated,
207
+ :url
208
+ ] }
209
+
210
+ it "includes all retreived attributes" do
211
+ expect(mock_object.keys).to eql(known_attributes)
212
+ end
213
+ end
214
+
215
+ end
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ shared_examples "PromotionCode API" do
4
+ let(:coupon) { stripe_helper.create_coupon }
5
+
6
+ it "creates a promotion code" do
7
+ promotion_code = Stripe::PromotionCode.create({id: "promo_123", coupon: coupon.id, code: "FREESTUFF"})
8
+
9
+ expect(promotion_code.id).to eq("promo_123")
10
+ expect(promotion_code.code).to eq("FREESTUFF")
11
+ expect(promotion_code.coupon).to eq(coupon.id)
12
+ end
13
+
14
+ it "creates a promotion code without specifying code" do
15
+ promotion_code = Stripe::PromotionCode.create({id: "promo_123", coupon: coupon.id})
16
+
17
+ expect(promotion_code.id).to eq("promo_123")
18
+ expect(promotion_code.code).to eq("TESTCODE")
19
+ expect(promotion_code.coupon).to eq(coupon.id)
20
+ end
21
+
22
+ it "cannot create a promotion code without a coupon" do
23
+ expect {
24
+ Stripe::PromotionCode.create
25
+ }.to raise_error { |e|
26
+ expect(e).to be_a(Stripe::InvalidRequestError)
27
+ expect(e.message).to eq("Missing required param: coupon")
28
+ }
29
+ end
30
+
31
+ it "requires minimum amount currency when minimum amount is provided" do
32
+ expect {
33
+ Stripe::PromotionCode.create(coupon: coupon, restrictions: {minimum_amount: 100})
34
+ }.to raise_error { |e|
35
+ expect(e).to be_a(Stripe::InvalidRequestError)
36
+ expect(e.message).to eq("You must pass minimum_amount_currency when passing minimum_amount")
37
+ }
38
+ end
39
+
40
+ it "updates a promotion code" do
41
+ promotion_code = Stripe::PromotionCode.create({coupon: coupon.id})
42
+ expect(promotion_code.active).to eq(true)
43
+
44
+ updated = Stripe::PromotionCode.update(promotion_code.id, active: false)
45
+
46
+ expect(updated.active).to eq(false)
47
+ end
48
+
49
+ it "retrieves a promotion code" do
50
+ original = Stripe::PromotionCode.create({coupon: coupon.id})
51
+
52
+ promotion_code = Stripe::PromotionCode.retrieve(original.id)
53
+
54
+ expect(promotion_code.id).to eq(original.id)
55
+ expect(promotion_code.code).to eq(original.code)
56
+ expect(promotion_code.coupon).to eq(original.coupon)
57
+ end
58
+
59
+ it "lists all promotion codes" do
60
+ Stripe::PromotionCode.create({coupon: coupon.id, code: "10PERCENT"})
61
+ Stripe::PromotionCode.create({coupon: coupon.id, code: "20PERCENT"})
62
+
63
+ all = Stripe::PromotionCode.list
64
+
65
+ expect(all.count).to eq(2)
66
+ expect(all.map(&:code)).to include("10PERCENT", "20PERCENT")
67
+ end
68
+ end
@@ -22,6 +22,19 @@ shared_examples 'Refund API' do
22
22
  expect(charge.amount_refunded).to eq(999)
23
23
  end
24
24
 
25
+ it "refunds a stripe payment intent" do
26
+ payment_intent = Stripe::PaymentIntent.create(
27
+ amount: 999,
28
+ currency: 'USD'
29
+ )
30
+
31
+ refund = Stripe::Refund.create(
32
+ payment_intent: payment_intent.id
33
+ )
34
+ expect(refund.amount).to eq(999)
35
+ end
36
+
37
+
25
38
  it "creates a stripe refund with a status" do
26
39
  charge = Stripe::Charge.create(
27
40
  amount: 999,
@@ -30,9 +43,7 @@ shared_examples 'Refund API' do
30
43
  description: 'card charge'
31
44
  )
32
45
 
33
- Stripe::Refund.create(
34
- charge: charge.id
35
- )
46
+ Stripe::Refund.create(charge: charge.id)
36
47
 
37
48
  charge = Stripe::Charge.retrieve(charge.id)
38
49
 
@@ -262,7 +273,7 @@ shared_examples 'Refund API' do
262
273
  end
263
274
 
264
275
  it "stores all charges in memory" do
265
- expect(Stripe::Refund.all.data.map(&:id)).to eq([@refund2.id, @refund.id])
276
+ expect(Stripe::Refund.list.data.map(&:id)).to eq([@refund2.id, @refund.id])
266
277
  end
267
278
 
268
279
  it "defaults count to 10 charges" do
@@ -275,7 +286,7 @@ shared_examples 'Refund API' do
275
286
  Stripe::Refund.create(charge: charge.id)
276
287
  end
277
288
 
278
- expect(Stripe::Refund.all.data.count).to eq(10)
289
+ expect(Stripe::Refund.list.data.count).to eq(10)
279
290
  end
280
291
 
281
292
  it "is marked as having more when more objects exist" do
@@ -288,12 +299,12 @@ shared_examples 'Refund API' do
288
299
  Stripe::Refund.create(charge: charge.id)
289
300
  end
290
301
 
291
- expect(Stripe::Refund.all.has_more).to eq(true)
302
+ expect(Stripe::Refund.list.has_more).to eq(true)
292
303
  end
293
304
 
294
305
  context "when passing limit" do
295
306
  it "gets that many charges" do
296
- expect(Stripe::Refund.all(limit: 1).count).to eq(1)
307
+ expect(Stripe::Refund.list(limit: 1).count).to eq(1)
297
308
  end
298
309
  end
299
310
  end
@@ -318,13 +329,13 @@ shared_examples 'Refund API' do
318
329
  Stripe::Refund.create(charge: charge.id)
319
330
  end
320
331
 
321
- all = Stripe::Refund.all
332
+ all_refunds = Stripe::Refund.list
322
333
  default_limit = 10
323
- half = Stripe::Refund.all(starting_after: all.data.at(1).id)
334
+ half = Stripe::Refund.list(starting_after: all_refunds.data.at(1).id)
324
335
 
325
336
  expect(half).to be_a(Stripe::ListObject)
326
337
  expect(half.data.count).to eq(default_limit)
327
- expect(half.data.first.id).to eq(all.data.at(2).id)
338
+ expect(half.data.first.id).to eq(all_refunds.data.at(2).id)
328
339
  end
329
340
 
330
341
  describe "idempotency" do
@@ -378,7 +389,8 @@ shared_examples 'Refund API' do
378
389
  description: 'card charge'
379
390
  )
380
391
 
381
- charge = charge.refund(amount: 999)
392
+ Stripe::Refund.create(charge: charge.id, amount: 999)
393
+ charge.refresh
382
394
 
383
395
  expect(charge.refunded).to eq(true)
384
396
  expect(charge.refunds.data.first.amount).to eq(999)
@@ -392,10 +404,10 @@ shared_examples 'Refund API' do
392
404
  source: stripe_helper.generate_card_token,
393
405
  description: 'card charge'
394
406
  )
395
- refund = charge.refund
407
+ refund = Stripe::Refund.create(charge: charge.id)
396
408
 
397
409
  expect(charge.id).to match(/^(test_)?ch/)
398
- expect(refund.id).to eq(charge.id)
410
+ expect(refund.charge).to eq(charge.id)
399
411
  end
400
412
 
401
413
  it "creates a stripe refund with a refund ID" do
@@ -405,10 +417,12 @@ shared_examples 'Refund API' do
405
417
  source: stripe_helper.generate_card_token,
406
418
  description: 'card charge'
407
419
  )
408
- refund = charge.refund
409
420
 
410
- expect(refund.refunds.data.count).to eq 1
411
- expect(refund.refunds.data.first.id).to match(/^test_re/)
421
+ Stripe::Refund.create(charge: charge.id)
422
+ refunds = Stripe::Refund.list(charge: charge.id)
423
+
424
+ expect(refunds.data.count).to eq 1
425
+ expect(refunds.data.first.id).to match(/^test_re/)
412
426
  end
413
427
 
414
428
  it "creates a stripe refund with a status" do
@@ -418,10 +432,12 @@ shared_examples 'Refund API' do
418
432
  source: stripe_helper.generate_card_token,
419
433
  description: 'card charge'
420
434
  )
421
- refund = charge.refund
422
435
 
423
- expect(refund.refunds.data.count).to eq 1
424
- expect(refund.refunds.data.first.status).to eq("succeeded")
436
+ Stripe::Refund.create(charge: charge.id)
437
+ refunds = Stripe::Refund.list(charge: charge.id)
438
+
439
+ expect(refunds.data.count).to eq 1
440
+ expect(refunds.data.first.status).to eq("succeeded")
425
441
  end
426
442
 
427
443
  it "creates a stripe refund with a different balance transaction than the charge" do
@@ -431,9 +447,10 @@ shared_examples 'Refund API' do
431
447
  source: stripe_helper.generate_card_token,
432
448
  description: 'card charge'
433
449
  )
434
- refund = charge.refund
450
+ Stripe::Refund.create(charge: charge.id)
451
+ refunds = Stripe::Refund.list(charge: charge.id)
435
452
 
436
- expect(charge.balance_transaction).not_to eq(refund.refunds.data.first.balance_transaction)
453
+ expect(charge.balance_transaction).not_to eq(refunds.data.first.balance_transaction)
437
454
  end
438
455
 
439
456
  it "creates a refund off a charge", :live => true do
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'SetupIntent API' do
4
+
5
+ it "creates a stripe setup_intent" do
6
+ setup_intent = Stripe::SetupIntent.create()
7
+
8
+ expect(setup_intent.id).to match(/^test_si/)
9
+ expect(setup_intent.metadata.to_hash).to eq({})
10
+ expect(setup_intent.status).to eq('requires_payment_method')
11
+ end
12
+
13
+ it 'creates a stripe setup intent with payment method' do
14
+ setup_intent = Stripe::SetupIntent.create(payment_method: 'random')
15
+
16
+ expect(setup_intent.id).to match(/^test_si/)
17
+ expect(setup_intent.metadata.to_hash).to eq({})
18
+ expect(setup_intent.status).to eq('requires_action')
19
+ end
20
+
21
+ describe "listing setup_intent" do
22
+ before do
23
+ 3.times do
24
+ Stripe::SetupIntent.create()
25
+ end
26
+ end
27
+
28
+ it "without params retrieves all stripe setup_intent" do
29
+ expect(Stripe::SetupIntent.list.count).to eq(3)
30
+ end
31
+
32
+ it "accepts a limit param" do
33
+ expect(Stripe::SetupIntent.list(limit: 2).count).to eq(2)
34
+ end
35
+ end
36
+
37
+ it "retrieves a stripe setup_intent" do
38
+ original = Stripe::SetupIntent.create()
39
+ setup_intent = Stripe::SetupIntent.retrieve(original.id)
40
+
41
+ expect(setup_intent.id).to eq(original.id)
42
+ expect(setup_intent.metadata.to_hash).to eq(original.metadata.to_hash)
43
+ end
44
+
45
+ it "cannot retrieve a setup_intent that doesn't exist" do
46
+ expect { Stripe::SetupIntent.retrieve('nope') }.to raise_error {|e|
47
+ expect(e).to be_a Stripe::InvalidRequestError
48
+ expect(e.param).to eq('setup_intent')
49
+ expect(e.http_status).to eq(404)
50
+ }
51
+ end
52
+
53
+ it "expands payment_method" do
54
+ payment_method = Stripe::PaymentMethod.create(type: "card")
55
+ original = Stripe::SetupIntent.create(payment_method: payment_method.id)
56
+
57
+ setup_intent = Stripe::SetupIntent.retrieve({id: original.id, expand: ["payment_method"]})
58
+
59
+ expect(setup_intent.payment_method).to eq(payment_method)
60
+ end
61
+
62
+ it "confirms a stripe setup_intent" do
63
+ setup_intent = Stripe::SetupIntent.create()
64
+ confirmed_setup_intent = setup_intent.confirm()
65
+ expect(confirmed_setup_intent.status).to eq("succeeded")
66
+ end
67
+
68
+ it "cancels a stripe setup_intent" do
69
+ setup_intent = Stripe::SetupIntent.create()
70
+ confirmed_setup_intent = setup_intent.cancel()
71
+ expect(confirmed_setup_intent.status).to eq("canceled")
72
+ end
73
+
74
+ it "updates a stripe setup_intent" do
75
+ original = Stripe::SetupIntent.create()
76
+ setup_intent = Stripe::SetupIntent.retrieve(original.id)
77
+
78
+ setup_intent.metadata[:foo] = :bar
79
+ setup_intent.save
80
+
81
+ updated = Stripe::SetupIntent.retrieve(original.id)
82
+
83
+ expect(updated.metadata[:foo]).to eq(:bar)
84
+ end
85
+ end