stripe-ruby-mock 2.5.8 → 3.1.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.travis.yml +6 -9
  4. data/CHANGELOG.md +41 -0
  5. data/Gemfile +1 -0
  6. data/README.md +17 -11
  7. data/lib/stripe_mock.rb +8 -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 +5 -0
  12. data/lib/stripe_mock/client.rb +2 -1
  13. data/lib/stripe_mock/data.rb +285 -16
  14. data/lib/stripe_mock/data/list.rb +42 -9
  15. data/lib/stripe_mock/instance.rb +18 -4
  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 +6 -4
  19. data/lib/stripe_mock/request_handlers/checkout.rb +15 -0
  20. data/lib/stripe_mock/request_handlers/checkout_session.rb +22 -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 +5 -0
  25. data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +12 -7
  26. data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +1 -1
  27. data/lib/stripe_mock/request_handlers/invoices.rb +10 -4
  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 +1 -0
  33. data/lib/stripe_mock/request_handlers/setup_intents.rb +93 -0
  34. data/lib/stripe_mock/request_handlers/sources.rb +12 -6
  35. data/lib/stripe_mock/request_handlers/subscriptions.rb +45 -22
  36. data/lib/stripe_mock/request_handlers/tokens.rb +6 -4
  37. data/lib/stripe_mock/request_handlers/validators/param_validators.rb +123 -9
  38. data/lib/stripe_mock/server.rb +2 -2
  39. data/lib/stripe_mock/test_strategies/base.rb +67 -8
  40. data/lib/stripe_mock/test_strategies/live.rb +23 -12
  41. data/lib/stripe_mock/test_strategies/mock.rb +6 -2
  42. data/lib/stripe_mock/version.rb +1 -1
  43. data/lib/stripe_mock/webhook_fixtures/balance.available.json +6 -0
  44. data/lib/stripe_mock/webhook_fixtures/charge.failed.json +166 -38
  45. data/lib/stripe_mock/webhook_fixtures/customer.created.json +1 -0
  46. data/lib/stripe_mock/webhook_fixtures/customer.updated.json +1 -0
  47. data/lib/stripe_mock/webhook_fixtures/payment_intent.payment_failed.json +186 -0
  48. data/lib/stripe_mock/webhook_fixtures/payment_intent.succeeded.json +164 -0
  49. data/lib/stripe_mock/webhook_fixtures/product.created.json +34 -0
  50. data/lib/stripe_mock/webhook_fixtures/product.deleted.json +34 -0
  51. data/lib/stripe_mock/webhook_fixtures/product.updated.json +38 -0
  52. data/spec/instance_spec.rb +10 -12
  53. data/spec/list_spec.rb +38 -0
  54. data/spec/server_spec.rb +6 -3
  55. data/spec/shared_stripe_examples/account_examples.rb +1 -1
  56. data/spec/shared_stripe_examples/account_link_examples.rb +16 -0
  57. data/spec/shared_stripe_examples/balance_examples.rb +6 -0
  58. data/spec/shared_stripe_examples/balance_transaction_examples.rb +3 -3
  59. data/spec/shared_stripe_examples/bank_examples.rb +3 -3
  60. data/spec/shared_stripe_examples/card_examples.rb +4 -4
  61. data/spec/shared_stripe_examples/card_token_examples.rb +17 -21
  62. data/spec/shared_stripe_examples/charge_examples.rb +9 -22
  63. data/spec/shared_stripe_examples/checkout_examples.rb +47 -0
  64. data/spec/shared_stripe_examples/coupon_examples.rb +1 -1
  65. data/spec/shared_stripe_examples/customer_examples.rb +93 -53
  66. data/spec/shared_stripe_examples/dispute_examples.rb +2 -2
  67. data/spec/shared_stripe_examples/error_mock_examples.rb +8 -7
  68. data/spec/shared_stripe_examples/express_login_link_examples.rb +12 -0
  69. data/spec/shared_stripe_examples/external_account_examples.rb +3 -3
  70. data/spec/shared_stripe_examples/invoice_examples.rb +41 -39
  71. data/spec/shared_stripe_examples/invoice_item_examples.rb +1 -1
  72. data/spec/shared_stripe_examples/payment_intent_examples.rb +147 -0
  73. data/spec/shared_stripe_examples/payment_method_examples.rb +449 -0
  74. data/spec/shared_stripe_examples/payout_examples.rb +2 -2
  75. data/spec/shared_stripe_examples/plan_examples.rb +135 -92
  76. data/spec/shared_stripe_examples/price_examples.rb +183 -0
  77. data/spec/shared_stripe_examples/product_examples.rb +147 -0
  78. data/spec/shared_stripe_examples/refund_examples.rb +25 -21
  79. data/spec/shared_stripe_examples/setup_intent_examples.rb +68 -0
  80. data/spec/shared_stripe_examples/subscription_examples.rb +430 -318
  81. data/spec/shared_stripe_examples/subscription_items_examples.rb +3 -2
  82. data/spec/shared_stripe_examples/transfer_examples.rb +6 -6
  83. data/spec/shared_stripe_examples/webhook_event_examples.rb +11 -11
  84. data/spec/spec_helper.rb +7 -4
  85. data/spec/stripe_mock_spec.rb +4 -4
  86. data/spec/support/shared_contexts/stripe_validator_spec.rb +8 -0
  87. data/spec/support/stripe_examples.rb +9 -1
  88. data/stripe-ruby-mock.gemspec +8 -3
  89. metadata +72 -34
  90. data/spec/shared_stripe_examples/product_example.rb +0 -65
@@ -12,30 +12,35 @@ module StripeMock
12
12
  end
13
13
 
14
14
  def create_source(route, method_url, params, headers)
15
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
15
16
  route =~ method_url
16
- add_source_to(:customer, $1, params, customers)
17
+ add_source_to(:customer, $1, params, customers[stripe_account])
17
18
  end
18
19
 
19
20
  def retrieve_sources(route, method_url, params, headers)
21
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
20
22
  route =~ method_url
21
- retrieve_object_cards(:customer, $1, customers)
23
+ retrieve_object_cards(:customer, $1, customers[stripe_account])
22
24
  end
23
25
 
24
26
  def retrieve_source(route, method_url, params, headers)
27
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
25
28
  route =~ method_url
26
- customer = assert_existence :customer, $1, customers[$1]
29
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
27
30
 
28
31
  assert_existence :card, $2, get_card(customer, $2)
29
32
  end
30
33
 
31
34
  def delete_source(route, method_url, params, headers)
35
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
32
36
  route =~ method_url
33
- delete_card_from(:customer, $1, $2, customers)
37
+ delete_card_from(:customer, $1, $2, customers[stripe_account])
34
38
  end
35
39
 
36
40
  def update_source(route, method_url, params, headers)
41
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
37
42
  route =~ method_url
38
- customer = assert_existence :customer, $1, customers[$1]
43
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
39
44
 
40
45
  card = assert_existence :card, $2, get_card(customer, $2)
41
46
  card.merge!(params)
@@ -43,8 +48,9 @@ module StripeMock
43
48
  end
44
49
 
45
50
  def verify_source(route, method_url, params, headers)
51
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
46
52
  route =~ method_url
47
- customer = assert_existence :customer, $1, customers[$1]
53
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
48
54
 
49
55
  bank_account = assert_existence :bank_account, $2, verify_bank_account(customer, $2)
50
56
  bank_account
@@ -17,26 +17,29 @@ module StripeMock
17
17
  end
18
18
 
19
19
  def retrieve_customer_subscription(route, method_url, params, headers)
20
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
20
21
  route =~ method_url
21
22
 
22
- customer = assert_existence :customer, $1, customers[$1]
23
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
23
24
  subscription = get_customer_subscription(customer, $2)
24
25
 
25
26
  assert_existence :subscription, $2, subscription
26
27
  end
27
28
 
28
29
  def retrieve_customer_subscriptions(route, method_url, params, headers)
30
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
29
31
  route =~ method_url
30
32
 
31
- customer = assert_existence :customer, $1, customers[$1]
33
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
32
34
  customer[:subscriptions]
33
35
  end
34
36
 
35
37
  def create_customer_subscription(route, method_url, params, headers)
38
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
36
39
  route =~ method_url
37
40
 
38
41
  subscription_plans = get_subscription_plans_from_params(params)
39
- customer = assert_existence :customer, $1, customers[$1]
42
+ customer = assert_existence :customer, $1, customers[stripe_account][$1]
40
43
 
41
44
  if params[:source]
42
45
  new_card = get_card_by_token(params.delete(:source))
@@ -73,10 +76,10 @@ module StripeMock
73
76
  end
74
77
 
75
78
  def create_subscription(route, method_url, params, headers)
79
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
76
80
  if headers && headers[:idempotency_key]
77
81
  if subscriptions.any?
78
82
  original_subscription = subscriptions.values.find { |c| c[:idempotency_key] == headers[:idempotency_key]}
79
- puts original_subscription
80
83
  return subscriptions[original_subscription[:id]] if original_subscription
81
84
  end
82
85
  end
@@ -86,15 +89,7 @@ module StripeMock
86
89
 
87
90
  customer = params[:customer]
88
91
  customer_id = customer.is_a?(Stripe::Customer) ? customer[:id] : customer.to_s
89
- customer = assert_existence :customer, customer_id, customers[customer_id]
90
-
91
- if subscription_plans && customer
92
- subscription_plans.each do |plan|
93
- unless customer[:currency].to_s == plan[:currency].to_s
94
- raise Stripe::InvalidRequestError.new("Customer's currency of #{customer[:currency]} does not match plan's currency of #{plan[:currency]}", 'currency', http_status: 400)
95
- end
96
- end
97
- end
92
+ customer = assert_existence :customer, customer_id, customers[stripe_account][customer_id]
98
93
 
99
94
  if params[:source]
100
95
  new_card = get_card_by_token(params.delete(:source))
@@ -102,7 +97,7 @@ module StripeMock
102
97
  customer[:default_source] = new_card[:id]
103
98
  end
104
99
 
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)
100
+ 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 default_payment_method collection_method off_session trial_from_plan expand)
106
101
  unknown_params = params.keys - allowed_params.map(&:to_sym)
107
102
  if unknown_params.length > 0
108
103
  raise Stripe::InvalidRequestError.new("Received unknown parameter: #{unknown_params.join}", unknown_params.first.to_s, http_status: 400)
@@ -133,6 +128,15 @@ module StripeMock
133
128
  end
134
129
  end
135
130
 
131
+ if params[:trial_period_days]
132
+ subscription[:status] = 'trialing'
133
+ end
134
+
135
+ if params[:cancel_at_period_end]
136
+ subscription[:cancel_at_period_end] = true
137
+ subscription[:canceled_at] = Time.now.utc.to_i
138
+ end
139
+
136
140
  subscriptions[subscription[:id]] = subscription
137
141
  add_subscription_to_customer(customer, subscription)
138
142
 
@@ -146,14 +150,16 @@ module StripeMock
146
150
  end
147
151
 
148
152
  def retrieve_subscriptions(route, method_url, params, headers)
153
+ # stripe_account = headers && headers[:stripe_account] || Stripe.api_key
149
154
  route =~ method_url
150
155
 
151
156
  Data.mock_list_object(subscriptions.values, params)
152
- #customer = assert_existence :customer, $1, customers[$1]
157
+ #customer = assert_existence :customer, $1, customers[stripe_account][$1]
153
158
  #customer[:subscriptions]
154
159
  end
155
160
 
156
161
  def update_subscription(route, method_url, params, headers)
162
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
157
163
  route =~ method_url
158
164
 
159
165
  subscription_id = $2 ? $2 : $1
@@ -161,7 +167,7 @@ module StripeMock
161
167
  verify_active_status(subscription)
162
168
 
163
169
  customer_id = subscription[:customer]
164
- customer = assert_existence :customer, customer_id, customers[customer_id]
170
+ customer = assert_existence :customer, customer_id, customers[stripe_account][customer_id]
165
171
 
166
172
  if params[:source]
167
173
  new_card = get_card_by_token(params.delete(:source))
@@ -191,17 +197,28 @@ module StripeMock
191
197
  raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
192
198
  end
193
199
  end
194
- verify_card_present(customer, subscription_plans.first, subscription)
195
200
 
196
- if subscription[:cancel_at_period_end]
201
+ if params[:trial_period_days]
202
+ subscription[:status] = 'trialing'
203
+ end
204
+
205
+ if params[:cancel_at_period_end]
206
+ subscription[:cancel_at_period_end] = true
207
+ subscription[:canceled_at] = Time.now.utc.to_i
208
+ elsif params.has_key?(:cancel_at_period_end)
197
209
  subscription[:cancel_at_period_end] = false
198
210
  subscription[:canceled_at] = nil
199
211
  end
200
212
 
201
213
  params[:current_period_start] = subscription[:current_period_start]
202
214
  params[:trial_end] = params[:trial_end] || subscription[:trial_end]
215
+
216
+ plan_amount_was = subscription.dig(:plan, :amount)
217
+
203
218
  subscription = resolve_subscription_changes(subscription, subscription_plans, customer, params)
204
219
 
220
+ verify_card_present(customer, subscription_plans.first, subscription, params) if plan_amount_was == 0 && subscription.dig(:plan, :amount) && subscription.dig(:plan, :amount) > 0
221
+
205
222
  # delete the old subscription, replace with the new subscription
206
223
  customer[:subscriptions][:data].reject! { |sub| sub[:id] == subscription[:id] }
207
224
  customer[:subscriptions][:data] << subscription
@@ -210,13 +227,14 @@ module StripeMock
210
227
  end
211
228
 
212
229
  def cancel_subscription(route, method_url, params, headers)
230
+ stripe_account = headers && headers[:stripe_account] || Stripe.api_key
213
231
  route =~ method_url
214
232
 
215
233
  subscription_id = $2 ? $2 : $1
216
234
  subscription = assert_existence :subscription, subscription_id, subscriptions[subscription_id]
217
235
 
218
236
  customer_id = subscription[:customer]
219
- customer = assert_existence :customer, customer_id, customers[customer_id]
237
+ customer = assert_existence :customer, customer_id, customers[stripe_account][customer_id]
220
238
 
221
239
  cancel_params = { canceled_at: Time.now.utc.to_i }
222
240
  cancelled_at_period_end = (params[:at_period_end] == true)
@@ -245,14 +263,17 @@ module StripeMock
245
263
  elsif params[:items]
246
264
  items = params[:items]
247
265
  items = items.values if items.respond_to?(:values)
248
- items.map { |item| item[:plan].to_s if item[:plan] }
266
+ items.map { |item| item[:plan] ? item[:plan] : item[:price] }
249
267
  else
250
268
  []
251
269
  end
270
+ plan_ids.compact!
252
271
  plan_ids.each do |plan_id|
253
272
  assert_existence :plan, plan_id, plans[plan_id]
273
+ rescue Stripe::InvalidRequestError
274
+ assert_existence :price, plan_id, prices[plan_id]
254
275
  end
255
- plan_ids.map { |plan_id| plans[plan_id] }
276
+ plan_ids.map { |plan_id| plans[plan_id] || prices[plan_id]}
256
277
  end
257
278
 
258
279
  # Ensure customer has card to charge unless one of the following criterias is met:
@@ -261,8 +282,10 @@ module StripeMock
261
282
  # 3) has billing set to send invoice
262
283
  def verify_card_present(customer, plan, subscription, params={})
263
284
  return if customer[:default_source]
285
+ return if customer[:invoice_settings][:default_payment_method]
264
286
  return if customer[:trial_end]
265
287
  return if params[:trial_end]
288
+ return if subscription[:default_payment_method]
266
289
 
267
290
  plan_trial_period_days = plan[:trial_period_days] || 0
268
291
  plan_has_trial = plan_trial_period_days != 0 || plan[:amount] == 0 || plan[:trial_end]
@@ -281,7 +304,7 @@ module StripeMock
281
304
 
282
305
  return if params[:billing] == 'send_invoice'
283
306
 
284
- raise Stripe::InvalidRequestError.new('You must supply a valid card xoxo', nil, http_status: 400)
307
+ raise Stripe::InvalidRequestError.new('This customer has no attached payment source', nil, http_status: 400)
285
308
  end
286
309
 
287
310
  def verify_active_status(subscription)
@@ -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,7 +43,7 @@ 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
 
@@ -2,31 +2,145 @@ 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 products[ params[:id] ]
33
+ raise Stripe::InvalidRequestError.new(already_exists_message(Stripe::Product), :id)
34
+ end
35
+ end
36
+
37
+ #
38
+ # PlanValidator
39
+ #
40
+
41
+ def missing_plan_amount_message
42
+ "Plans require an `amount` parameter to be set."
43
+ end
44
+
45
+ SUPPORTED_PLAN_INTERVALS = ["month", "year", "week", "day"]
46
+
47
+ def invalid_plan_interval_message
48
+ "Invalid interval: must be one of day, month, week, or year"
49
+ end
50
+
51
+ SUPPORTED_CURRENCIES = [
52
+ "usd", "aed", "afn", "all", "amd", "ang", "aoa", "ars", "aud", "awg", "azn", "bam", "bbd", "bdt", "bgn",
53
+ "bif", "bmd", "bnd", "bob", "brl", "bsd", "bwp", "bzd", "cad", "cdf", "chf", "clp", "cny", "cop", "crc",
54
+ "cve", "czk", "djf", "dkk", "dop", "dzd", "egp", "etb", "eur", "fjd", "fkp", "gbp", "gel", "gip", "gmd",
55
+ "gnf", "gtq", "gyd", "hkd", "hnl", "hrk", "htg", "huf", "idr", "ils", "inr", "isk", "jmd", "jpy", "kes",
56
+ "kgs", "khr", "kmf", "krw", "kyd", "kzt", "lak", "lbp", "lkr", "lrd", "lsl", "mad", "mdl", "mga", "mkd",
57
+ "mmk", "mnt", "mop", "mro", "mur", "mvr", "mwk", "mxn", "myr", "mzn", "nad", "ngn", "nio", "nok", "npr",
58
+ "nzd", "pab", "pen", "pgk", "php", "pkr", "pln", "pyg", "qar", "ron", "rsd", "rub", "rwf", "sar", "sbd",
59
+ "scr", "sek", "sgd", "shp", "sll", "sos", "srd", "std", "szl", "thb", "tjs", "top", "try", "ttd", "twd",
60
+ "tzs", "uah", "ugx", "uyu", "uzs", "vnd", "vuv", "wst", "xaf", "xcd", "xof", "xpf", "yer", "zar", "zmw",
61
+ "eek", "lvl", "svc", "vef", "ltl"
62
+ ]
63
+
64
+ def invalid_currency_message(my_val)
65
+ "Invalid currency: #{my_val.downcase}. Stripe currently supports these currencies: #{SUPPORTED_CURRENCIES.join(", ")}"
66
+ end
7
67
 
8
- @base_strategy.create_plan_params.keys.each do |name|
68
+ def validate_create_plan_params(params)
69
+ plan_id = params[:id].to_s
70
+ product_id = params[:product]
71
+
72
+ @base_strategy.create_plan_params.keys.each do |attr_name|
9
73
  message =
10
- if name == :amount
11
- "Plans require an `#{name}` parameter to be set."
74
+ if attr_name == :amount
75
+ "Plans require an `#{attr_name}` parameter to be set."
12
76
  else
13
- "Missing required param: #{name}."
77
+ "Missing required param: #{attr_name}."
14
78
  end
15
- raise Stripe::InvalidRequestError.new(message, name) if params[name].nil?
79
+ raise Stripe::InvalidRequestError.new(message, attr_name) if params[attr_name].nil?
80
+ end
81
+
82
+ if plans[plan_id]
83
+ message = already_exists_message(Stripe::Plan)
84
+ raise Stripe::InvalidRequestError.new(message, :id)
85
+ end
86
+
87
+ unless products[product_id]
88
+ message = not_found_message(Stripe::Product, product_id)
89
+ raise Stripe::InvalidRequestError.new(message, :product)
16
90
  end
17
91
 
18
- if plans[ params[:id] ]
19
- raise Stripe::InvalidRequestError.new("Plan already exists.", :id)
92
+ unless SUPPORTED_PLAN_INTERVALS.include?(params[:interval])
93
+ message = invalid_plan_interval_message
94
+ raise Stripe::InvalidRequestError.new(message, :interval)
95
+ end
96
+
97
+ unless SUPPORTED_CURRENCIES.include?(params[:currency])
98
+ message = invalid_currency_message(params[:currency])
99
+ raise Stripe::InvalidRequestError.new(message, :currency)
20
100
  end
21
101
 
22
102
  unless params[:amount].integer?
23
- raise Stripe::InvalidRequestError.new("Invalid integer: #{params[:amount]}", :amount)
103
+ message = invalid_integer_message(params[:amount])
104
+ raise Stripe::InvalidRequestError.new(message, :amount)
105
+ end
106
+
107
+ end
108
+
109
+ def validate_create_price_params(params)
110
+ price_id = params[:id].to_s
111
+ product_id = params[:product]
112
+
113
+ @base_strategy.create_price_params.keys.each do |attr_name|
114
+ message = "Missing required param: #{attr_name}."
115
+ raise Stripe::InvalidRequestError.new(message, attr_name) if params[attr_name].nil?
116
+ end
117
+
118
+ if prices[price_id]
119
+ message = already_exists_message(Stripe::Price)
120
+ raise Stripe::InvalidRequestError.new(message, :id)
121
+ end
122
+
123
+ unless products[product_id]
124
+ message = not_found_message(Stripe::Product, product_id)
125
+ raise Stripe::InvalidRequestError.new(message, :product)
126
+ end
127
+
128
+ unless SUPPORTED_CURRENCIES.include?(params[:currency])
129
+ message = invalid_currency_message(params[:currency])
130
+ raise Stripe::InvalidRequestError.new(message, :currency)
131
+ end
132
+ end
133
+
134
+ def validate_list_prices_params(params)
135
+ if params[:lookup_keys] && !params[:lookup_keys].is_a?(Array)
136
+ raise Stripe::InvalidRequestError.new('Invalid array', :lookup_keys)
24
137
  end
25
138
  end
26
139
 
27
140
  def require_param(param_name)
28
141
  raise Stripe::InvalidRequestError.new("Missing required param: #{param_name}.", param_name.to_s, http_status: 400)
29
142
  end
143
+
30
144
  end
31
145
  end
32
146
  end
@@ -16,9 +16,9 @@ module StripeMock
16
16
  self.clear_data
17
17
  end
18
18
 
19
- def mock_request(*args)
19
+ def mock_request(*args, **kwargs)
20
20
  begin
21
- @instance.mock_request(*args)
21
+ @instance.mock_request(*args, **kwargs)
22
22
  rescue Stripe::InvalidRequestError => e
23
23
  {
24
24
  :error_raised => 'invalid_request',