stripe-ruby-mock 2.5.7 → 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/README.md +1 -1
- data/lib/stripe_mock.rb +2 -0
- data/lib/stripe_mock/api/webhooks.rb +2 -0
- data/lib/stripe_mock/data.rb +28 -2
- data/lib/stripe_mock/instance.rb +5 -2
- data/lib/stripe_mock/request_handlers/charges.rb +0 -4
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +5 -3
- data/lib/stripe_mock/request_handlers/subscription_items.rb +36 -0
- data/lib/stripe_mock/request_handlers/tax_rates.rb +36 -0
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +3 -0
- data/lib/stripe_mock/version.rb +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/invoice.created.json +1 -0
- data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +1 -0
- data/spec/shared_stripe_examples/customer_examples.rb +10 -0
- data/spec/shared_stripe_examples/invoice_examples.rb +3 -3
- data/spec/shared_stripe_examples/plan_examples.rb +18 -3
- data/spec/shared_stripe_examples/subscription_examples.rb +13 -0
- data/spec/shared_stripe_examples/subscription_items_examples.rb +75 -0
- data/spec/shared_stripe_examples/tax_rate_examples.rb +42 -0
- data/spec/support/stripe_examples.rb +2 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a15c09639e0a93df5b15cc5a45646c0fb189460e
|
4
|
+
data.tar.gz: b8cdf0692aba8099229f66e1906e691dd40075aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d70a5de8ae26c090632d00c1013d5ca63933fee41e40561b2e713b511a1c1347b21485b1d1c4eb8ee6837b6f4ec9a9f8e857a7bfa0785ac2182b8190180bfbb
|
7
|
+
data.tar.gz: 542f7a6f6c8743269e0337c1fc0b4fabef97003fe4d945c077ab4e16fe908bf7c21996dcb8c25ade7a4975a273a51972621d8d997e35a86f00dcb5287ae63d89
|
data/README.md
CHANGED
data/lib/stripe_mock.rb
CHANGED
@@ -67,10 +67,12 @@ require 'stripe_mock/request_handlers/refunds.rb'
|
|
67
67
|
require 'stripe_mock/request_handlers/transfers.rb'
|
68
68
|
require 'stripe_mock/request_handlers/payouts.rb'
|
69
69
|
require 'stripe_mock/request_handlers/subscriptions.rb'
|
70
|
+
require 'stripe_mock/request_handlers/subscription_items.rb'
|
70
71
|
require 'stripe_mock/request_handlers/tokens.rb'
|
71
72
|
require 'stripe_mock/request_handlers/country_spec.rb'
|
72
73
|
require 'stripe_mock/request_handlers/ephemeral_key.rb'
|
73
74
|
require 'stripe_mock/request_handlers/products.rb'
|
75
|
+
require 'stripe_mock/request_handlers/tax_rates.rb'
|
74
76
|
require 'stripe_mock/instance'
|
75
77
|
|
76
78
|
require 'stripe_mock/test_strategies/base.rb'
|
@@ -50,6 +50,8 @@ module StripeMock
|
|
50
50
|
'charge.dispute.created',
|
51
51
|
'charge.dispute.updated',
|
52
52
|
'charge.dispute.closed',
|
53
|
+
'charge.dispute.funds_reinstated',
|
54
|
+
'charge.dispute.funds_withdrawn',
|
53
55
|
'customer.source.created',
|
54
56
|
'customer.source.deleted',
|
55
57
|
'customer.source.updated',
|
data/lib/stripe_mock/data.rb
CHANGED
@@ -101,6 +101,22 @@ 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
122
|
currency = params[:currency] || StripeMock.default_currency
|
@@ -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,
|
@@ -335,6 +352,9 @@ module StripeMock
|
|
335
352
|
lines << Data.mock_line_item() if lines.empty?
|
336
353
|
invoice = {
|
337
354
|
id: 'in_test_invoice',
|
355
|
+
status: 'open',
|
356
|
+
invoice_pdf: 'pdf_url',
|
357
|
+
hosted_invoice_url: 'hosted_invoice_url',
|
338
358
|
created: 1349738950,
|
339
359
|
period_end: 1349738950,
|
340
360
|
period_start: 1349738950,
|
@@ -356,12 +376,13 @@ module StripeMock
|
|
356
376
|
paid: false,
|
357
377
|
receipt_number: nil,
|
358
378
|
statement_descriptor: nil,
|
359
|
-
tax:
|
379
|
+
tax: 10,
|
360
380
|
tax_percent: nil,
|
361
381
|
webhooks_delivered_at: 1349825350,
|
362
382
|
livemode: false,
|
363
383
|
attempt_count: 0,
|
364
|
-
amount_due:
|
384
|
+
amount_due: 100,
|
385
|
+
amount_paid: 0,
|
365
386
|
currency: currency,
|
366
387
|
starting_balance: 0,
|
367
388
|
ending_balance: nil,
|
@@ -396,6 +417,11 @@ module StripeMock
|
|
396
417
|
start: 1349738920,
|
397
418
|
end: 1349738920
|
398
419
|
},
|
420
|
+
tax_amounts: [
|
421
|
+
{
|
422
|
+
amount: 10
|
423
|
+
}
|
424
|
+
],
|
399
425
|
quantity: nil,
|
400
426
|
subscription: nil,
|
401
427
|
plan: nil,
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -28,6 +28,7 @@ module StripeMock
|
|
28
28
|
include StripeMock::RequestHandlers::Cards
|
29
29
|
include StripeMock::RequestHandlers::Sources
|
30
30
|
include StripeMock::RequestHandlers::Subscriptions # must be before Customers
|
31
|
+
include StripeMock::RequestHandlers::SubscriptionItems
|
31
32
|
include StripeMock::RequestHandlers::Customers
|
32
33
|
include StripeMock::RequestHandlers::Coupons
|
33
34
|
include StripeMock::RequestHandlers::Disputes
|
@@ -44,11 +45,12 @@ module StripeMock
|
|
44
45
|
include StripeMock::RequestHandlers::CountrySpec
|
45
46
|
include StripeMock::RequestHandlers::Payouts
|
46
47
|
include StripeMock::RequestHandlers::EphemeralKey
|
48
|
+
include StripeMock::RequestHandlers::TaxRates
|
47
49
|
|
48
50
|
attr_reader :accounts, :balance, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
49
51
|
:disputes, :events, :invoices, :invoice_items, :orders, :plans, :recipients,
|
50
52
|
:refunds, :transfers, :payouts, :subscriptions, :country_spec, :subscriptions_items,
|
51
|
-
:products
|
53
|
+
:products, :tax_rates
|
52
54
|
|
53
55
|
attr_accessor :error_queue, :debug, :conversion_rate, :account_balance
|
54
56
|
|
@@ -73,8 +75,9 @@ module StripeMock
|
|
73
75
|
@transfers = {}
|
74
76
|
@payouts = {}
|
75
77
|
@subscriptions = {}
|
76
|
-
@subscriptions_items =
|
78
|
+
@subscriptions_items = {}
|
77
79
|
@country_spec = {}
|
80
|
+
@tax_rates = {}
|
78
81
|
|
79
82
|
@debug = false
|
80
83
|
@error_queue = ErrorQueue.new
|
@@ -158,10 +158,6 @@ module StripeMock
|
|
158
158
|
params[:amount] && params[:amount] < 1
|
159
159
|
end
|
160
160
|
|
161
|
-
def require_param(param)
|
162
|
-
raise Stripe::InvalidRequestError.new("Missing required param: #{param}", param.to_s, http_status: 400)
|
163
|
-
end
|
164
|
-
|
165
161
|
def allowed_params(params)
|
166
162
|
allowed = [:description, :metadata, :receipt_email, :fraud_details, :shipping, :destination]
|
167
163
|
|
@@ -8,10 +8,12 @@ module StripeMock
|
|
8
8
|
|
9
9
|
def resolve_subscription_changes(subscription, plans, customer, options = {})
|
10
10
|
subscription.merge!(custom_subscription_params(plans, customer, options))
|
11
|
+
items = options[:items]
|
12
|
+
items = items.values if items.respond_to?(:values)
|
11
13
|
subscription[:items][:data] = plans.map do |plan|
|
12
|
-
if
|
13
|
-
quantity =
|
14
|
-
|
14
|
+
if items && items.size == plans.size
|
15
|
+
quantity = items &&
|
16
|
+
items.detect { |item| item[:plan] == plan[:id] }[:quantity] || 1
|
15
17
|
Data.mock_subscription_item({ plan: plan, quantity: quantity })
|
16
18
|
else
|
17
19
|
Data.mock_subscription_item({ plan: plan })
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module SubscriptionItems
|
4
|
+
|
5
|
+
def SubscriptionItems.included(klass)
|
6
|
+
klass.add_handler 'get /v1/subscription_items', :retrieve_subscription_items
|
7
|
+
klass.add_handler 'post /v1/subscription_items/([^/]*)', :update_subscription_item
|
8
|
+
klass.add_handler 'post /v1/subscription_items', :create_subscription_items
|
9
|
+
end
|
10
|
+
|
11
|
+
def retrieve_subscription_items(route, method_url, params, headers)
|
12
|
+
route =~ method_url
|
13
|
+
|
14
|
+
require_param(:subscription) unless params[:subscription]
|
15
|
+
|
16
|
+
Data.mock_list_object(subscriptions_items, params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_subscription_items(route, method_url, params, headers)
|
20
|
+
params[:id] ||= new_id('si')
|
21
|
+
|
22
|
+
require_param(:subscription) unless params[:subscription]
|
23
|
+
require_param(:plan) unless params[:plan]
|
24
|
+
|
25
|
+
subscriptions_items[params[:id]] = Data.mock_subscription_item(params.merge(plan: plans[params[:plan]]))
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_subscription_item(route, method_url, params, headers)
|
29
|
+
route =~ method_url
|
30
|
+
|
31
|
+
subscription_item = assert_existence :subscription_item, $1, subscriptions_items[$1]
|
32
|
+
subscription_item.merge!(params.merge(plan: plans[params[:plan]]))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -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
|
+
|
data/lib/stripe_mock/version.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
{
|
2
|
+
"created": 1326853478,
|
3
|
+
"livemode": false,
|
4
|
+
"id": "evt_00000000000000",
|
5
|
+
"type": "charge.dispute.funds_reinstated",
|
6
|
+
"object": "event",
|
7
|
+
"request": null,
|
8
|
+
"pending_webhooks": 1,
|
9
|
+
"api_version": "2017-12-14",
|
10
|
+
"data": {
|
11
|
+
"object": {
|
12
|
+
"id": "dp_00000000000000",
|
13
|
+
"object": "dispute",
|
14
|
+
"amount": 25000,
|
15
|
+
"balance_transaction": "txn_00000000000000",
|
16
|
+
"balance_transactions": [
|
17
|
+
{
|
18
|
+
"id": "txn_1Bl3mMGWCopOTFn18p8iALq8",
|
19
|
+
"object": "balance_transaction",
|
20
|
+
"amount": -25000,
|
21
|
+
"available_on": 1516233600,
|
22
|
+
"created": 1516145022,
|
23
|
+
"currency": "usd",
|
24
|
+
"description": "Chargeback withdrawal for ch_1Bl3mKGWCopOTFn1LKoN557r",
|
25
|
+
"exchange_rate": null,
|
26
|
+
"fee": 1500,
|
27
|
+
"fee_details": [
|
28
|
+
{
|
29
|
+
"amount": 1500,
|
30
|
+
"application": null,
|
31
|
+
"currency": "usd",
|
32
|
+
"description": "Dispute fee",
|
33
|
+
"type": "stripe_fee"
|
34
|
+
}
|
35
|
+
],
|
36
|
+
"net": -26500,
|
37
|
+
"source": "dp_1Bl3mMGWCopOTFn1jpVaJDrU",
|
38
|
+
"status": "pending",
|
39
|
+
"type": "adjustment"
|
40
|
+
}
|
41
|
+
],
|
42
|
+
"charge": "ch_00000000000000",
|
43
|
+
"created": 1516145022,
|
44
|
+
"currency": "usd",
|
45
|
+
"evidence": {
|
46
|
+
"access_activity_log": null,
|
47
|
+
"billing_address": null,
|
48
|
+
"cancellation_policy": null,
|
49
|
+
"cancellation_policy_disclosure": null,
|
50
|
+
"cancellation_rebuttal": null,
|
51
|
+
"customer_communication": null,
|
52
|
+
"customer_email_address": "amitree.apu@gmail.com",
|
53
|
+
"customer_name": "amitree.apu@gmail.com",
|
54
|
+
"customer_purchase_ip": "157.131.133.10",
|
55
|
+
"customer_signature": null,
|
56
|
+
"duplicate_charge_documentation": null,
|
57
|
+
"duplicate_charge_explanation": null,
|
58
|
+
"duplicate_charge_id": null,
|
59
|
+
"product_description": null,
|
60
|
+
"receipt": null,
|
61
|
+
"refund_policy": null,
|
62
|
+
"refund_policy_disclosure": null,
|
63
|
+
"refund_refusal_explanation": null,
|
64
|
+
"service_date": null,
|
65
|
+
"service_documentation": null,
|
66
|
+
"shipping_address": null,
|
67
|
+
"shipping_carrier": null,
|
68
|
+
"shipping_date": null,
|
69
|
+
"shipping_documentation": null,
|
70
|
+
"shipping_tracking_number": null,
|
71
|
+
"uncategorized_file": null,
|
72
|
+
"uncategorized_text": null
|
73
|
+
},
|
74
|
+
"evidence_details": {
|
75
|
+
"due_by": 1517529599,
|
76
|
+
"has_evidence": false,
|
77
|
+
"past_due": false,
|
78
|
+
"submission_count": 0
|
79
|
+
},
|
80
|
+
"is_charge_refundable": false,
|
81
|
+
"livemode": false,
|
82
|
+
"metadata": {
|
83
|
+
},
|
84
|
+
"reason": "fraudulent",
|
85
|
+
"status": "needs_response"
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
@@ -0,0 +1,88 @@
|
|
1
|
+
{
|
2
|
+
"created": 1326853478,
|
3
|
+
"livemode": false,
|
4
|
+
"id": "evt_00000000000000",
|
5
|
+
"type": "charge.dispute.funds_withdrawn",
|
6
|
+
"object": "event",
|
7
|
+
"request": null,
|
8
|
+
"pending_webhooks": 1,
|
9
|
+
"api_version": "2017-12-14",
|
10
|
+
"data": {
|
11
|
+
"object": {
|
12
|
+
"id": "dp_00000000000000",
|
13
|
+
"object": "dispute",
|
14
|
+
"amount": 25000,
|
15
|
+
"balance_transaction": "txn_00000000000000",
|
16
|
+
"balance_transactions": [
|
17
|
+
{
|
18
|
+
"id": "txn_1Bl3mMGWCopOTFn18p8iALq8",
|
19
|
+
"object": "balance_transaction",
|
20
|
+
"amount": -25000,
|
21
|
+
"available_on": 1516233600,
|
22
|
+
"created": 1516145022,
|
23
|
+
"currency": "usd",
|
24
|
+
"description": "Chargeback withdrawal for ch_1Bl3mKGWCopOTFn1LKoN557r",
|
25
|
+
"exchange_rate": null,
|
26
|
+
"fee": 1500,
|
27
|
+
"fee_details": [
|
28
|
+
{
|
29
|
+
"amount": 1500,
|
30
|
+
"application": null,
|
31
|
+
"currency": "usd",
|
32
|
+
"description": "Dispute fee",
|
33
|
+
"type": "stripe_fee"
|
34
|
+
}
|
35
|
+
],
|
36
|
+
"net": -26500,
|
37
|
+
"source": "dp_1Bl3mMGWCopOTFn1jpVaJDrU",
|
38
|
+
"status": "pending",
|
39
|
+
"type": "adjustment"
|
40
|
+
}
|
41
|
+
],
|
42
|
+
"charge": "ch_00000000000000",
|
43
|
+
"created": 1516145022,
|
44
|
+
"currency": "usd",
|
45
|
+
"evidence": {
|
46
|
+
"access_activity_log": null,
|
47
|
+
"billing_address": null,
|
48
|
+
"cancellation_policy": null,
|
49
|
+
"cancellation_policy_disclosure": null,
|
50
|
+
"cancellation_rebuttal": null,
|
51
|
+
"customer_communication": null,
|
52
|
+
"customer_email_address": "amitree.apu@gmail.com",
|
53
|
+
"customer_name": "amitree.apu@gmail.com",
|
54
|
+
"customer_purchase_ip": "157.131.133.10",
|
55
|
+
"customer_signature": null,
|
56
|
+
"duplicate_charge_documentation": null,
|
57
|
+
"duplicate_charge_explanation": null,
|
58
|
+
"duplicate_charge_id": null,
|
59
|
+
"product_description": null,
|
60
|
+
"receipt": null,
|
61
|
+
"refund_policy": null,
|
62
|
+
"refund_policy_disclosure": null,
|
63
|
+
"refund_refusal_explanation": null,
|
64
|
+
"service_date": null,
|
65
|
+
"service_documentation": null,
|
66
|
+
"shipping_address": null,
|
67
|
+
"shipping_carrier": null,
|
68
|
+
"shipping_date": null,
|
69
|
+
"shipping_documentation": null,
|
70
|
+
"shipping_tracking_number": null,
|
71
|
+
"uncategorized_file": null,
|
72
|
+
"uncategorized_text": null
|
73
|
+
},
|
74
|
+
"evidence_details": {
|
75
|
+
"due_by": 1517529599,
|
76
|
+
"has_evidence": false,
|
77
|
+
"past_due": false,
|
78
|
+
"submission_count": 0
|
79
|
+
},
|
80
|
+
"is_charge_refundable": false,
|
81
|
+
"livemode": false,
|
82
|
+
"metadata": {
|
83
|
+
},
|
84
|
+
"reason": "fraudulent",
|
85
|
+
"status": "needs_response"
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
@@ -78,6 +78,15 @@ shared_examples 'Customer API' do
|
|
78
78
|
expect(customer.sources.data.first.exp_year).to eq 2024
|
79
79
|
end
|
80
80
|
|
81
|
+
it 'creates a customer with name' do
|
82
|
+
customer = Stripe::Customer.create(
|
83
|
+
source: gen_card_tk,
|
84
|
+
name: 'John Appleseed'
|
85
|
+
)
|
86
|
+
expect(customer.id).to match(/^test_cus/)
|
87
|
+
expect(customer.name).to eq('John Appleseed')
|
88
|
+
end
|
89
|
+
|
81
90
|
it 'creates a customer with a plan' do
|
82
91
|
plan = stripe_helper.create_plan(id: 'silver')
|
83
92
|
customer = Stripe::Customer.create(id: 'test_cus_plan', source: gen_card_tk, :plan => 'silver')
|
@@ -267,6 +276,7 @@ shared_examples 'Customer API' do
|
|
267
276
|
|
268
277
|
expect(customer.id).to eq(original.id)
|
269
278
|
expect(customer.email).to eq(original.email)
|
279
|
+
expect(customer.name).to eq(nil)
|
270
280
|
expect(customer.default_source).to eq(original.default_source)
|
271
281
|
expect(customer.default_source).not_to be_a(Stripe::Card)
|
272
282
|
expect(customer.subscriptions.count).to eq(0)
|
@@ -52,7 +52,7 @@ shared_examples 'Invoice API' do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it "stores all invoices in memory" do
|
55
|
-
expect(Stripe::Invoice.all.map(&:id)).to eq([@invoice.id, @invoice2.id])
|
55
|
+
expect(Stripe::Invoice.all.map(&:id).sort).to eq([@invoice.id, @invoice2.id].sort)
|
56
56
|
end
|
57
57
|
|
58
58
|
it "defaults count to 10 invoices" do
|
@@ -79,7 +79,7 @@ shared_examples 'Invoice API' do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'updates attempted and paid flags' do
|
82
|
-
@invoice.pay
|
82
|
+
@invoice = @invoice.pay
|
83
83
|
expect(@invoice.attempted).to eq(true)
|
84
84
|
expect(@invoice.paid).to eq(true)
|
85
85
|
end
|
@@ -89,7 +89,7 @@ shared_examples 'Invoice API' do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'sets the charge attribute' do
|
92
|
-
@invoice.pay
|
92
|
+
@invoice = @invoice.pay
|
93
93
|
expect(@invoice.charge).to be_a String
|
94
94
|
expect(@invoice.charge.length).to be > 0
|
95
95
|
end
|
@@ -9,6 +9,9 @@ shared_examples 'Plan API' do
|
|
9
9
|
:amount => 9900,
|
10
10
|
:currency => 'USD',
|
11
11
|
:interval => 1,
|
12
|
+
:product => {
|
13
|
+
:name => 'A product'
|
14
|
+
},
|
12
15
|
:metadata => {
|
13
16
|
:description => "desc text",
|
14
17
|
:info => "info text"
|
@@ -36,6 +39,9 @@ shared_examples 'Plan API' do
|
|
36
39
|
:amount => 9900,
|
37
40
|
:currency => 'USD',
|
38
41
|
:interval => 1,
|
42
|
+
:product => {
|
43
|
+
:name => 'A product'
|
44
|
+
}
|
39
45
|
)
|
40
46
|
|
41
47
|
expect(plan.id).to match(/^test_plan/)
|
@@ -47,14 +53,20 @@ shared_examples 'Plan API' do
|
|
47
53
|
:name => 'The Memory Plan',
|
48
54
|
:amount => 1100,
|
49
55
|
:currency => 'USD',
|
50
|
-
:interval => 1
|
56
|
+
:interval => 1,
|
57
|
+
:product => {
|
58
|
+
:name => 'A product'
|
59
|
+
}
|
51
60
|
)
|
52
61
|
plan2 = Stripe::Plan.create(
|
53
62
|
:id => 'pid_3',
|
54
63
|
:name => 'The Bonk Plan',
|
55
64
|
:amount => 7777,
|
56
65
|
:currency => 'USD',
|
57
|
-
:interval => 1
|
66
|
+
:interval => 1,
|
67
|
+
:product => {
|
68
|
+
:name => 'A product'
|
69
|
+
}
|
58
70
|
)
|
59
71
|
data = test_data_source(:plans)
|
60
72
|
expect(data[plan.id]).to_not be_nil
|
@@ -136,7 +148,10 @@ shared_examples 'Plan API' do
|
|
136
148
|
:name => 'The Mock Plan',
|
137
149
|
:amount => 99.99,
|
138
150
|
:currency => 'USD',
|
139
|
-
:interval => 'month'
|
151
|
+
:interval => 'month',
|
152
|
+
:product => {
|
153
|
+
:name => 'A product'
|
154
|
+
}
|
140
155
|
)
|
141
156
|
}.to raise_error(Stripe::InvalidRequestError, "Invalid integer: 99.99")
|
142
157
|
end
|
@@ -552,6 +552,19 @@ shared_examples 'Customer Subscriptions' do
|
|
552
552
|
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, another_subscription_header)
|
553
553
|
expect(sub1).not_to eq(sub2)
|
554
554
|
end
|
555
|
+
|
556
|
+
it "accepts a hash of items" do
|
557
|
+
silver = stripe_helper.create_plan(id: 'silver')
|
558
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
559
|
+
|
560
|
+
sub = Stripe::Subscription.create({ items: { '0' => { plan: 'silver' } }, customer: customer.id })
|
561
|
+
sub.delete(at_period_end: true)
|
562
|
+
|
563
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
564
|
+
expect(sub.save).to be_truthy
|
565
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
566
|
+
end
|
567
|
+
|
555
568
|
end
|
556
569
|
|
557
570
|
context "updating a subscription" do
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_examples 'Subscription Items API' do
|
4
|
+
let(:stripe_helper) { StripeMock.create_test_helper }
|
5
|
+
let(:plan) { stripe_helper.create_plan }
|
6
|
+
let(:plan2) { stripe_helper.create_plan(amount: 100, id: 'one_more_1_plan') }
|
7
|
+
let(:customer) { Stripe::Customer.create(source: stripe_helper.generate_card_token) }
|
8
|
+
let(:subscription) { Stripe::Subscription.create(customer: customer.id, items: [{ plan: plan.id }]) }
|
9
|
+
|
10
|
+
context 'creates an item' do
|
11
|
+
it 'when required params only' do
|
12
|
+
item = Stripe::SubscriptionItem.create(plan: plan.id, subscription: subscription.id)
|
13
|
+
|
14
|
+
expect(item.id).to match(/^test_si/)
|
15
|
+
expect(item.plan.id).to eq(plan.id)
|
16
|
+
expect(item.subscription).to eq(subscription.id)
|
17
|
+
end
|
18
|
+
it 'when no subscription params' do
|
19
|
+
expect { Stripe::SubscriptionItem.create(plan: plan.id) }.to raise_error { |e|
|
20
|
+
expect(e).to be_a(Stripe::InvalidRequestError)
|
21
|
+
expect(e.param).to eq('subscription')
|
22
|
+
expect(e.message).to eq('Missing required param: subscription.')
|
23
|
+
}
|
24
|
+
end
|
25
|
+
it 'when no plan params' do
|
26
|
+
expect { Stripe::SubscriptionItem.create(subscription: subscription.id) }.to raise_error { |e|
|
27
|
+
expect(e).to be_a(Stripe::InvalidRequestError)
|
28
|
+
expect(e.param).to eq('plan')
|
29
|
+
expect(e.message).to eq('Missing required param: plan.')
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'updates an item' do
|
35
|
+
let(:item) { Stripe::SubscriptionItem.create(plan: plan.id, subscription: subscription.id, quantity: 2 ) }
|
36
|
+
|
37
|
+
it 'updates plan' do
|
38
|
+
updated_item = Stripe::SubscriptionItem.update(item.id, plan: plan2.id)
|
39
|
+
|
40
|
+
expect(updated_item.plan.id).to eq(plan2.id)
|
41
|
+
end
|
42
|
+
it 'updates quantity' do
|
43
|
+
updated_item = Stripe::SubscriptionItem.update(item.id, quantity: 23)
|
44
|
+
|
45
|
+
expect(updated_item.quantity).to eq(23)
|
46
|
+
end
|
47
|
+
it 'when no existing item' do
|
48
|
+
expect { Stripe::SubscriptionItem.update('some_id') }.to raise_error { |e|
|
49
|
+
expect(e).to be_a(Stripe::InvalidRequestError)
|
50
|
+
expect(e.param).to eq('subscription_item')
|
51
|
+
expect(e.message).to eq('No such subscription_item: some_id')
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'retrieves a list of items' do
|
57
|
+
before do
|
58
|
+
Stripe::SubscriptionItem.create(plan: plan.id, subscription: subscription.id, quantity: 2 )
|
59
|
+
Stripe::SubscriptionItem.create(plan: plan2.id, subscription: subscription.id, quantity: 20)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'retrieves all subscription items' do
|
63
|
+
all = Stripe::SubscriptionItem.list(subscription: subscription.id)
|
64
|
+
|
65
|
+
expect(all.count).to eq(2)
|
66
|
+
end
|
67
|
+
it 'when no subscription param' do
|
68
|
+
expect { Stripe::SubscriptionItem.list }.to raise_error { |e|
|
69
|
+
expect(e).to be_a(Stripe::InvalidRequestError)
|
70
|
+
expect(e.param).to eq('subscription')
|
71
|
+
expect(e.message).to eq('Missing required param: subscription.')
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_examples 'TaxRate API' do
|
4
|
+
context 'with created tax rate' do
|
5
|
+
let!(:rate) { Stripe::TaxRate.create }
|
6
|
+
|
7
|
+
it 'returns list of tax rates' do
|
8
|
+
rates = Stripe::TaxRate.list
|
9
|
+
expect(rates.count).to eq(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'retrieves tax rate' do
|
13
|
+
ret_rate = Stripe::TaxRate.retrieve(rate.id)
|
14
|
+
expect(ret_rate.id).not_to be_nil
|
15
|
+
expect(ret_rate.object).to eq('tax_rate')
|
16
|
+
expect(ret_rate.display_name).to eq('VAT')
|
17
|
+
expect(ret_rate.percentage).to eq(21.0)
|
18
|
+
expect(ret_rate.jurisdiction).to eq('EU')
|
19
|
+
expect(ret_rate.inclusive).to eq(false)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'updates tax rate' do
|
23
|
+
ret_rate = Stripe::TaxRate.update(rate.id, percentage: 30.5)
|
24
|
+
expect(ret_rate.id).not_to be_nil
|
25
|
+
expect(ret_rate.object).to eq('tax_rate')
|
26
|
+
expect(ret_rate.display_name).to eq('VAT')
|
27
|
+
expect(ret_rate.percentage).to eq(30.5)
|
28
|
+
expect(ret_rate.jurisdiction).to eq('EU')
|
29
|
+
expect(ret_rate.inclusive).to eq(false)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'creates tax rate' do
|
34
|
+
rate = Stripe::TaxRate.create
|
35
|
+
expect(rate.id).not_to be_nil
|
36
|
+
expect(rate.object).to eq('tax_rate')
|
37
|
+
expect(rate.display_name).to eq('VAT')
|
38
|
+
expect(rate.percentage).to eq(21.0)
|
39
|
+
expect(rate.jurisdiction).to eq('EU')
|
40
|
+
expect(rate.inclusive).to eq(false)
|
41
|
+
end
|
42
|
+
end
|
@@ -27,9 +27,11 @@ def it_behaves_like_stripe(&block)
|
|
27
27
|
it_behaves_like 'Payout API', &block
|
28
28
|
it_behaves_like 'Stripe Error Mocking', &block
|
29
29
|
it_behaves_like 'Customer Subscriptions', &block
|
30
|
+
it_behaves_like 'Subscription Items API', &block
|
30
31
|
it_behaves_like 'Webhook Events API', &block
|
31
32
|
it_behaves_like 'Country Spec API', &block
|
32
33
|
it_behaves_like 'EphemeralKey API', &block
|
34
|
+
it_behaves_like 'TaxRate API', &block
|
33
35
|
|
34
36
|
# Integration tests
|
35
37
|
it_behaves_like 'Multiple Customer Cards'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stripe-ruby-mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gilbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stripe
|
@@ -163,7 +163,9 @@ files:
|
|
163
163
|
- lib/stripe_mock/request_handlers/recipients.rb
|
164
164
|
- lib/stripe_mock/request_handlers/refunds.rb
|
165
165
|
- lib/stripe_mock/request_handlers/sources.rb
|
166
|
+
- lib/stripe_mock/request_handlers/subscription_items.rb
|
166
167
|
- lib/stripe_mock/request_handlers/subscriptions.rb
|
168
|
+
- lib/stripe_mock/request_handlers/tax_rates.rb
|
167
169
|
- lib/stripe_mock/request_handlers/tokens.rb
|
168
170
|
- lib/stripe_mock/request_handlers/transfers.rb
|
169
171
|
- lib/stripe_mock/request_handlers/validators/param_validators.rb
|
@@ -181,6 +183,8 @@ files:
|
|
181
183
|
- lib/stripe_mock/webhook_fixtures/balance.available.json
|
182
184
|
- lib/stripe_mock/webhook_fixtures/charge.dispute.closed.json
|
183
185
|
- lib/stripe_mock/webhook_fixtures/charge.dispute.created.json
|
186
|
+
- lib/stripe_mock/webhook_fixtures/charge.dispute.funds_reinstated.json
|
187
|
+
- lib/stripe_mock/webhook_fixtures/charge.dispute.funds_withdrawn.json
|
184
188
|
- lib/stripe_mock/webhook_fixtures/charge.dispute.updated.json
|
185
189
|
- lib/stripe_mock/webhook_fixtures/charge.failed.json
|
186
190
|
- lib/stripe_mock/webhook_fixtures/charge.refunded.json
|
@@ -252,6 +256,8 @@ files:
|
|
252
256
|
- spec/shared_stripe_examples/recipient_examples.rb
|
253
257
|
- spec/shared_stripe_examples/refund_examples.rb
|
254
258
|
- spec/shared_stripe_examples/subscription_examples.rb
|
259
|
+
- spec/shared_stripe_examples/subscription_items_examples.rb
|
260
|
+
- spec/shared_stripe_examples/tax_rate_examples.rb
|
255
261
|
- spec/shared_stripe_examples/transfer_examples.rb
|
256
262
|
- spec/shared_stripe_examples/validation_examples.rb
|
257
263
|
- spec/shared_stripe_examples/webhook_event_examples.rb
|
@@ -321,6 +327,8 @@ test_files:
|
|
321
327
|
- spec/shared_stripe_examples/recipient_examples.rb
|
322
328
|
- spec/shared_stripe_examples/refund_examples.rb
|
323
329
|
- spec/shared_stripe_examples/subscription_examples.rb
|
330
|
+
- spec/shared_stripe_examples/subscription_items_examples.rb
|
331
|
+
- spec/shared_stripe_examples/tax_rate_examples.rb
|
324
332
|
- spec/shared_stripe_examples/transfer_examples.rb
|
325
333
|
- spec/shared_stripe_examples/validation_examples.rb
|
326
334
|
- spec/shared_stripe_examples/webhook_event_examples.rb
|