stripe-ruby-mock 2.5.6 → 3.1.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
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
  }