stripe-ruby-mock 2.4.0 → 2.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.env +2 -0
- data/.travis.yml +8 -4
- data/README.md +12 -5
- data/lib/stripe_mock/api/account_balance.rb +14 -0
- data/lib/stripe_mock/api/client.rb +4 -4
- data/lib/stripe_mock/api/conversion_rate.rb +14 -0
- data/lib/stripe_mock/api/errors.rb +25 -14
- data/lib/stripe_mock/api/instance.rb +6 -6
- data/lib/stripe_mock/api/webhooks.rb +5 -1
- data/lib/stripe_mock/client.rb +18 -2
- data/lib/stripe_mock/data/list.rb +14 -2
- data/lib/stripe_mock/data.rb +217 -56
- data/lib/stripe_mock/instance.rb +93 -8
- data/lib/stripe_mock/request_handlers/accounts.rb +34 -2
- data/lib/stripe_mock/request_handlers/balance.rb +17 -0
- data/lib/stripe_mock/request_handlers/balance_transactions.rb +18 -2
- data/lib/stripe_mock/request_handlers/charges.rb +25 -17
- data/lib/stripe_mock/request_handlers/coupons.rb +5 -4
- data/lib/stripe_mock/request_handlers/customers.rb +26 -8
- data/lib/stripe_mock/request_handlers/ephemeral_key.rb +13 -0
- data/lib/stripe_mock/request_handlers/external_accounts.rb +55 -0
- data/lib/stripe_mock/request_handlers/helpers/bank_account_helpers.rb +1 -1
- data/lib/stripe_mock/request_handlers/helpers/card_helpers.rb +9 -7
- data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +10 -6
- data/lib/stripe_mock/request_handlers/helpers/external_account_helpers.rb +49 -0
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +55 -15
- data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +2 -2
- data/lib/stripe_mock/request_handlers/invoices.rb +93 -14
- data/lib/stripe_mock/request_handlers/orders.rb +5 -5
- data/lib/stripe_mock/request_handlers/payouts.rb +32 -0
- data/lib/stripe_mock/request_handlers/plans.rb +1 -0
- data/lib/stripe_mock/request_handlers/products.rb +43 -0
- data/lib/stripe_mock/request_handlers/refunds.rb +10 -7
- data/lib/stripe_mock/request_handlers/subscription_items.rb +36 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +95 -34
- data/lib/stripe_mock/request_handlers/tax_rates.rb +36 -0
- data/lib/stripe_mock/request_handlers/tokens.rb +9 -3
- data/lib/stripe_mock/request_handlers/transfers.rb +11 -5
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +10 -1
- data/lib/stripe_mock/server.rb +14 -1
- data/lib/stripe_mock/test_strategies/base.rb +7 -5
- data/lib/stripe_mock/test_strategies/live.rb +5 -0
- data/lib/stripe_mock/test_strategies/mock.rb +8 -0
- data/lib/stripe_mock/util.rb +8 -2
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock/webhook_fixtures/account.updated.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_reinstated.json +88 -0
- data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_withdrawn.json +88 -0
- data/lib/stripe_mock/webhook_fixtures/charge.updated.json +58 -0
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.created.json +40 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.deleted.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.trial_will_end.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.updated.json +40 -11
- data/lib/stripe_mock/webhook_fixtures/invoice.created.json +3 -2
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_failed.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +92 -85
- data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +3 -2
- data/lib/stripe_mock/webhook_fixtures/plan.created.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/plan.deleted.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/plan.updated.json +1 -1
- data/lib/stripe_mock.rb +13 -0
- data/spec/instance_spec.rb +54 -4
- data/spec/integration_examples/prepare_error_examples.rb +6 -6
- data/spec/list_spec.rb +16 -3
- data/spec/readme_spec.rb +2 -0
- data/spec/server_spec.rb +6 -2
- data/spec/shared_stripe_examples/account_examples.rb +35 -0
- data/spec/shared_stripe_examples/balance_examples.rb +11 -0
- data/spec/shared_stripe_examples/balance_transaction_examples.rb +28 -0
- data/spec/shared_stripe_examples/bank_examples.rb +28 -1
- data/spec/shared_stripe_examples/card_examples.rb +10 -3
- data/spec/shared_stripe_examples/charge_examples.rb +73 -17
- data/spec/shared_stripe_examples/coupon_examples.rb +8 -2
- data/spec/shared_stripe_examples/customer_examples.rb +54 -2
- data/spec/shared_stripe_examples/dispute_examples.rb +19 -8
- data/spec/shared_stripe_examples/ephemeral_key_examples.rb +17 -0
- data/spec/shared_stripe_examples/error_mock_examples.rb +3 -3
- data/spec/shared_stripe_examples/external_account_examples.rb +170 -0
- data/spec/shared_stripe_examples/extra_features_examples.rb +2 -0
- data/spec/shared_stripe_examples/invoice_examples.rb +314 -51
- data/spec/shared_stripe_examples/payout_examples.rb +68 -0
- data/spec/shared_stripe_examples/plan_examples.rb +37 -5
- data/spec/shared_stripe_examples/product_example.rb +65 -0
- data/spec/shared_stripe_examples/recipient_examples.rb +7 -7
- data/spec/shared_stripe_examples/refund_examples.rb +17 -11
- data/spec/shared_stripe_examples/subscription_examples.rb +463 -33
- data/spec/shared_stripe_examples/subscription_items_examples.rb +75 -0
- data/spec/shared_stripe_examples/tax_rate_examples.rb +42 -0
- data/spec/shared_stripe_examples/transfer_examples.rb +72 -23
- data/spec/shared_stripe_examples/webhook_event_examples.rb +74 -5
- data/spec/spec_helper.rb +7 -6
- data/spec/stripe_mock_spec.rb +16 -3
- data/spec/support/stripe_examples.rb +7 -1
- data/spec/util_spec.rb +35 -1
- data/stripe-ruby-mock.gemspec +1 -1
- metadata +34 -7
- data/ChangeLog.rdoc +0 -4
data/lib/stripe_mock/data.rb
CHANGED
@@ -3,7 +3,7 @@ module StripeMock
|
|
3
3
|
|
4
4
|
def self.mock_account(params = {})
|
5
5
|
id = params[:id] || 'acct_103ED82ePvKYlo2C'
|
6
|
-
currency = params[:currency] ||
|
6
|
+
currency = params[:currency] || StripeMock.default_currency
|
7
7
|
{
|
8
8
|
id: id,
|
9
9
|
email: "bob@example.com",
|
@@ -12,7 +12,7 @@ module StripeMock
|
|
12
12
|
timezone: "US/Pacific",
|
13
13
|
details_submitted: false,
|
14
14
|
charges_enabled: false,
|
15
|
-
|
15
|
+
payouts_enabled: false,
|
16
16
|
currencies_supported: [
|
17
17
|
"usd"
|
18
18
|
],
|
@@ -101,9 +101,25 @@ module StripeMock
|
|
101
101
|
}.merge(params)
|
102
102
|
end
|
103
103
|
|
104
|
+
def self.mock_tax_rate(params)
|
105
|
+
{
|
106
|
+
id: 'test_cus_default',
|
107
|
+
object: 'tax_rate',
|
108
|
+
active: true,
|
109
|
+
created: 1559079603,
|
110
|
+
description: nil,
|
111
|
+
display_name: 'VAT',
|
112
|
+
inclusive: false,
|
113
|
+
jurisdiction: 'EU',
|
114
|
+
livemode: false,
|
115
|
+
metadata: {},
|
116
|
+
percentage: 21.0
|
117
|
+
}.merge(params)
|
118
|
+
end
|
119
|
+
|
104
120
|
def self.mock_customer(sources, params)
|
105
121
|
cus_id = params[:id] || "test_cus_default"
|
106
|
-
currency = params[:currency] ||
|
122
|
+
currency = params[:currency] || StripeMock.default_currency
|
107
123
|
sources.each {|source| source[:customer] = cus_id}
|
108
124
|
{
|
109
125
|
email: 'stripe_mock@example.com',
|
@@ -111,6 +127,7 @@ module StripeMock
|
|
111
127
|
object: "customer",
|
112
128
|
created: 1372126710,
|
113
129
|
id: cus_id,
|
130
|
+
name: nil,
|
114
131
|
livemode: false,
|
115
132
|
delinquent: false,
|
116
133
|
discount: nil,
|
@@ -134,7 +151,7 @@ module StripeMock
|
|
134
151
|
|
135
152
|
def self.mock_charge(params={})
|
136
153
|
charge_id = params[:id] || "ch_1fD6uiR9FAA2zc"
|
137
|
-
currency = params[:currency] ||
|
154
|
+
currency = params[:currency] || StripeMock.default_currency
|
138
155
|
{
|
139
156
|
id: charge_id,
|
140
157
|
object: "charge",
|
@@ -196,7 +213,7 @@ module StripeMock
|
|
196
213
|
end
|
197
214
|
|
198
215
|
def self.mock_refund(params={})
|
199
|
-
currency = params[:currency] ||
|
216
|
+
currency = params[:currency] || StripeMock.default_currency
|
200
217
|
{
|
201
218
|
id: "re_4fWhgUh5si7InF",
|
202
219
|
amount: 1,
|
@@ -207,7 +224,8 @@ module StripeMock
|
|
207
224
|
metadata: {},
|
208
225
|
charge: "ch_4fWhYjzQ23UFWT",
|
209
226
|
receipt_number: nil,
|
210
|
-
status: "succeeded"
|
227
|
+
status: "succeeded",
|
228
|
+
reason: "requested_by_customer"
|
211
229
|
}.merge(params)
|
212
230
|
end
|
213
231
|
|
@@ -242,12 +260,13 @@ module StripeMock
|
|
242
260
|
cvc_check: nil,
|
243
261
|
address_line1_check: nil,
|
244
262
|
address_zip_check: nil,
|
245
|
-
tokenization_method: nil
|
263
|
+
tokenization_method: nil,
|
264
|
+
metadata: {}
|
246
265
|
}, params)
|
247
266
|
end
|
248
267
|
|
249
268
|
def self.mock_bank_account(params={})
|
250
|
-
currency = params[:currency] ||
|
269
|
+
currency = params[:currency] || StripeMock.default_currency
|
251
270
|
{
|
252
271
|
id: "test_ba_default",
|
253
272
|
object: "bank_account",
|
@@ -260,7 +279,8 @@ module StripeMock
|
|
260
279
|
status: 'new',
|
261
280
|
account_holder_name: 'John Doe',
|
262
281
|
account_holder_type: 'individual',
|
263
|
-
fingerprint: "aBcFinGerPrINt123"
|
282
|
+
fingerprint: "aBcFinGerPrINt123",
|
283
|
+
metadata: {}
|
264
284
|
}.merge(params)
|
265
285
|
end
|
266
286
|
|
@@ -283,39 +303,59 @@ module StripeMock
|
|
283
303
|
#FIXME nested overrides would be better than hardcoding plan_id
|
284
304
|
def self.mock_subscription(params={})
|
285
305
|
StripeMock::Util.rmerge({
|
286
|
-
:
|
287
|
-
:
|
288
|
-
:
|
289
|
-
:
|
290
|
-
:
|
291
|
-
|
292
|
-
|
293
|
-
:
|
294
|
-
:
|
295
|
-
:
|
306
|
+
created: 1478204116,
|
307
|
+
billing: 'charge_automatically',
|
308
|
+
current_period_start: 1308595038,
|
309
|
+
current_period_end: 1308681468,
|
310
|
+
status: 'trialing',
|
311
|
+
trial_from_plan: false,
|
312
|
+
plan: {
|
313
|
+
interval: 'month',
|
314
|
+
amount: 7500,
|
315
|
+
trial_period_days: 30,
|
316
|
+
object: 'plan',
|
317
|
+
id: '__test_plan_id__'
|
318
|
+
},
|
319
|
+
items: {
|
320
|
+
object: 'list',
|
321
|
+
data: [{
|
322
|
+
id: 'si_1AwFf62eZvKYlo2C9u6Dhf9',
|
323
|
+
created: 1504035973,
|
324
|
+
metadata: {},
|
325
|
+
object: 'subscription_item',
|
326
|
+
plan: {
|
327
|
+
amount: 999,
|
328
|
+
created: 1504035972,
|
329
|
+
currency: StripeMock.default_currency
|
330
|
+
},
|
331
|
+
quantity: 1
|
332
|
+
}]
|
296
333
|
},
|
297
|
-
:
|
298
|
-
:
|
299
|
-
:
|
300
|
-
:
|
301
|
-
:
|
302
|
-
:
|
303
|
-
:
|
304
|
-
:
|
305
|
-
:
|
306
|
-
:
|
307
|
-
:
|
308
|
-
:
|
334
|
+
cancel_at_period_end: false,
|
335
|
+
canceled_at: nil,
|
336
|
+
ended_at: nil,
|
337
|
+
start: 1308595038,
|
338
|
+
object: 'subscription',
|
339
|
+
trial_start: 1308595038,
|
340
|
+
trial_end: 1308681468,
|
341
|
+
customer: 'c_test_customer',
|
342
|
+
quantity: 1,
|
343
|
+
tax_percent: nil,
|
344
|
+
discount: nil,
|
345
|
+
metadata: {}
|
309
346
|
}, params)
|
310
347
|
end
|
311
348
|
|
312
349
|
def self.mock_invoice(lines, params={})
|
313
350
|
in_id = params[:id] || "test_in_default"
|
314
|
-
currency = params[:currency] ||
|
351
|
+
currency = params[:currency] || StripeMock.default_currency
|
315
352
|
lines << Data.mock_line_item() if lines.empty?
|
316
|
-
{
|
353
|
+
invoice = {
|
317
354
|
id: 'in_test_invoice',
|
318
|
-
|
355
|
+
status: 'open',
|
356
|
+
invoice_pdf: 'pdf_url',
|
357
|
+
hosted_invoice_url: 'hosted_invoice_url',
|
358
|
+
created: 1349738950,
|
319
359
|
period_end: 1349738950,
|
320
360
|
period_start: 1349738950,
|
321
361
|
lines: {
|
@@ -325,7 +365,6 @@ module StripeMock
|
|
325
365
|
data: lines
|
326
366
|
},
|
327
367
|
subtotal: lines.map {|line| line[:amount]}.reduce(0, :+),
|
328
|
-
total: lines.map {|line| line[:amount]}.reduce(0, :+),
|
329
368
|
customer: "test_customer",
|
330
369
|
object: 'invoice',
|
331
370
|
attempted: false,
|
@@ -337,12 +376,13 @@ module StripeMock
|
|
337
376
|
paid: false,
|
338
377
|
receipt_number: nil,
|
339
378
|
statement_descriptor: nil,
|
340
|
-
tax:
|
379
|
+
tax: 10,
|
341
380
|
tax_percent: nil,
|
342
381
|
webhooks_delivered_at: 1349825350,
|
343
382
|
livemode: false,
|
344
383
|
attempt_count: 0,
|
345
|
-
amount_due:
|
384
|
+
amount_due: 100,
|
385
|
+
amount_paid: 0,
|
346
386
|
currency: currency,
|
347
387
|
starting_balance: 0,
|
348
388
|
ending_balance: nil,
|
@@ -351,10 +391,19 @@ module StripeMock
|
|
351
391
|
discount: nil,
|
352
392
|
subscription: nil
|
353
393
|
}.merge(params)
|
394
|
+
if invoice[:discount]
|
395
|
+
invoice[:total] = [0, invoice[:subtotal] - invoice[:discount][:coupon][:amount_off]].max if invoice[:discount][:coupon][:amount_off]
|
396
|
+
invoice[:total] = invoice[:subtotal] * invoice[:discount][:coupon][:percent_off] / 100 if invoice[:discount][:coupon][:percent_off]
|
397
|
+
else
|
398
|
+
invoice[:total] = invoice[:subtotal]
|
399
|
+
end
|
400
|
+
due = invoice[:total] + invoice[:starting_balance]
|
401
|
+
invoice[:amount_due] = due < 0 ? 0 : due
|
402
|
+
invoice
|
354
403
|
end
|
355
404
|
|
356
405
|
def self.mock_line_item(params = {})
|
357
|
-
currency = params[:currency] ||
|
406
|
+
currency = params[:currency] || StripeMock.default_currency
|
358
407
|
{
|
359
408
|
id: "ii_test",
|
360
409
|
object: "line_item",
|
@@ -368,6 +417,11 @@ module StripeMock
|
|
368
417
|
start: 1349738920,
|
369
418
|
end: 1349738920
|
370
419
|
},
|
420
|
+
tax_amounts: [
|
421
|
+
{
|
422
|
+
amount: 10
|
423
|
+
}
|
424
|
+
],
|
371
425
|
quantity: nil,
|
372
426
|
subscription: nil,
|
373
427
|
plan: nil,
|
@@ -377,11 +431,11 @@ module StripeMock
|
|
377
431
|
end
|
378
432
|
|
379
433
|
def self.mock_invoice_item(params = {})
|
380
|
-
currency = params[:currency] ||
|
434
|
+
currency = params[:currency] || StripeMock.default_currency
|
381
435
|
{
|
382
436
|
id: "test_ii",
|
383
437
|
object: "invoiceitem",
|
384
|
-
|
438
|
+
created: 1349738920,
|
385
439
|
amount: 1099,
|
386
440
|
livemode: false,
|
387
441
|
proration: false,
|
@@ -465,7 +519,7 @@ module StripeMock
|
|
465
519
|
end
|
466
520
|
|
467
521
|
def self.mock_plan(params={})
|
468
|
-
currency = params[:currency] ||
|
522
|
+
currency = params[:currency] || StripeMock.default_currency
|
469
523
|
{
|
470
524
|
id: "2",
|
471
525
|
object: "plan",
|
@@ -482,6 +536,21 @@ module StripeMock
|
|
482
536
|
}.merge(params)
|
483
537
|
end
|
484
538
|
|
539
|
+
def self.mock_product(params = {})
|
540
|
+
{
|
541
|
+
id: "default_test_prod",
|
542
|
+
object: "product",
|
543
|
+
active: true,
|
544
|
+
created: 1556896214,
|
545
|
+
livemode: false,
|
546
|
+
metadata: {},
|
547
|
+
name: "Default Test Product",
|
548
|
+
statement_descriptor: "PRODUCT",
|
549
|
+
type: "service",
|
550
|
+
updated: 1556918200,
|
551
|
+
}.merge(params)
|
552
|
+
end
|
553
|
+
|
485
554
|
def self.mock_recipient(cards, params={})
|
486
555
|
rp_id = params[:id] || "test_rp_default"
|
487
556
|
cards.each {|card| card[:recipient] = rp_id}
|
@@ -566,33 +635,47 @@ module StripeMock
|
|
566
635
|
end
|
567
636
|
|
568
637
|
def self.mock_transfer(params={})
|
569
|
-
currency = params[:currency] ||
|
638
|
+
currency = params[:currency] || StripeMock.default_currency
|
570
639
|
id = params[:id] || 'tr_test_transfer'
|
571
640
|
{
|
572
|
-
:status => 'pending',
|
573
641
|
:amount => 100,
|
574
|
-
:
|
575
|
-
|
576
|
-
:country => 'US',
|
577
|
-
:bank_name => 'STRIPE TEST BANK',
|
578
|
-
:last4 => '6789'
|
579
|
-
},
|
580
|
-
:recipient => 'test_recipient',
|
581
|
-
:fee => 0,
|
582
|
-
:fee_details => [],
|
642
|
+
:amount_reversed => 0,
|
643
|
+
:balance_transaction => "txn_2dyYXXP90MN26R",
|
583
644
|
:id => id,
|
584
645
|
:livemode => false,
|
646
|
+
:metadata => {},
|
585
647
|
:currency => currency,
|
586
648
|
:object => "transfer",
|
587
|
-
:
|
649
|
+
:created => 1304114826,
|
588
650
|
:description => "Transfer description",
|
589
651
|
:reversed => false,
|
590
652
|
:reversals => {
|
591
653
|
:object => "list",
|
654
|
+
:data => [],
|
592
655
|
:total_count => 0,
|
593
656
|
:has_more => false,
|
594
657
|
:url => "/v1/transfers/#{id}/reversals"
|
595
658
|
},
|
659
|
+
:destination => "acct_164wxjKbnvuxQXGu",
|
660
|
+
:destination_payment => "py_164xRvKbnvuxQXGuVFV2pZo1",
|
661
|
+
:source_transaction => "ch_164xRv2eZvKYlo2Clu1sIJWB",
|
662
|
+
:source_type => "card",
|
663
|
+
:transfer_group => "group_ch_164xRv2eZvKYlo2Clu1sIJWB",
|
664
|
+
}.merge(params)
|
665
|
+
end
|
666
|
+
|
667
|
+
def self.mock_payout(params={})
|
668
|
+
currency = params[:currency] || StripeMock.default_currency
|
669
|
+
id = params[:id] || 'po_test_payout'
|
670
|
+
{
|
671
|
+
:amount => 100,
|
672
|
+
:id => id,
|
673
|
+
:livemode => false,
|
674
|
+
:metadata => {},
|
675
|
+
:currency => currency,
|
676
|
+
:object => "payout",
|
677
|
+
:date => 1304114826,
|
678
|
+
:description => "Payout description",
|
596
679
|
}.merge(params)
|
597
680
|
end
|
598
681
|
|
@@ -605,7 +688,8 @@ module StripeMock
|
|
605
688
|
end
|
606
689
|
|
607
690
|
def self.mock_dispute(params={})
|
608
|
-
|
691
|
+
@timestamp ||= Time.now.to_i
|
692
|
+
currency = params[:currency] || StripeMock.default_currency
|
609
693
|
id = params[:id] || "dp_test_dispute"
|
610
694
|
{
|
611
695
|
:id => id,
|
@@ -613,7 +697,7 @@ module StripeMock
|
|
613
697
|
:amount => 195,
|
614
698
|
:balance_transactions => [],
|
615
699
|
:charge => "ch_15RsQR2eZvKYlo2CA8IfzCX0",
|
616
|
-
:created =>
|
700
|
+
:created => @timestamp += 1,
|
617
701
|
:currency => currency,
|
618
702
|
:evidence => self.mock_dispute_evidence,
|
619
703
|
:evidence_details => self.mock_dispute_evidence_details,
|
@@ -884,6 +968,38 @@ module StripeMock
|
|
884
968
|
}
|
885
969
|
end
|
886
970
|
|
971
|
+
def self.mock_balance(usd_balance = 10000)
|
972
|
+
{
|
973
|
+
object: "balance",
|
974
|
+
available: [
|
975
|
+
{
|
976
|
+
currency: "usd",
|
977
|
+
amount: usd_balance,
|
978
|
+
source_types: {
|
979
|
+
card: 25907032203,
|
980
|
+
bank_account: 108476658,
|
981
|
+
bitcoin_receiver: 1545182
|
982
|
+
}
|
983
|
+
}],
|
984
|
+
connect_reserved: [
|
985
|
+
{
|
986
|
+
currency: "usd",
|
987
|
+
amount: 4700
|
988
|
+
}],
|
989
|
+
livemode: false,
|
990
|
+
pending: [
|
991
|
+
{
|
992
|
+
currency: "usd",
|
993
|
+
amount: 22738833554,
|
994
|
+
source_types: {
|
995
|
+
card: 22738826610,
|
996
|
+
bank_account: 0,
|
997
|
+
bitcoin_receiver: 6944
|
998
|
+
}
|
999
|
+
}]
|
1000
|
+
}
|
1001
|
+
end
|
1002
|
+
|
887
1003
|
def self.mock_balance_transactions(ids=[])
|
888
1004
|
bts = {}
|
889
1005
|
ids.each do |id|
|
@@ -893,7 +1009,7 @@ module StripeMock
|
|
893
1009
|
end
|
894
1010
|
|
895
1011
|
def self.mock_balance_transaction(params = {})
|
896
|
-
currency = params[:currency] ||
|
1012
|
+
currency = params[:currency] || StripeMock.default_currency
|
897
1013
|
bt_id = params[:id] || 'test_txn_default'
|
898
1014
|
source = params[:source] || 'ch_test_charge'
|
899
1015
|
{
|
@@ -927,5 +1043,50 @@ module StripeMock
|
|
927
1043
|
type: "charge"
|
928
1044
|
}.merge(params)
|
929
1045
|
end
|
1046
|
+
|
1047
|
+
def self.mock_subscription_item(params = {})
|
1048
|
+
iid = params[:id] || 'test_txn_default'
|
1049
|
+
{
|
1050
|
+
id: iid,
|
1051
|
+
object: 'subscription_item',
|
1052
|
+
created: 1504716183,
|
1053
|
+
metadata: {
|
1054
|
+
},
|
1055
|
+
plan: {
|
1056
|
+
id: 'PER_USER_PLAN1',
|
1057
|
+
object: 'plan',
|
1058
|
+
amount: 1337,
|
1059
|
+
created: 1504716177,
|
1060
|
+
currency: StripeMock.default_currency,
|
1061
|
+
interval: 'month',
|
1062
|
+
interval_count: 1,
|
1063
|
+
livemode: false,
|
1064
|
+
metadata: {},
|
1065
|
+
name: 'StripeMock Default Plan ID',
|
1066
|
+
statement_descriptor: nil,
|
1067
|
+
trial_period_days: nil
|
1068
|
+
},
|
1069
|
+
quantity: 2
|
1070
|
+
}.merge(params)
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
def self.mock_ephemeral_key(**params)
|
1074
|
+
created = Time.now.to_i
|
1075
|
+
expires = created + 34_000
|
1076
|
+
{
|
1077
|
+
id: "ephkey_default",
|
1078
|
+
object: "ephemeral_key",
|
1079
|
+
associated_objects: [
|
1080
|
+
{
|
1081
|
+
id: params[:customer],
|
1082
|
+
type: "customer"
|
1083
|
+
}
|
1084
|
+
],
|
1085
|
+
created: created,
|
1086
|
+
expires: expires,
|
1087
|
+
livemode: false,
|
1088
|
+
secret: "ek_test_default"
|
1089
|
+
}
|
1090
|
+
end
|
930
1091
|
end
|
931
1092
|
end
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -20,12 +20,15 @@ module StripeMock
|
|
20
20
|
@@handlers.find {|h| method_url =~ h[:route] }
|
21
21
|
end
|
22
22
|
|
23
|
+
include StripeMock::RequestHandlers::ExternalAccounts
|
23
24
|
include StripeMock::RequestHandlers::Accounts
|
25
|
+
include StripeMock::RequestHandlers::Balance
|
24
26
|
include StripeMock::RequestHandlers::BalanceTransactions
|
25
27
|
include StripeMock::RequestHandlers::Charges
|
26
28
|
include StripeMock::RequestHandlers::Cards
|
27
29
|
include StripeMock::RequestHandlers::Sources
|
28
30
|
include StripeMock::RequestHandlers::Subscriptions # must be before Customers
|
31
|
+
include StripeMock::RequestHandlers::SubscriptionItems
|
29
32
|
include StripeMock::RequestHandlers::Customers
|
30
33
|
include StripeMock::RequestHandlers::Coupons
|
31
34
|
include StripeMock::RequestHandlers::Disputes
|
@@ -34,21 +37,26 @@ module StripeMock
|
|
34
37
|
include StripeMock::RequestHandlers::InvoiceItems
|
35
38
|
include StripeMock::RequestHandlers::Orders
|
36
39
|
include StripeMock::RequestHandlers::Plans
|
40
|
+
include StripeMock::RequestHandlers::Products
|
37
41
|
include StripeMock::RequestHandlers::Refunds
|
38
42
|
include StripeMock::RequestHandlers::Recipients
|
39
43
|
include StripeMock::RequestHandlers::Transfers
|
40
44
|
include StripeMock::RequestHandlers::Tokens
|
41
45
|
include StripeMock::RequestHandlers::CountrySpec
|
46
|
+
include StripeMock::RequestHandlers::Payouts
|
47
|
+
include StripeMock::RequestHandlers::EphemeralKey
|
48
|
+
include StripeMock::RequestHandlers::TaxRates
|
42
49
|
|
43
|
-
|
44
|
-
attr_reader :accounts, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
50
|
+
attr_reader :accounts, :balance, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
45
51
|
:disputes, :events, :invoices, :invoice_items, :orders, :plans, :recipients,
|
46
|
-
:refunds, :transfers, :subscriptions, :country_spec
|
52
|
+
:refunds, :transfers, :payouts, :subscriptions, :country_spec, :subscriptions_items,
|
53
|
+
:products, :tax_rates
|
47
54
|
|
48
|
-
attr_accessor :error_queue, :debug
|
55
|
+
attr_accessor :error_queue, :debug, :conversion_rate, :account_balance
|
49
56
|
|
50
57
|
def initialize
|
51
58
|
@accounts = {}
|
59
|
+
@balance = Data.mock_balance
|
52
60
|
@balance_transactions = Data.mock_balance_transactions(['txn_05RsQX2eZvKYlo2C0FRTGSSA','txn_15RsQX2eZvKYlo2C0ERTYUIA', 'txn_25RsQX2eZvKYlo2C0ZXCVBNM', 'txn_35RsQX2eZvKYlo2C0QAZXSWE', 'txn_45RsQX2eZvKYlo2C0EDCVFRT', 'txn_55RsQX2eZvKYlo2C0OIKLJUY', 'txn_65RsQX2eZvKYlo2C0ASDFGHJ', 'txn_75RsQX2eZvKYlo2C0EDCXSWQ', 'txn_85RsQX2eZvKYlo2C0UJMCDET', 'txn_95RsQX2eZvKYlo2C0EDFRYUI'])
|
53
61
|
@bank_tokens = {}
|
54
62
|
@card_tokens = {}
|
@@ -61,22 +69,29 @@ module StripeMock
|
|
61
69
|
@invoice_items = {}
|
62
70
|
@orders = {}
|
63
71
|
@plans = {}
|
72
|
+
@products = {}
|
64
73
|
@recipients = {}
|
65
74
|
@refunds = {}
|
66
75
|
@transfers = {}
|
76
|
+
@payouts = {}
|
67
77
|
@subscriptions = {}
|
78
|
+
@subscriptions_items = {}
|
68
79
|
@country_spec = {}
|
80
|
+
@tax_rates = {}
|
69
81
|
|
70
82
|
@debug = false
|
71
83
|
@error_queue = ErrorQueue.new
|
72
84
|
@id_counter = 0
|
73
85
|
@balance_transaction_counter = 0
|
86
|
+
@dispute_counter = 0
|
87
|
+
@conversion_rate = 1.0
|
88
|
+
@account_balance = 10000
|
74
89
|
|
75
90
|
# This is basically a cache for ParamValidators
|
76
91
|
@base_strategy = TestStrategies::Base.new
|
77
92
|
end
|
78
93
|
|
79
|
-
def mock_request(method, url, api_key, params
|
94
|
+
def mock_request(method, url, api_key: nil, api_base: nil, params: {}, headers: {})
|
80
95
|
return {} if method == :xtest
|
81
96
|
|
82
97
|
api_key ||= (Stripe.api_key || DUMMY_API_KEY)
|
@@ -99,7 +114,7 @@ module StripeMock
|
|
99
114
|
else
|
100
115
|
res = self.send(handler[:name], handler[:route], method_url, params, headers)
|
101
116
|
puts " [res] #{res}" if @debug == true
|
102
|
-
[res, api_key]
|
117
|
+
[to_faraday_hash(res), api_key]
|
103
118
|
end
|
104
119
|
else
|
105
120
|
puts "[StripeMock] Warning : Unrecognized endpoint + method : [#{method} #{url}]"
|
@@ -113,12 +128,44 @@ module StripeMock
|
|
113
128
|
@events[ event_data[:id] ] = symbolize_names(event_data)
|
114
129
|
end
|
115
130
|
|
131
|
+
def upsert_stripe_object(object, attributes)
|
132
|
+
# Most Stripe entities can be created via the API. However, some entities are created when other Stripe entities are
|
133
|
+
# created - such as when BalanceTransactions are created when Charges are created. This method provides the ability
|
134
|
+
# to create these internal entities.
|
135
|
+
# It also provides the ability to modify existing Stripe entities.
|
136
|
+
id = attributes[:id]
|
137
|
+
if id.nil? || id == ""
|
138
|
+
# Insert new Stripe object
|
139
|
+
case object
|
140
|
+
when :balance_transaction
|
141
|
+
id = new_balance_transaction('txn', attributes)
|
142
|
+
when :dispute
|
143
|
+
id = new_dispute('dp', attributes)
|
144
|
+
else
|
145
|
+
raise UnsupportedRequestError.new "Unsupported stripe object `#{object}`"
|
146
|
+
end
|
147
|
+
else
|
148
|
+
# Update existing Stripe object
|
149
|
+
case object
|
150
|
+
when :balance_transaction
|
151
|
+
btxn = assert_existence :balance_transaction, id, @balance_transactions[id]
|
152
|
+
btxn.merge!(attributes)
|
153
|
+
when :dispute
|
154
|
+
dispute = assert_existence :dispute, id, @disputes[id]
|
155
|
+
dispute.merge!(attributes)
|
156
|
+
else
|
157
|
+
raise UnsupportedRequestError.new "Unsupported stripe object `#{object}`"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
id
|
161
|
+
end
|
162
|
+
|
116
163
|
private
|
117
164
|
|
118
165
|
def assert_existence(type, id, obj, message=nil)
|
119
166
|
if obj.nil?
|
120
167
|
msg = message || "No such #{type}: #{id}"
|
121
|
-
raise Stripe::InvalidRequestError.new(msg, type.to_s, 404)
|
168
|
+
raise Stripe::InvalidRequestError.new(msg, type.to_s, http_status: 404)
|
122
169
|
end
|
123
170
|
obj
|
124
171
|
end
|
@@ -134,15 +181,53 @@ module StripeMock
|
|
134
181
|
amount = params[:amount]
|
135
182
|
unless amount.nil?
|
136
183
|
# Fee calculation
|
137
|
-
params[:fee]
|
184
|
+
calculate_fees(params) unless params[:fee]
|
185
|
+
params[:net] = amount - params[:fee]
|
186
|
+
params[:amount] = amount * @conversion_rate
|
138
187
|
end
|
139
188
|
@balance_transactions[id] = Data.mock_balance_transaction(params.merge(id: id))
|
140
189
|
id
|
141
190
|
end
|
142
191
|
|
192
|
+
def new_dispute(prefix, params = {})
|
193
|
+
id = "#{StripeMock.global_id_prefix}#{prefix}_#{@dispute_counter += 1}"
|
194
|
+
@disputes[id] = Data.mock_dispute(params.merge(id: id))
|
195
|
+
id
|
196
|
+
end
|
197
|
+
|
143
198
|
def symbolize_names(hash)
|
144
199
|
Stripe::Util.symbolize_names(hash)
|
145
200
|
end
|
146
201
|
|
202
|
+
def to_faraday_hash(hash)
|
203
|
+
response = Struct.new(:data)
|
204
|
+
response.new(hash)
|
205
|
+
end
|
206
|
+
|
207
|
+
def calculate_fees(params)
|
208
|
+
application_fee = params[:application_fee] || 0
|
209
|
+
params[:fee] = processing_fee(params[:amount]) + application_fee
|
210
|
+
params[:fee_details] = [
|
211
|
+
{
|
212
|
+
amount: processing_fee(params[:amount]),
|
213
|
+
application: nil,
|
214
|
+
currency: params[:currency] || StripeMock.default_currency,
|
215
|
+
description: "Stripe processing fees",
|
216
|
+
type: "stripe_fee"
|
217
|
+
}
|
218
|
+
]
|
219
|
+
if application_fee
|
220
|
+
params[:fee_details] << {
|
221
|
+
amount: application_fee,
|
222
|
+
currency: params[:currency] || StripeMock.default_currency,
|
223
|
+
description: "Application fee",
|
224
|
+
type: "application_fee"
|
225
|
+
}
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def processing_fee(amount)
|
230
|
+
(30 + (amount.abs * 0.029).ceil) * (amount > 0 ? 1 : -1)
|
231
|
+
end
|
147
232
|
end
|
148
233
|
end
|