stripe-ruby-mock 3.0.0 → 3.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 83e0a13431e08fd71904300dbc7717e48deead7f
4
- data.tar.gz: 481c5c3a5d1643107ddf35fbaf14e0f8bdd36f72
3
+ metadata.gz: 7918d71c6145222a77feaeea20d2e5c211ce53c4
4
+ data.tar.gz: 1aa548101a97a4fb5d5afe9294928b65fe0491d4
5
5
  SHA512:
6
- metadata.gz: 46c6533cfb41b36eaa7be7ac93a54e2d7f3f5c74eb2e48c1473c21f88c49b65011153719c2b9f62cf5f1157a6e7938ea3a84ff133c363445a5212e9dc6a59682
7
- data.tar.gz: 1d09905741e5fa10537abfedb94db03b5c9475db967476b5c8e87c460ae46821e07d89455f008ba7c902b61adcf751b16ed812c9fd5bf949c5f4de3336b32491
6
+ metadata.gz: d83ccd0ba75faea9acce0f2f978099f215e22cd60563e80375a8e6f40ba3879e9b3d00b4a467f23797a80320e641629a60c20ebc675c2b7bfc92fedc055bc0d2
7
+ data.tar.gz: 2e84b51981c315096a514e6d0e6caf8085d239a800e6dd47590d323bedd492d9c79250c448caa70c7a9ac8ae2f7d62b55d5928b2d489ff379b35e448d90584e0
@@ -0,0 +1,22 @@
1
+ ### 3.0.2 (Next)
2
+
3
+ * Your contribution here.
4
+
5
+ ### 3.0.1 (TBD)
6
+ * Added Changelog file
7
+ * [#640](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/640): Support Payment Intent status requires_capture - [@theodorton](https://github.com/theodorton).
8
+ * [#685](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/685): Adds support for pending_invoice_item_interval - [@joshcass](https://github.com/joshcass).
9
+ * [#682](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/682): Prevent customer metadata from being overwritten with each update - [@sethkrasnianski](https://github.com/sethkrasnianski).
10
+ * [#679](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/679): Fix for [#678](https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues/678) Add active filter to Data::List - [@rnmp](https://github.com/rnmp).
11
+ * [#668](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/668): Fix for [#665](https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues/665) Allow to remove discount from customer - [@mnin](https://github.com/mnin).
12
+ * [#667](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/667):
13
+ Remove empty and duplicated methods from payment methods - [@mnin](https://github.com/mnin).
14
+ * [#664](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/664): Bugfix: pass through PaymentIntent amount to mocked Charge - [@typeoneerror](https://github.com/typeoneerror).
15
+ * [#654](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/654): fix for [#626](https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues/626) Added missing decline codes - [@iCreateJB](https://github.com/iCreateJB).
16
+ * [#648](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/648): Initial implementation of checkout session API - [@fauxparse](https://github.com/fauxparse).
17
+ * [#644](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/644): Allow payment_behavior attribute on subscription create - [@j15e](https://github.com/j15e).
18
+
19
+ ### 3.0.0 (2019-12-17)
20
+
21
+ ##### the main thing is:
22
+ - [#658](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/658) Make the gem compatible with Stripe Gem v.5
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
- # stripe-ruby-mock [![Build Status](https://travis-ci.org/rebelidealist/stripe-ruby-mock.png?branch=master)](https://travis-ci.org/rebelidealist/stripe-ruby-mock) [![Gitter chat](https://badges.gitter.im/rebelidealist/stripe-ruby-mock.png)](https://gitter.im/rebelidealist/stripe-ruby-mock)
1
+ # stripe-ruby-mock [![Build Status](https://travis-ci.org/stripe-ruby-mock/stripe-ruby-mock.png?branch=master)](https://travis-ci.org/stripe-ruby-mock/stripe-ruby-mock) [![Gitter chat](https://badges.gitter.im/rebelidealist/stripe-ruby-mock.png)](https://gitter.im/rebelidealist/stripe-ruby-mock)
2
2
 
3
- * Homepage: https://github.com/rebelidealist/stripe-ruby-mock
4
- * Issues: https://github.com/rebelidealist/stripe-ruby-mock/issues
3
+ * Homepage: https://github.com/stripe-ruby-mock/stripe-ruby-mock
4
+ * Issues: https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues
5
5
  * **CHAT**: https://gitter.im/rebelidealist/stripe-ruby-mock
6
6
 
7
7
  # REQUEST: Looking for More Core Contributors
@@ -12,7 +12,13 @@ This gem has unexpectedly grown in popularity and I've gotten pretty busy, so I'
12
12
 
13
13
  In your gemfile:
14
14
 
15
- gem 'stripe-ruby-mock', '~> 3.0.0', :require => 'stripe_mock'
15
+ gem 'stripe-ruby-mock', '~> 3.0.1', :require => 'stripe_mock'
16
+
17
+ ## !!! Important
18
+
19
+ We have [changelog](https://github.com/stripe-ruby-mock/stripe-ruby-mock/blob/master/CHANGELOG.md). It's first attempt. Feel free to update it and suggest to a new format of it.
20
+
21
+ version `3.0.0` has [breaking changes](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/658) - we support stripe > 5 and < 6 for now and try to follow the newest API version. But if you still use older versions please [read](https://github.com/stripe-ruby-mock/stripe-ruby-mock#specifications).
16
22
 
17
23
  ## Features
18
24
 
@@ -76,6 +76,7 @@ require 'stripe_mock/request_handlers/country_spec.rb'
76
76
  require 'stripe_mock/request_handlers/ephemeral_key.rb'
77
77
  require 'stripe_mock/request_handlers/products.rb'
78
78
  require 'stripe_mock/request_handlers/tax_rates.rb'
79
+ require 'stripe_mock/request_handlers/checkout.rb'
79
80
  require 'stripe_mock/instance'
80
81
 
81
82
  require 'stripe_mock/test_strategies/base.rb'
@@ -37,6 +37,9 @@ module StripeMock
37
37
  when :processing_error then build_card_error('An error occurred while processing the card', nil, code: 'processing_error', http_status: 402)
38
38
  when :card_error then build_card_error('The card number is not a valid credit card number.', 'number', code: 'invalid_number', http_status: 402)
39
39
  when :incorrect_zip then build_card_error('The zip code you supplied failed validation.', 'address_zip', code: 'incorrect_zip', http_status: 402)
40
+ when :insufficient_funds then build_card_error('The card has insufficient funds to complete the purchase.', nil, code: 'insufficient_funds', http_status: 402)
41
+ when :lost_card then build_card_error('The payment has been declined because the card is reported lost.', nil, code: 'lost_card', http_status: 402)
42
+ when :stolen_card then build_card_error('The payment has been declined because the card is reported stolen.', nil, code: 'stolen_card', http_status: 402)
40
43
  end
41
44
  end
42
45
 
@@ -349,7 +349,9 @@ module StripeMock
349
349
  tax_percent: nil,
350
350
  discount: nil,
351
351
  metadata: {},
352
- default_tax_rates: nil
352
+ default_tax_rates: nil,
353
+ pending_invoice_item_interval: nil,
354
+ next_pending_invoice_item_invoice: nil
353
355
  }, params)
354
356
  end
355
357
 
@@ -1184,7 +1186,7 @@ module StripeMock
1184
1186
  },
1185
1187
  customer: params[:customer] || nil,
1186
1188
  metadata: {
1187
- "order_id": "123456789"
1189
+ order_id: "123456789"
1188
1190
  }
1189
1191
 
1190
1192
  }.merge(params)
@@ -1208,12 +1210,50 @@ module StripeMock
1208
1210
  :on_behalf_of => nil,
1209
1211
  :payment_method => nil,
1210
1212
  :payment_method_options => {
1211
- "card": {"request_three_d_secure":"automatic"}
1213
+ card: {request_three_d_secure: "automatic"}
1212
1214
  },
1213
1215
  :payment_method_types => ["card"],
1214
1216
  :status => "requires_payment_method",
1215
1217
  :usage => "off_session"
1216
1218
  }.merge(params)
1217
1219
  end
1220
+
1221
+ def self.mock_checkout_session(params = {})
1222
+ cs_id = params[:id] || "test_cs_default"
1223
+ currency = params[:currency] || StripeMock.default_currency
1224
+ {
1225
+ id: cs_id,
1226
+ object: 'checkout.session',
1227
+ billing_address_collection: nil,
1228
+ cancel_url: 'https://example.com/cancel',
1229
+ client_reference_id: nil,
1230
+ customer: nil,
1231
+ customer_email: nil,
1232
+ display_items: [
1233
+ {
1234
+ amount: 1500,
1235
+ currency: currency,
1236
+ custom: {
1237
+ description: 'Comfortable cotton t-shirt',
1238
+ images: nil,
1239
+ name: 'T-shirt'
1240
+ },
1241
+ quantity: 2,
1242
+ type: 'custom'
1243
+ }
1244
+ ],
1245
+ livemode: false,
1246
+ locale: nil,
1247
+ mode: nil,
1248
+ payment_intent: mock_payment_intent[:id],
1249
+ payment_method_types: [
1250
+ 'card'
1251
+ ],
1252
+ setup_intent: nil,
1253
+ submit_type: nil,
1254
+ subscription: nil,
1255
+ success_url: 'https://example.com/success'
1256
+ }.merge(params)
1257
+ end
1218
1258
  end
1219
1259
  end
@@ -1,13 +1,14 @@
1
1
  module StripeMock
2
2
  module Data
3
3
  class List
4
- attr_reader :data, :limit, :offset, :starting_after, :ending_before
4
+ attr_reader :data, :limit, :offset, :starting_after, :ending_before, :active
5
5
 
6
6
  def initialize(data, options = {})
7
7
  @data = Array(data.clone)
8
8
  @limit = [[options[:limit] || 10, 100].min, 1].max # restrict @limit to 1..100
9
9
  @starting_after = options[:starting_after]
10
10
  @ending_before = options[:ending_before]
11
+ @active = options[:active]
11
12
  if @data.first.is_a?(Hash) && @data.first[:created]
12
13
  @data.sort_by! { |x| x[:created] }
13
14
  @data.reverse!
@@ -53,14 +54,21 @@ module StripeMock
53
54
  (index || raise("No such object id: #{starting_after}")) + 1
54
55
  when ending_before
55
56
  index = data.index { |datum| datum[:id] == ending_before }
56
- (index || raise("No such object id: #{ending_before}")) - 1
57
+ (index || raise("No such object id: #{ending_before}")) - 1
57
58
  else
58
59
  0
59
60
  end
60
61
  end
61
62
 
62
63
  def data_page
63
- data[offset, limit]
64
+ filtered_data[offset, limit]
65
+ end
66
+
67
+ def filtered_data
68
+ filtered_data = data
69
+ filtered_data = filtered_data.select { |d| d[:active] == active } unless active.nil?
70
+
71
+ filtered_data
64
72
  end
65
73
 
66
74
  def object_types
@@ -49,11 +49,12 @@ module StripeMock
49
49
  include StripeMock::RequestHandlers::Payouts
50
50
  include StripeMock::RequestHandlers::EphemeralKey
51
51
  include StripeMock::RequestHandlers::TaxRates
52
+ include StripeMock::RequestHandlers::Checkout
52
53
 
53
54
  attr_reader :accounts, :balance, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
54
55
  :disputes, :events, :invoices, :invoice_items, :orders, :payment_intents, :payment_methods,
55
56
  :setup_intents, :plans, :recipients, :refunds, :transfers, :payouts, :subscriptions, :country_spec,
56
- :subscriptions_items, :products, :tax_rates
57
+ :subscriptions_items, :products, :tax_rates, :checkout_sessions
57
58
 
58
59
  attr_accessor :error_queue, :debug, :conversion_rate, :account_balance
59
60
 
@@ -85,6 +86,7 @@ module StripeMock
85
86
  @subscriptions_items = {}
86
87
  @country_spec = {}
87
88
  @tax_rates = {}
89
+ @checkout_sessions = {}
88
90
 
89
91
  @debug = false
90
92
  @error_queue = ErrorQueue.new
@@ -0,0 +1,15 @@
1
+ module StripeMock
2
+ module RequestHandlers
3
+ module Checkout
4
+ def Checkout.included(klass)
5
+ klass.add_handler 'post /v1/checkout/sessions', :new_session
6
+ end
7
+
8
+ def new_session(route, method_url, params, headers)
9
+ params[:id] ||= new_id('cs')
10
+
11
+ checkout_sessions[params[:id]] = Data.mock_checkout_session(params)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -29,7 +29,7 @@ module StripeMock
29
29
  params[:default_source] = sources.first[:id]
30
30
  end
31
31
 
32
- customers[ params[:id] ] = Data.mock_customer(sources, params)
32
+ customers[params[:id]] = Data.mock_customer(sources, params)
33
33
 
34
34
  if params[:plan]
35
35
  plan_id = params[:plan].to_s
@@ -48,19 +48,22 @@ module StripeMock
48
48
  end
49
49
 
50
50
  if params[:coupon]
51
- coupon = coupons[ params[:coupon] ]
51
+ coupon = coupons[params[:coupon]]
52
52
  assert_existence :coupon, params[:coupon], coupon
53
-
54
53
  add_coupon_to_object(customers[params[:id]], coupon)
55
54
  end
56
55
 
57
- customers[ params[:id] ]
56
+ customers[params[:id]]
58
57
  end
59
58
 
60
59
  def update_customer(route, method_url, params, headers)
61
60
  route =~ method_url
62
61
  cus = assert_existence :customer, $1, customers[$1]
63
62
 
63
+ # get existing and pending metadata
64
+ metadata = cus.delete(:metadata) || {}
65
+ metadata_updates = params.delete(:metadata) || {}
66
+
64
67
  # Delete those params if their value is nil. Workaround of the problematic way Stripe serialize objects
65
68
  params.delete(:sources) if params[:sources] && params[:sources][:data].nil?
66
69
  params.delete(:subscriptions) if params[:subscriptions] && params[:subscriptions][:data].nil?
@@ -72,6 +75,7 @@ module StripeMock
72
75
  params.delete(:subscriptions) unless params[:subscriptions][:data].any?{ |v| !!v[:type]}
73
76
  end
74
77
  cus.merge!(params)
78
+ cus[:metadata] = {**metadata, **metadata_updates}
75
79
 
76
80
  if params[:source]
77
81
  if params[:source].is_a?(String)
@@ -87,10 +91,14 @@ module StripeMock
87
91
  end
88
92
 
89
93
  if params[:coupon]
90
- coupon = coupons[ params[:coupon] ]
91
- assert_existence :coupon, params[:coupon], coupon
94
+ if params[:coupon] == ''
95
+ delete_coupon_from_object(cus)
96
+ else
97
+ coupon = coupons[params[:coupon]]
98
+ assert_existence :coupon, params[:coupon], coupon
92
99
 
93
- add_coupon_to_object(cus, coupon)
100
+ add_coupon_to_object(cus, coupon)
101
+ end
94
102
  end
95
103
 
96
104
  cus
@@ -12,6 +12,11 @@ module StripeMock
12
12
  object[:discount] = Stripe::Discount.construct_from(discount_attrs)
13
13
  object
14
14
  end
15
+
16
+ def delete_coupon_from_object(object)
17
+ object[:discount] = nil
18
+ object
19
+ end
15
20
  end
16
21
  end
17
22
  end
@@ -32,7 +32,7 @@ module StripeMock
32
32
  start_time = options[:current_period_start] || now
33
33
  params = { customer: cus[:id], current_period_start: start_time, created: created_time }
34
34
  params.merge!({ :plan => (plans.size == 1 ? plans.first : nil) })
35
- keys_to_merge = /application_fee_percent|quantity|metadata|tax_percent|billing|days_until_due|default_tax_rates/
35
+ keys_to_merge = /application_fee_percent|quantity|metadata|tax_percent|billing|days_until_due|default_tax_rates|pending_invoice_item_interval/
36
36
  params.merge! options.select {|k,v| k =~ keys_to_merge}
37
37
 
38
38
  if options[:cancel_at_period_end] == true
@@ -20,6 +20,7 @@ module StripeMock
20
20
  status = case params[:amount]
21
21
  when 3184 then 'requires_action'
22
22
  when 3178 then 'requires_payment_method'
23
+ when 3055 then 'requires_capture'
23
24
  else
24
25
  'succeeded'
25
26
  end
@@ -167,7 +168,13 @@ module StripeMock
167
168
  def succeeded_payment_intent(payment_intent)
168
169
  payment_intent[:status] = 'succeeded'
169
170
  btxn = new_balance_transaction('txn', { source: payment_intent[:id] })
170
- payment_intent[:charges][:data] << Data.mock_charge(balance_transaction: btxn)
171
+
172
+ payment_intent[:charges][:data] << Data.mock_charge(
173
+ balance_transaction: btxn,
174
+ amount: payment_intent[:amount],
175
+ currency: payment_intent[:currency]
176
+ )
177
+
171
178
  payment_intent
172
179
  end
173
180
  end
@@ -1,7 +1,6 @@
1
1
  module StripeMock
2
2
  module RequestHandlers
3
3
  module PaymentMethods
4
-
5
4
  ALLOWED_PARAMS = [:customer, :type]
6
5
 
7
6
  def PaymentMethods.included(klass)
@@ -52,26 +51,6 @@ module StripeMock
52
51
 
53
52
  Data.mock_list_object(clone.values, params)
54
53
  end
55
-
56
- #
57
- # params: {:customer=>"test_cus_3"}
58
- #
59
- def attach_payment_method(route, method_url, params, headers)
60
- route =~ method_url
61
- id = $1
62
- payment_methods[id].merge!(params)
63
- payment_methods[id].clone
64
- end
65
-
66
- def detach_payment_method(route, method_url, params, headers)
67
-
68
- end
69
-
70
- def get_payment_method(route, method_url, params, headers)
71
- route =~ method_url
72
- id = $1
73
- assert_existence(:payment_method, $1, payment_methods[id])
74
- end
75
54
 
76
55
  # post /v1/payment_methods/:id/attach
77
56
  def attach_payment_method(route, method_url, params, headers)
@@ -34,7 +34,7 @@ module StripeMock
34
34
 
35
35
  def list_plans(route, method_url, params, headers)
36
36
  limit = params[:limit] ? params[:limit] : 10
37
- Data.mock_list_object(plans.values.first(limit), limit: limit)
37
+ Data.mock_list_object(plans.values.first(limit), params.merge!(limit: limit))
38
38
  end
39
39
 
40
40
  end
@@ -102,7 +102,7 @@ module StripeMock
102
102
  customer[:default_source] = new_card[:id]
103
103
  end
104
104
 
105
- allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days current_period_start created prorate billing_cycle_anchor billing days_until_due idempotency_key enable_incomplete_payments cancel_at_period_end default_tax_rates)
105
+ allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days current_period_start created prorate billing_cycle_anchor billing days_until_due idempotency_key enable_incomplete_payments cancel_at_period_end default_tax_rates payment_behavior pending_invoice_item_interval)
106
106
  unknown_params = params.keys - allowed_params.map(&:to_sym)
107
107
  if unknown_params.length > 0
108
108
  raise Stripe::InvalidRequestError.new("Received unknown parameter: #{unknown_params.join}", unknown_params.first.to_s, http_status: 400)
@@ -1,4 +1,4 @@
1
1
  module StripeMock
2
2
  # stripe-ruby-mock version
3
- VERSION = "3.0.0"
3
+ VERSION = "3.0.1"
4
4
  end
@@ -109,6 +109,21 @@ describe StripeMock::Data::List do
109
109
  end
110
110
  end
111
111
 
112
+ context "active filter" do
113
+ it "accepts an active param which filters out data accordingly" do
114
+ product = Stripe::Product.create(id: "prod_123", name: "My Beautiful Product", type: "service")
115
+
116
+ plan_attributes = { product: product.id, interval: "month", currency: "usd", amount: 500 }
117
+ plan_a = Stripe::Plan.create(plan_attributes)
118
+ plan_b = Stripe::Plan.create(**plan_attributes, active: false)
119
+
120
+ list = StripeMock::Data::List.new([plan_a, plan_b], active: true)
121
+
122
+ expect(list.active).to eq(true)
123
+ expect(list.to_h[:data].count).to eq(1)
124
+ end
125
+ end
126
+
112
127
  context "pagination" do
113
128
  it "has a has_more field when it has more" do
114
129
  list = StripeMock::Data::List.new(
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'Checkout API' do
4
+
5
+ it "creates a stripe checkout session" do
6
+ session = Stripe::Checkout::Session.create({
7
+ payment_method_types: ['card'],
8
+ line_items: [{
9
+ name: 'T-shirt',
10
+ quantity: 1,
11
+ amount: 500,
12
+ currency: 'usd',
13
+ }],
14
+ })
15
+ expect(session.id).to match(/^test_cs/)
16
+ expect(session.line_items.count).to eq(1)
17
+ end
18
+
19
+ end
@@ -114,7 +114,7 @@ shared_examples 'Customer API' do
114
114
  expect(customer.subscriptions.first.customer).to eq(customer.id)
115
115
  end
116
116
 
117
- it "creates a customer with a plan (string/symbol agnostic)" do
117
+ it 'creates a customer with a plan (string/symbol agnostic)' do
118
118
  stripe_helper.create_plan(id: 'silver', product: product.id)
119
119
 
120
120
  Stripe::Customer.create(id: 'cust_SLV1', source: gen_card_tk, :plan => 'silver')
@@ -135,7 +135,6 @@ shared_examples 'Customer API' do
135
135
  end
136
136
 
137
137
  context "create customer" do
138
-
139
138
  it "with a trial when trial_end is set" do
140
139
  plan = stripe_helper.create_plan(id: 'no_trial', product: product.id, amount: 999)
141
140
  trial_end = Time.now.utc.to_i + 3600
@@ -195,7 +194,7 @@ shared_examples 'Customer API' do
195
194
  expect(customer.subscriptions.first.trial_end).to be_nil
196
195
  end
197
196
 
198
- it "returns an error if trial_end is set to a past time" do
197
+ it 'returns an error if trial_end is set to a past time' do
199
198
  plan = stripe_helper.create_plan(id: 'silver', product: product.id, amount: 999)
200
199
  expect {
201
200
  Stripe::Customer.create(id: 'test_cus_trial_end', source: gen_card_tk, plan: 'silver', trial_end: Time.now.utc.to_i - 3600)
@@ -205,7 +204,7 @@ shared_examples 'Customer API' do
205
204
  }
206
205
  end
207
206
 
208
- it "returns an error if trial_end is set without a plan" do
207
+ it 'returns an error if trial_end is set without a plan' do
209
208
  expect {
210
209
  Stripe::Customer.create(id: 'test_cus_trial_end', source: gen_card_tk, trial_end: "now")
211
210
  }.to raise_error {|e|
@@ -218,7 +217,7 @@ shared_examples 'Customer API' do
218
217
 
219
218
  it 'cannot create a customer with a plan that does not exist' do
220
219
  expect {
221
- customer = Stripe::Customer.create(id: 'test_cus_no_plan', source: gen_card_tk, :plan => 'non-existant')
220
+ Stripe::Customer.create(id: 'test_cus_no_plan', source: gen_card_tk, :plan => 'non-existant')
222
221
  }.to raise_error {|e|
223
222
  expect(e).to be_a(Stripe::InvalidRequestError)
224
223
  expect(e.message).to eq('No such plan: non-existant')
@@ -228,7 +227,7 @@ shared_examples 'Customer API' do
228
227
  it 'cannot create a customer with an existing plan, but no card token' do
229
228
  plan = stripe_helper.create_plan(id: 'p', product: product.id)
230
229
  expect {
231
- customer = Stripe::Customer.create(id: 'test_cus_no_plan', :plan => 'p')
230
+ Stripe::Customer.create(id: 'test_cus_no_plan', :plan => 'p')
232
231
  }.to raise_error {|e|
233
232
  expect(e).to be_a(Stripe::InvalidRequestError)
234
233
  expect(e.message).to eq('You must supply a valid card')
@@ -236,10 +235,9 @@ shared_examples 'Customer API' do
236
235
  end
237
236
 
238
237
  it 'creates a customer with a coupon discount' do
239
- coupon = Stripe::Coupon.create(id: "10PERCENT", duration: 'once')
238
+ coupon = Stripe::Coupon.create(id: '10PERCENT', duration: 'once')
240
239
 
241
- customer =
242
- Stripe::Customer.create(id: 'test_cus_coupon', coupon: '10PERCENT')
240
+ Stripe::Customer.create(id: 'test_cus_coupon', coupon: '10PERCENT')
243
241
 
244
242
  customer = Stripe::Customer.retrieve('test_cus_coupon')
245
243
  expect(customer.discount).to_not be_nil
@@ -251,25 +249,46 @@ shared_examples 'Customer API' do
251
249
  describe 'repeating coupon with duration limit', live: true do
252
250
  let!(:coupon) { stripe_helper.create_coupon(id: '10OFF', amount_off: 1000, currency: 'usd', duration: 'repeating', duration_in_months: 12) }
253
251
  let!(:customer) { Stripe::Customer.create(coupon: coupon.id) }
252
+
254
253
  it 'creates the discount with the end date', live: true do
255
254
  discount = Stripe::Customer.retrieve(customer.id).discount
256
255
  expect(discount).to_not be_nil
257
256
  expect(discount.coupon).to_not be_nil
258
257
  expect(discount.end).to be_within(10).of (DateTime.now >> 12).to_time.to_i
259
258
  end
259
+
260
260
  after { Stripe::Coupon.retrieve(coupon.id).delete }
261
261
  after { Stripe::Customer.retrieve(customer.id).delete }
262
262
  end
263
263
 
264
264
  it 'cannot create a customer with a coupon that does not exist' do
265
265
  expect{
266
- customer = Stripe::Customer.create(id: 'test_cus_no_coupon', coupon: '5OFF')
266
+ Stripe::Customer.create(id: 'test_cus_no_coupon', coupon: '5OFF')
267
267
  }.to raise_error {|e|
268
268
  expect(e).to be_a(Stripe::InvalidRequestError)
269
269
  expect(e.message).to eq('No such coupon: 5OFF')
270
270
  }
271
271
  end
272
272
 
273
+ context 'with coupon on customer' do
274
+ before do
275
+ Stripe::Coupon.create(id: '10PERCENT', duration: 'once')
276
+ Stripe::Customer.create(id: 'test_cus_coupon', coupon: '10PERCENT')
277
+ end
278
+
279
+ it 'remove the coupon from customer' do
280
+ customer = Stripe::Customer.retrieve('test_cus_coupon')
281
+ expect(customer.discount).to_not be_nil
282
+ expect(customer.discount.coupon).to_not be_nil
283
+ expect(customer.discount.customer).to eq customer.id
284
+ expect(customer.discount.start).to be_within(1).of Time.now.to_i
285
+
286
+ Stripe::Customer.update('test_cus_coupon', coupon: '')
287
+ customer = Stripe::Customer.retrieve('test_cus_coupon')
288
+ expect(customer.discount).to be_nil
289
+ end
290
+ end
291
+
273
292
  it "stores a created stripe customer in memory" do
274
293
  customer = Stripe::Customer.create({
275
294
  email: 'johnny@appleseed.com',
@@ -353,6 +372,15 @@ shared_examples 'Customer API' do
353
372
  expect(customer.discount.coupon).to be_a Stripe::Coupon
354
373
  end
355
374
 
375
+ it "preserves stripe customer metadata" do
376
+ metadata = {user_id: "38"}
377
+ customer = Stripe::Customer.create(metadata: metadata)
378
+ expect(customer.metadata.to_h).to eq(metadata)
379
+
380
+ updated = Stripe::Customer.update(customer.id, metadata: {fruit: "apples"})
381
+ expect(updated.metadata.to_h).to eq(metadata.merge(fruit: "apples"))
382
+ end
383
+
356
384
  it "retrieves the customer's default source after it was updated" do
357
385
  customer = Stripe::Customer.create()
358
386
  customer.source = gen_card_tk
@@ -36,6 +36,16 @@ shared_examples 'PaymentIntent API' do
36
36
  expect(payment_intent.last_payment_error.message).to eq('Not enough funds.')
37
37
  end
38
38
 
39
+ it "creates a requires_payment_method stripe payment_intent when amount matches 3055" do
40
+ payment_intent = Stripe::PaymentIntent.create(amount: 3055, currency: "usd")
41
+
42
+ expect(payment_intent.id).to match(/^test_pi/)
43
+ expect(payment_intent.amount).to eq(3055)
44
+ expect(payment_intent.currency).to eq('usd')
45
+ expect(payment_intent.metadata.to_hash).to eq({})
46
+ expect(payment_intent.status).to eq('requires_capture')
47
+ end
48
+
39
49
  describe "listing payment_intent" do
40
50
  before do
41
51
  3.times do
@@ -183,6 +183,20 @@ shared_examples 'Customer Subscriptions' do
183
183
  expect(subscription.tax_percent).to eq(20)
184
184
  end
185
185
 
186
+ it "correctly sets pending invoice item interval" do
187
+ customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
188
+
189
+ subscription = Stripe::Subscription.create({
190
+ plan: plan.id,
191
+ customer: customer.id,
192
+ quantity: 2,
193
+ pending_invoice_item_interval: { interval: 'month', interval_count: 1 }
194
+ })
195
+
196
+ expect(subscription.pending_invoice_item_interval.interval).to eq 'month'
197
+ expect(subscription.pending_invoice_item_interval.interval_count).to eq 1
198
+ end
199
+
186
200
  it "correctly sets created when it's not provided as a parameter", live: true do
187
201
  customer = Stripe::Customer.create(source: gen_card_tk)
188
202
  subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
@@ -720,6 +734,26 @@ shared_examples 'Customer Subscriptions' do
720
734
  expect(sub.canceled_at).to be_falsey
721
735
  end
722
736
 
737
+ it "updates a subscription's pending invoice item interval" do
738
+ customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
739
+
740
+ subscription = Stripe::Subscription.create({
741
+ plan: plan.id,
742
+ customer: customer.id,
743
+ quantity: 2,
744
+ pending_invoice_item_interval: { interval: 'month', interval_count: 1 }
745
+ })
746
+
747
+ expect(subscription.pending_invoice_item_interval.interval).to eq 'month'
748
+ expect(subscription.pending_invoice_item_interval.interval_count).to eq 1
749
+
750
+ subscription.pending_invoice_item_interval = { interval: 'week', interval_count: 3 }
751
+ subscription.save
752
+
753
+ expect(subscription.pending_invoice_item_interval.interval).to eq 'week'
754
+ expect(subscription.pending_invoice_item_interval.interval_count).to eq 3
755
+ end
756
+
723
757
  it 'when adds coupon', live: true do
724
758
  coupon = stripe_helper.create_coupon
725
759
  customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
@@ -35,6 +35,7 @@ def it_behaves_like_stripe(&block)
35
35
  it_behaves_like 'Country Spec API', &block
36
36
  it_behaves_like 'EphemeralKey API', &block
37
37
  it_behaves_like 'TaxRate API', &block
38
+ it_behaves_like 'Checkout API', &block
38
39
 
39
40
  # Integration tests
40
41
  it_behaves_like 'Multiple Customer Cards'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe-ruby-mock
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gilbert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-17 00:00:00.000000000 Z
11
+ date: 2020-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stripe
@@ -111,6 +111,7 @@ files:
111
111
  - ".gitignore"
112
112
  - ".rspec"
113
113
  - ".travis.yml"
114
+ - CHANGELOG.md
114
115
  - Gemfile
115
116
  - LICENSE.txt
116
117
  - README.md
@@ -146,6 +147,7 @@ files:
146
147
  - lib/stripe_mock/request_handlers/balance_transactions.rb
147
148
  - lib/stripe_mock/request_handlers/cards.rb
148
149
  - lib/stripe_mock/request_handlers/charges.rb
150
+ - lib/stripe_mock/request_handlers/checkout.rb
149
151
  - lib/stripe_mock/request_handlers/country_spec.rb
150
152
  - lib/stripe_mock/request_handlers/coupons.rb
151
153
  - lib/stripe_mock/request_handlers/customers.rb
@@ -252,6 +254,7 @@ files:
252
254
  - spec/shared_stripe_examples/card_examples.rb
253
255
  - spec/shared_stripe_examples/card_token_examples.rb
254
256
  - spec/shared_stripe_examples/charge_examples.rb
257
+ - spec/shared_stripe_examples/checkout_examples.rb
255
258
  - spec/shared_stripe_examples/country_specs_examples.rb
256
259
  - spec/shared_stripe_examples/coupon_examples.rb
257
260
  - spec/shared_stripe_examples/customer_examples.rb
@@ -327,6 +330,7 @@ test_files:
327
330
  - spec/shared_stripe_examples/card_examples.rb
328
331
  - spec/shared_stripe_examples/card_token_examples.rb
329
332
  - spec/shared_stripe_examples/charge_examples.rb
333
+ - spec/shared_stripe_examples/checkout_examples.rb
330
334
  - spec/shared_stripe_examples/country_specs_examples.rb
331
335
  - spec/shared_stripe_examples/coupon_examples.rb
332
336
  - spec/shared_stripe_examples/customer_examples.rb