stripe-ruby-mock 2.5.8 → 3.1.0.rc3

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 (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',