stripe-ruby-mock 2.5.6 → 3.1.0.rc2

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 (97) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.travis.yml +6 -9
  4. data/CHANGELOG.md +35 -0
  5. data/Gemfile +1 -0
  6. data/README.md +17 -11
  7. data/lib/stripe_mock.rb +11 -0
  8. data/lib/stripe_mock/api/client.rb +1 -1
  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 +7 -0
  12. data/lib/stripe_mock/client.rb +2 -1
  13. data/lib/stripe_mock/data.rb +323 -13
  14. data/lib/stripe_mock/data/list.rb +42 -9
  15. data/lib/stripe_mock/instance.rb +52 -5
  16. data/lib/stripe_mock/request_handlers/account_links.rb +15 -0
  17. data/lib/stripe_mock/request_handlers/balance_transactions.rb +2 -2
  18. data/lib/stripe_mock/request_handlers/charges.rb +13 -12
  19. data/lib/stripe_mock/request_handlers/checkout.rb +15 -0
  20. data/lib/stripe_mock/request_handlers/checkout_session.rb +16 -0
  21. data/lib/stripe_mock/request_handlers/customers.rb +35 -18
  22. data/lib/stripe_mock/request_handlers/ephemeral_key.rb +1 -1
  23. data/lib/stripe_mock/request_handlers/express_login_links.rb +15 -0
  24. data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +14 -10
  25. data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +22 -7
  26. data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +1 -1
  27. data/lib/stripe_mock/request_handlers/invoices.rb +11 -5
  28. data/lib/stripe_mock/request_handlers/payment_intents.rb +182 -0
  29. data/lib/stripe_mock/request_handlers/payment_methods.rb +120 -0
  30. data/lib/stripe_mock/request_handlers/plans.rb +1 -1
  31. data/lib/stripe_mock/request_handlers/prices.rb +44 -0
  32. data/lib/stripe_mock/request_handlers/products.rb +44 -0
  33. data/lib/stripe_mock/request_handlers/refunds.rb +6 -3
  34. data/lib/stripe_mock/request_handlers/setup_intents.rb +93 -0
  35. data/lib/stripe_mock/request_handlers/sources.rb +12 -6
  36. data/lib/stripe_mock/request_handlers/subscription_items.rb +36 -0
  37. data/lib/stripe_mock/request_handlers/subscriptions.rb +82 -41
  38. data/lib/stripe_mock/request_handlers/tax_rates.rb +36 -0
  39. data/lib/stripe_mock/request_handlers/tokens.rb +8 -6
  40. data/lib/stripe_mock/request_handlers/validators/param_validators.rb +130 -9
  41. data/lib/stripe_mock/test_strategies/base.rb +68 -8
  42. data/lib/stripe_mock/test_strategies/live.rb +23 -12
  43. data/lib/stripe_mock/test_strategies/mock.rb +6 -2
  44. data/lib/stripe_mock/version.rb +1 -1
  45. data/lib/stripe_mock/webhook_fixtures/balance.available.json +6 -0
  46. data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_reinstated.json +88 -0
  47. data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_withdrawn.json +88 -0
  48. data/lib/stripe_mock/webhook_fixtures/charge.failed.json +166 -38
  49. data/lib/stripe_mock/webhook_fixtures/customer.created.json +1 -0
  50. data/lib/stripe_mock/webhook_fixtures/customer.updated.json +1 -0
  51. data/lib/stripe_mock/webhook_fixtures/invoice.created.json +2 -1
  52. data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +1 -1
  53. data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +2 -1
  54. data/lib/stripe_mock/webhook_fixtures/payment_intent.payment_failed.json +186 -0
  55. data/lib/stripe_mock/webhook_fixtures/payment_intent.succeeded.json +164 -0
  56. data/lib/stripe_mock/webhook_fixtures/product.created.json +34 -0
  57. data/lib/stripe_mock/webhook_fixtures/product.deleted.json +34 -0
  58. data/lib/stripe_mock/webhook_fixtures/product.updated.json +38 -0
  59. data/spec/instance_spec.rb +10 -12
  60. data/spec/list_spec.rb +38 -0
  61. data/spec/server_spec.rb +6 -3
  62. data/spec/shared_stripe_examples/account_examples.rb +1 -1
  63. data/spec/shared_stripe_examples/account_link_examples.rb +16 -0
  64. data/spec/shared_stripe_examples/balance_examples.rb +6 -0
  65. data/spec/shared_stripe_examples/balance_transaction_examples.rb +3 -3
  66. data/spec/shared_stripe_examples/bank_examples.rb +3 -3
  67. data/spec/shared_stripe_examples/card_examples.rb +4 -4
  68. data/spec/shared_stripe_examples/card_token_examples.rb +17 -21
  69. data/spec/shared_stripe_examples/charge_examples.rb +32 -36
  70. data/spec/shared_stripe_examples/checkout_examples.rb +38 -0
  71. data/spec/shared_stripe_examples/coupon_examples.rb +1 -1
  72. data/spec/shared_stripe_examples/customer_examples.rb +103 -53
  73. data/spec/shared_stripe_examples/dispute_examples.rb +2 -2
  74. data/spec/shared_stripe_examples/error_mock_examples.rb +8 -7
  75. data/spec/shared_stripe_examples/express_login_link_examples.rb +12 -0
  76. data/spec/shared_stripe_examples/external_account_examples.rb +3 -3
  77. data/spec/shared_stripe_examples/invoice_examples.rb +43 -41
  78. data/spec/shared_stripe_examples/invoice_item_examples.rb +1 -1
  79. data/spec/shared_stripe_examples/payment_intent_examples.rb +147 -0
  80. data/spec/shared_stripe_examples/payment_method_examples.rb +449 -0
  81. data/spec/shared_stripe_examples/payout_examples.rb +2 -2
  82. data/spec/shared_stripe_examples/plan_examples.rb +135 -77
  83. data/spec/shared_stripe_examples/price_examples.rb +183 -0
  84. data/spec/shared_stripe_examples/product_examples.rb +155 -0
  85. data/spec/shared_stripe_examples/refund_examples.rb +41 -31
  86. data/spec/shared_stripe_examples/setup_intent_examples.rb +68 -0
  87. data/spec/shared_stripe_examples/subscription_examples.rb +546 -295
  88. data/spec/shared_stripe_examples/subscription_items_examples.rb +76 -0
  89. data/spec/shared_stripe_examples/tax_rate_examples.rb +42 -0
  90. data/spec/shared_stripe_examples/transfer_examples.rb +9 -9
  91. data/spec/shared_stripe_examples/webhook_event_examples.rb +11 -11
  92. data/spec/spec_helper.rb +7 -4
  93. data/spec/stripe_mock_spec.rb +4 -4
  94. data/spec/support/shared_contexts/stripe_validator_spec.rb +8 -0
  95. data/spec/support/stripe_examples.rb +12 -2
  96. data/stripe-ruby-mock.gemspec +8 -3
  97. metadata +81 -32
@@ -0,0 +1,36 @@
1
+ module StripeMock
2
+ module RequestHandlers
3
+ module TaxRates
4
+ def TaxRates.included(klass)
5
+ klass.add_handler 'post /v1/tax_rates', :new_tax_rate
6
+ klass.add_handler 'post /v1/tax_rates/([^/]*)', :update_tax_rate
7
+ klass.add_handler 'get /v1/tax_rates/([^/]*)', :get_tax_rate
8
+ klass.add_handler 'get /v1/tax_rates', :list_tax_rates
9
+ end
10
+
11
+ def update_tax_rate(route, method_url, params, headers)
12
+ route =~ method_url
13
+ rate = assert_existence :tax_rate, $1, tax_rates[$1]
14
+ rate.merge!(params)
15
+ rate
16
+ end
17
+
18
+ def new_tax_rate(route, method_url, params, headers)
19
+ params[:id] ||= new_id('txr')
20
+ tax_rates[ params[:id] ] = Data.mock_tax_rate(params)
21
+ tax_rates[ params[:id] ]
22
+ end
23
+
24
+ def list_tax_rates(route, method_url, params, headers)
25
+ Data.mock_list_object(tax_rates.values, params)
26
+ end
27
+
28
+ def get_tax_rate(route, method_url, params, headers)
29
+ route =~ method_url
30
+ tax_rate = assert_existence :tax_rate, $1, tax_rates[$1]
31
+ tax_rate.clone
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -8,6 +8,8 @@ module StripeMock
8
8
  end
9
9
 
10
10
  def create_token(route, method_url, params, headers)
11
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
12
+
11
13
  if params[:customer].nil? && params[:card].nil? && params[:bank_account].nil?
12
14
  raise Stripe::InvalidRequestError.new('You must supply either a card, customer, or bank account to create a token.', nil, http_status: 400)
13
15
  end
@@ -15,13 +17,13 @@ module StripeMock
15
17
  cus_id = params[:customer]
16
18
 
17
19
  if cus_id && params[:source]
18
- customer = assert_existence :customer, cus_id, customers[cus_id]
20
+ customer = assert_existence :customer, cus_id, customers[stripe_account][cus_id]
19
21
 
20
22
  # params[:card] is an id; grab it from the db
21
23
  customer_card = get_card(customer, params[:source])
22
24
  assert_existence :card, params[:source], customer_card
23
25
  elsif params[:card].is_a?(String)
24
- customer = assert_existence :customer, cus_id, customers[cus_id]
26
+ customer = assert_existence :customer, cus_id, customers[stripe_account][cus_id]
25
27
 
26
28
  # params[:card] is an id; grab it from the db
27
29
  customer_card = get_card(customer, params[:card])
@@ -32,7 +34,7 @@ module StripeMock
32
34
  params[:card][:last4] = params[:card][:number][-4,4]
33
35
  customer_card = params[:card]
34
36
  elsif params[:bank_account].is_a?(String)
35
- customer = assert_existence :customer, cus_id, customers[cus_id]
37
+ customer = assert_existence :customer, cus_id, customers[stripe_account][cus_id]
36
38
 
37
39
  # params[:bank_account] is an id; grab it from the db
38
40
  bank_account = verify_bank_account(customer, params[:bank_account])
@@ -41,17 +43,17 @@ module StripeMock
41
43
  # params[:card] is a hash of cc info; "Sanitize" the card number
42
44
  bank_account = params[:bank_account]
43
45
  else
44
- customer = assert_existence :customer, cus_id, customers[cus_id]
46
+ customer = assert_existence :customer, cus_id, customers[stripe_account][cus_id] || customers[Stripe.api_key][cus_id]
45
47
  customer_card = get_card(customer, customer[:default_source])
46
48
  end
47
49
 
48
50
  if bank_account
49
- token_id = generate_bank_token(bank_account)
51
+ token_id = generate_bank_token(bank_account.dup)
50
52
  bank_account = @bank_tokens[token_id]
51
53
 
52
54
  Data.mock_bank_account_token(params.merge :id => token_id, :bank_account => bank_account)
53
55
  else
54
- token_id = generate_card_token(customer_card)
56
+ token_id = generate_card_token(customer_card.dup)
55
57
  card = @card_tokens[token_id]
56
58
 
57
59
  Data.mock_card_token(params.merge :id => token_id, :card => card)
@@ -2,26 +2,147 @@ module StripeMock
2
2
  module RequestHandlers
3
3
  module ParamValidators
4
4
 
5
- def validate_create_plan_params(params)
5
+ def already_exists_message(obj_class)
6
+ "#{obj_class.to_s.split("::").last} already exists."
7
+ end
8
+
9
+ def not_found_message(obj_class, obj_id)
10
+ "No such #{obj_class.to_s.split("::").last.downcase}: #{obj_id}"
11
+ end
12
+
13
+ def missing_param_message(attr_name)
14
+ "Missing required param: #{attr_name}."
15
+ end
16
+
17
+ def invalid_integer_message(my_val)
18
+ "Invalid integer: #{my_val}"
19
+ end
20
+
21
+ #
22
+ # ProductValidator
23
+ #
24
+
25
+
26
+ def validate_create_product_params(params)
6
27
  params[:id] = params[:id].to_s
28
+ @base_strategy.create_product_params.keys.reject{ |k,_| k == :id }.each do |k|
29
+ raise Stripe::InvalidRequestError.new(missing_param_message(k), k) if params[k].nil?
30
+ end
31
+
32
+ if !%w[good service].include?(params[:type])
33
+ raise Stripe::InvalidRequestError.new("Invalid type: must be one of good or service", :type)
34
+ end
35
+
36
+ if products[ params[:id] ]
37
+ raise Stripe::InvalidRequestError.new(already_exists_message(Stripe::Product), :id)
38
+ end
39
+ end
40
+
41
+ #
42
+ # PlanValidator
43
+ #
44
+
45
+ def missing_plan_amount_message
46
+ "Plans require an `amount` parameter to be set."
47
+ end
48
+
49
+ SUPPORTED_PLAN_INTERVALS = ["month", "year", "week", "day"]
50
+
51
+ def invalid_plan_interval_message
52
+ "Invalid interval: must be one of day, month, week, or year"
53
+ end
54
+
55
+ SUPPORTED_CURRENCIES = [
56
+ "usd", "aed", "afn", "all", "amd", "ang", "aoa", "ars", "aud", "awg", "azn", "bam", "bbd", "bdt", "bgn",
57
+ "bif", "bmd", "bnd", "bob", "brl", "bsd", "bwp", "bzd", "cad", "cdf", "chf", "clp", "cny", "cop", "crc",
58
+ "cve", "czk", "djf", "dkk", "dop", "dzd", "egp", "etb", "eur", "fjd", "fkp", "gbp", "gel", "gip", "gmd",
59
+ "gnf", "gtq", "gyd", "hkd", "hnl", "hrk", "htg", "huf", "idr", "ils", "inr", "isk", "jmd", "jpy", "kes",
60
+ "kgs", "khr", "kmf", "krw", "kyd", "kzt", "lak", "lbp", "lkr", "lrd", "lsl", "mad", "mdl", "mga", "mkd",
61
+ "mmk", "mnt", "mop", "mro", "mur", "mvr", "mwk", "mxn", "myr", "mzn", "nad", "ngn", "nio", "nok", "npr",
62
+ "nzd", "pab", "pen", "pgk", "php", "pkr", "pln", "pyg", "qar", "ron", "rsd", "rub", "rwf", "sar", "sbd",
63
+ "scr", "sek", "sgd", "shp", "sll", "sos", "srd", "std", "szl", "thb", "tjs", "top", "try", "ttd", "twd",
64
+ "tzs", "uah", "ugx", "uyu", "uzs", "vnd", "vuv", "wst", "xaf", "xcd", "xof", "xpf", "yer", "zar", "zmw",
65
+ "eek", "lvl", "svc", "vef", "ltl"
66
+ ]
67
+
68
+ def invalid_currency_message(my_val)
69
+ "Invalid currency: #{my_val.downcase}. Stripe currently supports these currencies: #{SUPPORTED_CURRENCIES.join(", ")}"
70
+ end
71
+
72
+ def validate_create_plan_params(params)
73
+ plan_id = params[:id].to_s
74
+ product_id = params[:product]
7
75
 
8
- @base_strategy.create_plan_params.keys.each do |name|
76
+ @base_strategy.create_plan_params.keys.each do |attr_name|
9
77
  message =
10
- if name == :amount
11
- "Plans require an `#{name}` parameter to be set."
78
+ if attr_name == :amount
79
+ "Plans require an `#{attr_name}` parameter to be set."
12
80
  else
13
- "Missing required param: #{name}."
81
+ "Missing required param: #{attr_name}."
14
82
  end
15
- raise Stripe::InvalidRequestError.new(message, name) if params[name].nil?
83
+ raise Stripe::InvalidRequestError.new(message, attr_name) if params[attr_name].nil?
84
+ end
85
+
86
+ if plans[plan_id]
87
+ message = already_exists_message(Stripe::Plan)
88
+ raise Stripe::InvalidRequestError.new(message, :id)
89
+ end
90
+
91
+ unless products[product_id]
92
+ message = not_found_message(Stripe::Product, product_id)
93
+ raise Stripe::InvalidRequestError.new(message, :product)
16
94
  end
17
95
 
18
- if plans[ params[:id] ]
19
- raise Stripe::InvalidRequestError.new("Plan already exists.", :id)
96
+ unless SUPPORTED_PLAN_INTERVALS.include?(params[:interval])
97
+ message = invalid_plan_interval_message
98
+ raise Stripe::InvalidRequestError.new(message, :interval)
99
+ end
100
+
101
+ unless SUPPORTED_CURRENCIES.include?(params[:currency])
102
+ message = invalid_currency_message(params[:currency])
103
+ raise Stripe::InvalidRequestError.new(message, :currency)
20
104
  end
21
105
 
22
106
  unless params[:amount].integer?
23
- raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", :amount)
107
+ message = invalid_integer_message(params[:amount])
108
+ raise Stripe::InvalidRequestError.new(message, :amount)
24
109
  end
110
+
111
+ end
112
+
113
+ def validate_create_price_params(params)
114
+ price_id = params[:id].to_s
115
+ product_id = params[:product]
116
+
117
+ @base_strategy.create_price_params.keys.each do |attr_name|
118
+ message = "Missing required param: #{attr_name}."
119
+ raise Stripe::InvalidRequestError.new(message, attr_name) if params[attr_name].nil?
120
+ end
121
+
122
+ if prices[price_id]
123
+ message = already_exists_message(Stripe::Price)
124
+ raise Stripe::InvalidRequestError.new(message, :id)
125
+ end
126
+
127
+ unless products[product_id]
128
+ message = not_found_message(Stripe::Product, product_id)
129
+ raise Stripe::InvalidRequestError.new(message, :product)
130
+ end
131
+
132
+ unless SUPPORTED_CURRENCIES.include?(params[:currency])
133
+ message = invalid_currency_message(params[:currency])
134
+ raise Stripe::InvalidRequestError.new(message, :currency)
135
+ end
136
+ end
137
+
138
+ def validate_list_prices_params(params)
139
+ if params[:lookup_keys] && !params[:lookup_keys].is_a?(Array)
140
+ raise Stripe::InvalidRequestError.new('Invalid array', :lookup_keys)
141
+ end
142
+ end
143
+
144
+ def require_param(param_name)
145
+ raise Stripe::InvalidRequestError.new("Missing required param: #{param_name}.", param_name.to_s, http_status: 400)
25
146
  end
26
147
 
27
148
  end
@@ -2,19 +2,60 @@ module StripeMock
2
2
  module TestStrategies
3
3
  class Base
4
4
 
5
+ def list_products(limit)
6
+ Stripe::Product.list(limit: limit)
7
+ end
8
+
9
+ def create_product(params = {})
10
+ Stripe::Product.create create_product_params(params)
11
+ end
12
+
13
+ def create_product_params(params={})
14
+ {
15
+ :id => 'stripe_mock_default_product_id',
16
+ :name => 'Default Product',
17
+ :type => 'service'
18
+ }.merge(params)
19
+ end
20
+
21
+ def retrieve_product(product_id)
22
+ Stripe::Product.retrieve(product_id)
23
+ end
24
+
25
+
26
+ def list_plans(limit)
27
+ Stripe::Plan.list(limit: limit)
28
+ end
29
+
30
+ def create_plan(params={})
31
+ Stripe::Plan.create create_plan_params(params)
32
+ end
33
+
5
34
  def create_plan_params(params={})
6
- currency = params[:currency] || StripeMock.default_currency
7
35
  {
8
36
  :id => 'stripe_mock_default_plan_id',
9
- :product => {
10
- :name => 'StripeMock Default Plan ID'
11
- },
12
- :amount => 1337,
13
- :currency => currency,
14
- :interval => 'month'
37
+ :interval => 'month',
38
+ :currency => StripeMock.default_currency,
39
+ :product => nil, # need to override yourself to pass validations
40
+ :amount => 1337
15
41
  }.merge(params)
16
42
  end
17
43
 
44
+ def create_price(params={})
45
+ Stripe::Price.create create_price_params(params)
46
+ end
47
+
48
+ def create_price_params(params={})
49
+ {
50
+ :currency => StripeMock.default_currency,
51
+ }.merge(params)
52
+ end
53
+
54
+ def list_subscriptions(limit)
55
+ Stripe::Subscription.list(limit: limit)
56
+ end
57
+
58
+
18
59
  def generate_card_token(card_params={})
19
60
  card_data = { :number => "4242424242424242", :exp_month => 9, :exp_year => (Time.now.year + 5), :cvc => "999", :tokenization_method => nil }
20
61
  card = StripeMock::Util.card_merge(card_data, card_params)
@@ -40,6 +81,7 @@ module StripeMock
40
81
  stripe_token.id
41
82
  end
42
83
 
84
+
43
85
  def create_coupon_params(params = {})
44
86
  currency = params[:currency] || StripeMock.default_currency
45
87
  {
@@ -64,18 +106,36 @@ module StripeMock
64
106
  }.merge(params)
65
107
  end
66
108
 
109
+ def create_checkout_session_params(params = {})
110
+ {
111
+ payment_method_types: ['card'],
112
+ line_items: [{
113
+ name: 'T-shirt',
114
+ quantity: 1,
115
+ amount: 500,
116
+ currency: 'usd',
117
+ }],
118
+ }.merge(params)
119
+ end
120
+
121
+
67
122
  def create_coupon(params = {})
68
123
  Stripe::Coupon.create create_coupon_params(params)
69
124
  end
70
125
 
126
+ def create_checkout_session(params = {})
127
+ Stripe::Checkout::Session.create create_checkout_session_params(params)
128
+ end
129
+
71
130
  def delete_all_coupons
72
- coupons = Stripe::Coupon.all
131
+ coupons = Stripe::Coupon.list
73
132
  coupons.data.map(&:delete) if coupons.data.count > 0
74
133
  end
75
134
 
76
135
  def prepare_card_error
77
136
  StripeMock.prepare_card_error(:card_error, :new_customer) if StripeMock.state == 'local'
78
137
  end
138
+
79
139
  end
80
140
  end
81
141
  end
@@ -2,6 +2,21 @@ module StripeMock
2
2
  module TestStrategies
3
3
  class Live < Base
4
4
 
5
+ def create_product(params={})
6
+ params = create_product_params(params)
7
+ raise "create_product requires an :id" if params[:id].nil?
8
+ delete_product(params[:id])
9
+ Stripe::Product.create params
10
+ end
11
+
12
+ def delete_product(product_id)
13
+ product = Stripe::Product.retrieve(product_id)
14
+ Stripe::Plan.list(product: product_id).each(&:delete) if product.type == 'service'
15
+ product.delete
16
+ rescue Stripe::StripeError => e
17
+ # do nothing
18
+ end
19
+
5
20
  def create_plan(params={})
6
21
  raise "create_plan requires an :id" if params[:id].nil?
7
22
  delete_plan(params[:id])
@@ -9,12 +24,10 @@ module StripeMock
9
24
  end
10
25
 
11
26
  def delete_plan(plan_id)
12
- begin
13
- plan = Stripe::Plan.retrieve(plan_id)
14
- plan.delete
15
- rescue Stripe::StripeError => e
16
- # Do nothing; we just want to make sure this plan ceases to exists
17
- end
27
+ plan = Stripe::Plan.retrieve(plan_id)
28
+ plan.delete
29
+ rescue Stripe::StripeError => e
30
+ # do nothing
18
31
  end
19
32
 
20
33
  def create_coupon(params={})
@@ -23,12 +36,10 @@ module StripeMock
23
36
  end
24
37
 
25
38
  def delete_coupon(id)
26
- begin
27
- coupon = Stripe::Coupon.retrieve(id)
28
- coupon.delete
29
- rescue Stripe::StripeError
30
- # do nothing
31
- end
39
+ coupon = Stripe::Coupon.retrieve(id)
40
+ coupon.delete
41
+ rescue Stripe::StripeError
42
+ # do nothing
32
43
  end
33
44
 
34
45
  def upsert_stripe_object(object, attributes)
@@ -2,8 +2,12 @@ module StripeMock
2
2
  module TestStrategies
3
3
  class Mock < Base
4
4
 
5
- def create_plan(params={})
6
- Stripe::Plan.create create_plan_params(params)
5
+ def delete_product(product_id)
6
+ if StripeMock.state == 'remote'
7
+ StripeMock.client.destroy_resource('products', product_id)
8
+ elsif StripeMock.state == 'local'
9
+ StripeMock.instance.products.delete(product_id)
10
+ end
7
11
  end
8
12
 
9
13
  def delete_plan(plan_id)
@@ -1,4 +1,4 @@
1
1
  module StripeMock
2
2
  # stripe-ruby-mock version
3
- VERSION = "2.5.6"
3
+ VERSION = "3.1.0.rc2"
4
4
  end
@@ -18,6 +18,12 @@
18
18
  "currency": "usd"
19
19
  }
20
20
  ],
21
+ "instant_available": [
22
+ {
23
+ "amount": 0,
24
+ "currency": "usd"
25
+ }
26
+ ],
21
27
  "livemode": false,
22
28
  "object": "balance"
23
29
  }