stripe-ruby-mock 1.8.7.7 → 1.10.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/README.md +3 -2
- data/lib/stripe_mock.rb +1 -0
- data/lib/stripe_mock/api/webhooks.rb +3 -0
- data/lib/stripe_mock/data.rb +10 -1
- data/lib/stripe_mock/instance.rb +24 -1
- data/lib/stripe_mock/request_handlers/customers.rb +5 -57
- data/lib/stripe_mock/request_handlers/subscriptions.rb +127 -0
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock/webhook_fixtures/customer.card.created.json +30 -0
- data/lib/stripe_mock/webhook_fixtures/customer.card.deleted.json +30 -0
- data/lib/stripe_mock/webhook_fixtures/customer.card.updated.json +34 -0
- data/lib/stripe_mock/webhook_fixtures/invoice.created.json +4 -5
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_failed.json +4 -5
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +4 -5
- data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +5 -8
- data/spec/shared_stripe_examples/customer_examples.rb +8 -4
- data/spec/shared_stripe_examples/subscription_examples.rb +310 -96
- data/spec/shared_stripe_examples/webhook_event_examples.rb +5 -5
- data/spec/support/stripe_examples.rb +1 -1
- data/stripe-ruby-mock.gemspec +1 -1
- metadata +8 -4
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
In your gemfile:
|
10
10
|
|
11
|
-
gem 'stripe-ruby-mock', '
|
11
|
+
gem 'stripe-ruby-mock', '>= 1.10.1.0'
|
12
12
|
|
13
13
|
## Features
|
14
14
|
|
@@ -282,7 +282,8 @@ If you always want debug to be on (it's quite verbose), you should put this in a
|
|
282
282
|
|
283
283
|
To run the tests:
|
284
284
|
|
285
|
-
$
|
285
|
+
$ bundle install
|
286
|
+
$ bundle exec rspec
|
286
287
|
|
287
288
|
Patches are welcome and greatly appreciated! If you're contributing to fix a problem,
|
288
289
|
be sure to write tests that illustrate the problem being fixed.
|
data/lib/stripe_mock.rb
CHANGED
@@ -37,6 +37,7 @@ require 'stripe_mock/request_handlers/invoices.rb'
|
|
37
37
|
require 'stripe_mock/request_handlers/invoice_items.rb'
|
38
38
|
require 'stripe_mock/request_handlers/plans.rb'
|
39
39
|
require 'stripe_mock/request_handlers/recipients.rb'
|
40
|
+
require 'stripe_mock/request_handlers/subscriptions.rb'
|
40
41
|
require 'stripe_mock/request_handlers/tokens.rb'
|
41
42
|
require 'stripe_mock/instance'
|
42
43
|
|
data/lib/stripe_mock/data.rb
CHANGED
@@ -12,7 +12,6 @@ module StripeMock
|
|
12
12
|
id: cus_id,
|
13
13
|
livemode: false,
|
14
14
|
delinquent: false,
|
15
|
-
subscription: nil,
|
16
15
|
discount: nil,
|
17
16
|
account_balance: 0,
|
18
17
|
cards: {
|
@@ -152,6 +151,7 @@ module StripeMock
|
|
152
151
|
:current_period_start => 1308595038,
|
153
152
|
:cancel_at_period_end => false,
|
154
153
|
:canceled_at => nil,
|
154
|
+
:ended_at => nil,
|
155
155
|
:start => 1308595038,
|
156
156
|
:object => "subscription",
|
157
157
|
:trial_start => 1308595038,
|
@@ -221,6 +221,15 @@ module StripeMock
|
|
221
221
|
}
|
222
222
|
end
|
223
223
|
|
224
|
+
def self.mock_subscriptions_array(params={})
|
225
|
+
{
|
226
|
+
:data => [],
|
227
|
+
:count => 0,
|
228
|
+
:object => "list",
|
229
|
+
:url => '/v1/customers/test_customer/subscriptions',
|
230
|
+
}.merge(params)
|
231
|
+
end
|
232
|
+
|
224
233
|
def self.mock_plan(params={})
|
225
234
|
{
|
226
235
|
interval: "month",
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -17,6 +17,7 @@ module StripeMock
|
|
17
17
|
|
18
18
|
include StripeMock::RequestHandlers::Charges
|
19
19
|
include StripeMock::RequestHandlers::Cards
|
20
|
+
include StripeMock::RequestHandlers::Subscriptions # must be before Customers
|
20
21
|
include StripeMock::RequestHandlers::Customers
|
21
22
|
include StripeMock::RequestHandlers::Events
|
22
23
|
include StripeMock::RequestHandlers::Invoices
|
@@ -27,7 +28,7 @@ module StripeMock
|
|
27
28
|
|
28
29
|
|
29
30
|
attr_reader :bank_tokens, :charges, :customers, :events,
|
30
|
-
:invoices, :plans, :recipients
|
31
|
+
:invoices, :plans, :recipients, :subscriptions
|
31
32
|
|
32
33
|
attr_accessor :error_queue, :debug, :strict
|
33
34
|
|
@@ -40,6 +41,7 @@ module StripeMock
|
|
40
41
|
@invoices = {}
|
41
42
|
@plans = {}
|
42
43
|
@recipients = {}
|
44
|
+
@subscriptions = {}
|
43
45
|
|
44
46
|
@debug = false
|
45
47
|
@error_queue = ErrorQueue.new
|
@@ -128,6 +130,27 @@ module StripeMock
|
|
128
130
|
card
|
129
131
|
end
|
130
132
|
|
133
|
+
def get_customer_subscription(customer, sub_id)
|
134
|
+
customer[:subscriptions][:data].find{|sub| sub[:id] == sub_id }
|
135
|
+
end
|
136
|
+
|
137
|
+
def add_subscription_to_customer(plan, cus)
|
138
|
+
params = { id: new_id('su'), plan: plan, customer: cus[:id] }
|
139
|
+
|
140
|
+
if plan[:trial_period_days].nil?
|
141
|
+
params.merge!({status: 'active', trial_start: nil, trial_end: nil})
|
142
|
+
else
|
143
|
+
params.merge!({status: 'trialing', trial_start: Time.now.to_i, trial_end: (Time.now + plan[:trial_period_days]).to_i })
|
144
|
+
end
|
145
|
+
|
146
|
+
subscription = Data.mock_subscription params
|
147
|
+
|
148
|
+
cus[:subscriptions] = Data.mock_subscriptions_array(url: "/v1/customers/#{cus[:id]}/subscriptions") unless cus[:subscriptions]
|
149
|
+
cus[:subscriptions][:count] = (cus[:subscriptions][:count] ? cus[:subscriptions][:count]+1 : 1 )
|
150
|
+
cus[:subscriptions][:data] << subscription
|
151
|
+
subscription
|
152
|
+
end
|
153
|
+
|
131
154
|
private
|
132
155
|
|
133
156
|
def assert_existance(type, id, obj, message=nil)
|
@@ -4,8 +4,6 @@ module StripeMock
|
|
4
4
|
|
5
5
|
def Customers.included(klass)
|
6
6
|
klass.add_handler 'post /v1/customers', :new_customer
|
7
|
-
klass.add_handler 'post /v1/customers/(.*)/subscription', :update_subscription
|
8
|
-
klass.add_handler 'delete /v1/customers/(.*)/subscription', :cancel_subscription
|
9
7
|
klass.add_handler 'post /v1/customers/(.*)', :update_customer
|
10
8
|
klass.add_handler 'get /v1/customers/(.*)', :get_customer
|
11
9
|
klass.add_handler 'delete /v1/customers/(.*)', :delete_customer
|
@@ -20,6 +18,9 @@ module StripeMock
|
|
20
18
|
params[:default_card] = cards.first[:id]
|
21
19
|
end
|
22
20
|
|
21
|
+
params[:subscriptions] = Data.mock_subscriptions_array(url: "/v1/customers/#{params[:id]}/subscriptions")
|
22
|
+
customers[ params[:id] ] = Data.mock_customer(cards, params)
|
23
|
+
|
23
24
|
if params[:plan]
|
24
25
|
plan = plans[ params[:plan] ]
|
25
26
|
assert_existance :plan, params[:plan], plan
|
@@ -28,63 +29,10 @@ module StripeMock
|
|
28
29
|
raise Stripe::InvalidRequestError.new('You must supply a valid card', nil, 400)
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
|
-
params[:subscription] = sub
|
33
|
-
end
|
34
|
-
|
35
|
-
customers[ params[:id] ] = Data.mock_customer(cards, params)
|
36
|
-
end
|
37
|
-
|
38
|
-
def update_subscription(route, method_url, params, headers)
|
39
|
-
route =~ method_url
|
40
|
-
|
41
|
-
customer = customers[$1]
|
42
|
-
assert_existance :customer, $1, customer
|
43
|
-
|
44
|
-
plan_id = params.delete(:plan)
|
45
|
-
plan = plans[plan_id]
|
46
|
-
assert_existance :plan, plan_id, plan
|
47
|
-
|
48
|
-
if params[:card]
|
49
|
-
new_card = get_card_by_token(params.delete(:card))
|
50
|
-
add_card_to_customer(new_card, customer)
|
51
|
-
customer[:default_card] = new_card[:id]
|
52
|
-
end
|
53
|
-
|
54
|
-
# Ensure customer has card to charge if plan has no trial and is not free
|
55
|
-
if customer[:default_card].nil? && plan[:trial_period_days].nil? && plan[:amount] != 0
|
56
|
-
raise Stripe::InvalidRequestError.new('You must supply a valid card', nil, 400)
|
57
|
-
end
|
58
|
-
|
59
|
-
# Update plan data
|
60
|
-
plan.merge!(params)
|
61
|
-
|
62
|
-
sub = Data.mock_subscription id: new_id('su'), plan: plan, customer: $1
|
63
|
-
customer[:subscription] = sub
|
64
|
-
end
|
65
|
-
|
66
|
-
def cancel_subscription(route, method_url, params, headers)
|
67
|
-
route =~ method_url
|
68
|
-
|
69
|
-
customer = customers[$1]
|
70
|
-
assert_existance :customer, $1, customer
|
71
|
-
|
72
|
-
sub = customer[:subscription]
|
73
|
-
assert_existance nil, nil, sub, "No active subscription for customer: #{$1}"
|
74
|
-
|
75
|
-
plan = plans[ sub[:plan][:id] ]
|
76
|
-
assert_existance :plan, params[:plan], plan
|
77
|
-
|
78
|
-
if params[:at_period_end] == true
|
79
|
-
status = 'active'
|
80
|
-
cancel_at_period_end = true
|
81
|
-
else
|
82
|
-
status = 'canceled'
|
83
|
-
cancel_at_period_end = false
|
32
|
+
add_subscription_to_customer(plan, customers[params[:id]] )
|
84
33
|
end
|
85
34
|
|
86
|
-
|
87
|
-
customer[:subscription] = sub
|
35
|
+
customers[ params[:id] ]
|
88
36
|
end
|
89
37
|
|
90
38
|
def update_customer(route, method_url, params, headers)
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module Subscriptions
|
4
|
+
|
5
|
+
def Subscriptions.included(klass)
|
6
|
+
klass.add_handler 'get /v1/customers/(.*)/subscriptions', :retrieve_subscriptions
|
7
|
+
klass.add_handler 'post /v1/customers/(.*)/subscriptions', :create_subscription
|
8
|
+
klass.add_handler 'get /v1/customers/(.*)/subscriptions/(.*)', :retrieve_subscription
|
9
|
+
klass.add_handler 'post /v1/customers/(.*)/subscriptions/(.*)', :update_subscription
|
10
|
+
klass.add_handler 'delete /v1/customers/(.*)/subscriptions/(.*)', :cancel_subscription
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_subscription(route, method_url, params, headers)
|
14
|
+
route =~ method_url
|
15
|
+
|
16
|
+
customer = customers[$1]
|
17
|
+
assert_existance :customer, $1, customer
|
18
|
+
|
19
|
+
plan = plans[params[:plan]]
|
20
|
+
assert_existance :plan, params[:plan], plan
|
21
|
+
|
22
|
+
# Ensure customer has card to charge if plan has no trial and is not free
|
23
|
+
verify_card_present(customer, plan)
|
24
|
+
|
25
|
+
subscription = add_subscription_to_customer(plan, customer)
|
26
|
+
|
27
|
+
# oddly, subscription returned from 'create_subscription' does not expand plan
|
28
|
+
subscription.merge(plan: params[:plan])
|
29
|
+
end
|
30
|
+
|
31
|
+
def retrieve_subscription(route, method_url, params, headers)
|
32
|
+
route =~ method_url
|
33
|
+
|
34
|
+
customer = customers[$1]
|
35
|
+
assert_existance :customer, $1, customer
|
36
|
+
subscription = get_customer_subscription(customer, $2)
|
37
|
+
assert_existance :subscription, $2, subscription
|
38
|
+
|
39
|
+
subscription
|
40
|
+
end
|
41
|
+
|
42
|
+
def retrieve_subscriptions(route, method_url, params, headers)
|
43
|
+
route =~ method_url
|
44
|
+
|
45
|
+
customer = customers[$1]
|
46
|
+
assert_existance :customer, $1, customer
|
47
|
+
|
48
|
+
subscription_list = Data.mock_subscriptions_array url: "/v1/customers/#{customer[:id]}/subscriptions", count: customer[:subscriptions][:data].length
|
49
|
+
customer.subscriptions.each do |subscription|
|
50
|
+
subscription_list[:data] << subscription
|
51
|
+
end
|
52
|
+
subscription_list
|
53
|
+
end
|
54
|
+
|
55
|
+
def update_subscription(route, method_url, params, headers)
|
56
|
+
route =~ method_url
|
57
|
+
|
58
|
+
customer = customers[$1]
|
59
|
+
assert_existance :customer, $1, customer
|
60
|
+
subscription = get_customer_subscription(customer, $2)
|
61
|
+
assert_existance :subscription, $2, subscription
|
62
|
+
|
63
|
+
if params[:card]
|
64
|
+
new_card = get_card_by_token(params.delete(:card))
|
65
|
+
add_card_to_customer(new_card, customer)
|
66
|
+
customer[:default_card] = new_card[:id]
|
67
|
+
end
|
68
|
+
|
69
|
+
# expand the plan for addition to the customer object
|
70
|
+
if params[:plan]
|
71
|
+
plan_name = params[:plan]
|
72
|
+
plan = plans[plan_name]
|
73
|
+
assert_existance :plan, params[:plan], plan
|
74
|
+
params[:plan] = plan
|
75
|
+
end
|
76
|
+
|
77
|
+
# Ensure customer has card to charge if plan has no trial and is not free
|
78
|
+
verify_card_present(customer, plan)
|
79
|
+
|
80
|
+
subscription.merge!(params)
|
81
|
+
|
82
|
+
# delete the old subscription, replace with the new subscription
|
83
|
+
customer[:subscriptions][:data].reject! { |sub| sub[:id] == subscription[:id] }
|
84
|
+
customer[:subscriptions][:data] << subscription
|
85
|
+
|
86
|
+
# oddly, subscription returned from 'create_subscription' does not expand plan
|
87
|
+
subscription.merge(plan: plan_name)
|
88
|
+
end
|
89
|
+
|
90
|
+
def cancel_subscription(route, method_url, params, headers)
|
91
|
+
route =~ method_url
|
92
|
+
|
93
|
+
customer = customers[$1]
|
94
|
+
assert_existance :customer, $1, customer
|
95
|
+
subscription = get_customer_subscription(customer, $2)
|
96
|
+
assert_existance :subscription, $2, subscription
|
97
|
+
|
98
|
+
cancel_params = { canceled_at: Time.now.to_i }
|
99
|
+
if params[:at_period_end] == true
|
100
|
+
cancel_params[:cancel_at_period_end] = true
|
101
|
+
else
|
102
|
+
cancel_params[:status] = "canceled"
|
103
|
+
cancel_params[:cancel_at_period_end] = false
|
104
|
+
cancel_params[:ended_at] = Time.now.to_i
|
105
|
+
end
|
106
|
+
|
107
|
+
subscription.merge!(cancel_params)
|
108
|
+
|
109
|
+
customer[:subscriptions][:data].reject!{|sub|
|
110
|
+
sub[:id] == subscription[:id]
|
111
|
+
}
|
112
|
+
|
113
|
+
customer[:subscriptions][:data] << subscription
|
114
|
+
subscription
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def verify_card_present(customer, plan)
|
120
|
+
if customer[:default_card].nil? && plan[:trial_period_days].nil? && plan[:amount] != 0
|
121
|
+
raise Stripe::InvalidRequestError.new('You must supply a valid card', nil, 400)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/stripe_mock/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"created": 1326853478,
|
3
|
+
"livemode": false,
|
4
|
+
"id": "evt_00000000000000",
|
5
|
+
"type": "customer.card.created",
|
6
|
+
"object": "event",
|
7
|
+
"data": {
|
8
|
+
"object": {
|
9
|
+
"id": "card_VALID",
|
10
|
+
"object": "card",
|
11
|
+
"last4": "4242",
|
12
|
+
"type": "Visa",
|
13
|
+
"exp_month": 3,
|
14
|
+
"exp_year": 2020,
|
15
|
+
"fingerprint": "wXWJT135mEK107G8",
|
16
|
+
"customer": "cus_VALID",
|
17
|
+
"country": "US",
|
18
|
+
"name": "Testy Tester",
|
19
|
+
"address_line1": null,
|
20
|
+
"address_line2": null,
|
21
|
+
"address_city": null,
|
22
|
+
"address_state": null,
|
23
|
+
"address_zip": null,
|
24
|
+
"address_country": null,
|
25
|
+
"cvc_check": "pass",
|
26
|
+
"address_line1_check": null,
|
27
|
+
"address_zip_check": null
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"created": 1326853478,
|
3
|
+
"livemode": false,
|
4
|
+
"id": "evt_00000000000000",
|
5
|
+
"type": "customer.card.deleted",
|
6
|
+
"object": "event",
|
7
|
+
"data": {
|
8
|
+
"object": {
|
9
|
+
"id": "card_VALID",
|
10
|
+
"object": "card",
|
11
|
+
"last4": "4242",
|
12
|
+
"type": "Visa",
|
13
|
+
"exp_month": 3,
|
14
|
+
"exp_year": 2020,
|
15
|
+
"fingerprint": "wXWJT135mEK107G8",
|
16
|
+
"customer": "cus_VALID",
|
17
|
+
"country": "US",
|
18
|
+
"name": "Testy Tester",
|
19
|
+
"address_line1": null,
|
20
|
+
"address_line2": null,
|
21
|
+
"address_city": null,
|
22
|
+
"address_state": null,
|
23
|
+
"address_zip": null,
|
24
|
+
"address_country": null,
|
25
|
+
"cvc_check": "pass",
|
26
|
+
"address_line1_check": null,
|
27
|
+
"address_zip_check": null
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
{
|
2
|
+
"created": 1326853478,
|
3
|
+
"livemode": false,
|
4
|
+
"id": "evt_00000000000000",
|
5
|
+
"type": "customer.card.updated",
|
6
|
+
"object": "event",
|
7
|
+
"data": {
|
8
|
+
"object": {
|
9
|
+
"id": "card_VALID",
|
10
|
+
"object": "card",
|
11
|
+
"last4": "4242",
|
12
|
+
"type": "Visa",
|
13
|
+
"exp_month": 3,
|
14
|
+
"exp_year": 2020,
|
15
|
+
"fingerprint": "wXWJT135mEK107G8",
|
16
|
+
"customer": "cus_VALID",
|
17
|
+
"country": "US",
|
18
|
+
"name": "Testy Tester",
|
19
|
+
"address_line1": null,
|
20
|
+
"address_line2": null,
|
21
|
+
"address_city": null,
|
22
|
+
"address_state": null,
|
23
|
+
"address_zip": null,
|
24
|
+
"address_country": null,
|
25
|
+
"cvc_check": "pass",
|
26
|
+
"address_line1_check": null,
|
27
|
+
"address_zip_check": null
|
28
|
+
},
|
29
|
+
"previous_attributes":
|
30
|
+
{
|
31
|
+
"name": "Testy Tester Jr."
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
@@ -11,7 +11,9 @@
|
|
11
11
|
"period_start": 1378082075,
|
12
12
|
"period_end": 1380674075,
|
13
13
|
"lines": {
|
14
|
-
"
|
14
|
+
"invoiceitems": [],
|
15
|
+
"prorations": [],
|
16
|
+
"subscriptions": [
|
15
17
|
{
|
16
18
|
"id": "su_2hksGtIPylSBg2",
|
17
19
|
"object": "line_item",
|
@@ -38,10 +40,7 @@
|
|
38
40
|
},
|
39
41
|
"description": null
|
40
42
|
}
|
41
|
-
]
|
42
|
-
"count": 1,
|
43
|
-
"object": "list",
|
44
|
-
"url": "/v1/invoices/in_2fzcb1D7guR4IE/lines"
|
43
|
+
]
|
45
44
|
},
|
46
45
|
"subtotal": 1000,
|
47
46
|
"total": 1000,
|
@@ -11,7 +11,9 @@
|
|
11
11
|
"period_start": 1378082075,
|
12
12
|
"period_end": 1380674075,
|
13
13
|
"lines": {
|
14
|
-
"
|
14
|
+
"invoiceitems": [],
|
15
|
+
"prorations": [],
|
16
|
+
"subscriptions": [
|
15
17
|
{
|
16
18
|
"id": "su_2hkslKrnt23NBz",
|
17
19
|
"object": "line_item",
|
@@ -38,10 +40,7 @@
|
|
38
40
|
},
|
39
41
|
"description": null
|
40
42
|
}
|
41
|
-
]
|
42
|
-
"count": 1,
|
43
|
-
"object": "list",
|
44
|
-
"url": "/v1/invoices/in_2fzcb1D7guR4IE/lines"
|
43
|
+
]
|
45
44
|
},
|
46
45
|
"subtotal": 1000,
|
47
46
|
"total": 1000,
|
@@ -11,7 +11,9 @@
|
|
11
11
|
"period_start": 1378082075,
|
12
12
|
"period_end": 1380674075,
|
13
13
|
"lines": {
|
14
|
-
"
|
14
|
+
"invoiceitems": [],
|
15
|
+
"prorations": [],
|
16
|
+
"subscriptions": [
|
15
17
|
{
|
16
18
|
"id": "su_2hkscimMTuAjFP",
|
17
19
|
"object": "line_item",
|
@@ -38,10 +40,7 @@
|
|
38
40
|
},
|
39
41
|
"description": null
|
40
42
|
}
|
41
|
-
]
|
42
|
-
"count": 1,
|
43
|
-
"object": "list",
|
44
|
-
"url": "/v1/invoices/in_2fzcb1D7guR4IE/lines"
|
43
|
+
]
|
45
44
|
},
|
46
45
|
"subtotal": 1000,
|
47
46
|
"total": 1000,
|
@@ -11,7 +11,9 @@
|
|
11
11
|
"period_start": 1378082075,
|
12
12
|
"period_end": 1380674075,
|
13
13
|
"lines": {
|
14
|
-
"
|
14
|
+
"invoiceitems": [],
|
15
|
+
"prorations": [],
|
16
|
+
"subscriptions": [
|
15
17
|
{
|
16
18
|
"id": "su_2hkskhhOSfPr47",
|
17
19
|
"object": "line_item",
|
@@ -38,10 +40,7 @@
|
|
38
40
|
},
|
39
41
|
"description": null
|
40
42
|
}
|
41
|
-
]
|
42
|
-
"count": 1,
|
43
|
-
"object": "list",
|
44
|
-
"url": "/v1/invoices/in_2fzcb1D7guR4IE/lines"
|
43
|
+
]
|
45
44
|
},
|
46
45
|
"subtotal": 1000,
|
47
46
|
"total": 1000,
|
@@ -62,9 +61,7 @@
|
|
62
61
|
"application_fee": null
|
63
62
|
},
|
64
63
|
"previous_attributes": {
|
65
|
-
"lines": [
|
66
|
-
|
67
|
-
]
|
64
|
+
"lines": []
|
68
65
|
}
|
69
66
|
}
|
70
67
|
}
|
@@ -39,9 +39,12 @@ shared_examples 'Customer API' do
|
|
39
39
|
customer = Stripe::Customer.create(id: 'test_cus_plan', card: 'tk', :plan => 'silver')
|
40
40
|
|
41
41
|
customer = Stripe::Customer.retrieve('test_cus_plan')
|
42
|
-
expect(customer.
|
43
|
-
expect(customer.
|
44
|
-
|
42
|
+
expect(customer.subscriptions.count).to eq(1)
|
43
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
44
|
+
|
45
|
+
expect(customer.subscriptions).to_not be_nil
|
46
|
+
expect(customer.subscriptions.first.plan.id).to eq('silver')
|
47
|
+
expect(customer.subscriptions.first.customer).to eq(customer.id)
|
45
48
|
end
|
46
49
|
|
47
50
|
it 'cannot create a customer with a plan that does not exist' do
|
@@ -90,7 +93,8 @@ shared_examples 'Customer API' do
|
|
90
93
|
expect(customer.id).to eq(original.id)
|
91
94
|
expect(customer.email).to eq(original.email)
|
92
95
|
expect(customer.default_card).to eq(original.default_card)
|
93
|
-
expect(customer.
|
96
|
+
expect(customer.subscriptions.count).to eq(0)
|
97
|
+
expect(customer.subscriptions.data).to be_empty
|
94
98
|
end
|
95
99
|
|
96
100
|
it "cannot retrieve a customer that doesn't exist" do
|
@@ -2,130 +2,344 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
shared_examples 'Customer Subscriptions' do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
context "creating a new subscription" do
|
6
|
+
it "adds a new subscription to customer with none" do
|
7
|
+
plan = Stripe::Plan.create(id: 'silver', name: 'Silver Plan', amount: 4999)
|
8
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk')
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
10
|
+
expect(customer.subscriptions.data).to be_empty
|
11
|
+
expect(customer.subscriptions.count).to eq(0)
|
13
12
|
|
14
|
-
|
15
|
-
expect(customer.subscription).to_not be_nil
|
16
|
-
expect(customer.subscription.id).to eq(sub.id)
|
17
|
-
expect(customer.subscription.plan.id).to eq('silver')
|
18
|
-
expect(customer.subscription.customer).to eq(customer.id)
|
19
|
-
end
|
13
|
+
sub = customer.subscriptions.create({ :plan => 'silver' })
|
20
14
|
|
21
|
-
|
22
|
-
|
23
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub2', card: 'tk')
|
24
|
-
sub = customer.update_subscription({ :plan => 'copper', :quantity => 3 })
|
15
|
+
expect(sub.object).to eq('subscription')
|
16
|
+
expect(sub.plan).to eq('silver')
|
25
17
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
18
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
19
|
+
expect(customer.subscriptions.data).to_not be_empty
|
20
|
+
expect(customer.subscriptions.count).to eq(1)
|
21
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
30
22
|
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
24
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
25
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
34
26
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
27
|
+
end
|
28
|
+
|
29
|
+
it "adds additional subscription to customer with existing subscription" do
|
30
|
+
silver = Stripe::Plan.create(id: 'silver')
|
31
|
+
gold = Stripe::Plan.create(id: 'gold')
|
32
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: 'gold')
|
33
|
+
|
34
|
+
sub = customer.subscriptions.create({ :plan => 'silver' })
|
35
|
+
|
36
|
+
expect(sub.object).to eq('subscription')
|
37
|
+
expect(sub.plan).to eq('silver')
|
38
|
+
|
39
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
40
|
+
expect(customer.subscriptions.data).to_not be_empty
|
41
|
+
expect(customer.subscriptions.count).to eq(2)
|
42
|
+
expect(customer.subscriptions.data.length).to eq(2)
|
43
|
+
|
44
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gold.to_hash)
|
45
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
46
|
+
|
47
|
+
expect(customer.subscriptions.data.last.id).to eq(sub.id)
|
48
|
+
expect(customer.subscriptions.data.last.plan.to_hash).to eq(silver.to_hash)
|
49
|
+
expect(customer.subscriptions.data.last.customer).to eq(customer.id)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "throws an error when plan does not exist" do
|
53
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
54
|
+
|
55
|
+
expect { customer.subscriptions.create({ :plan => 'gazebo' }) }.to raise_error {|e|
|
56
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
57
|
+
expect(e.http_status).to eq(404)
|
58
|
+
expect(e.message).to_not be_nil
|
59
|
+
}
|
60
|
+
|
61
|
+
expect(customer.subscriptions.data).to be_empty
|
62
|
+
expect(customer.subscriptions.count).to eq(0)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "throws an error when subscribing a customer with no card" do
|
66
|
+
plan = Stripe::Plan.create(id: 'enterprise', amount: 499)
|
67
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
68
|
+
|
69
|
+
expect { customer.subscriptions.create({ :plan => 'enterprise' }) }.to raise_error {|e|
|
70
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
71
|
+
expect(e.http_status).to eq(400)
|
72
|
+
expect(e.message).to_not be_nil
|
73
|
+
}
|
74
|
+
|
75
|
+
expect(customer.subscriptions.data).to be_empty
|
76
|
+
expect(customer.subscriptions.count).to eq(0)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "subscribes a customer with no card to a plan with a free trial" do
|
80
|
+
plan = Stripe::Plan.create(id: 'trial', amount: 999, trial_period_days: 14)
|
81
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
41
82
|
|
42
|
-
|
43
|
-
plan = Stripe::Plan.create(id: 'free_tier', amount: 0)
|
44
|
-
customer = Stripe::Customer.create(id: 'cardless')
|
45
|
-
sub = customer.update_subscription({ :plan => 'free_tier' })
|
83
|
+
sub = customer.subscriptions.create({ :plan => 'trial' })
|
46
84
|
|
47
|
-
|
48
|
-
|
49
|
-
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
85
|
+
expect(sub.object).to eq('subscription')
|
86
|
+
expect(sub.plan).to eq('trial')
|
50
87
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
88
|
+
customer = Stripe::Customer.retrieve('cardless')
|
89
|
+
expect(customer.subscriptions.data).to_not be_empty
|
90
|
+
expect(customer.subscriptions.count).to eq(1)
|
91
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
92
|
+
|
93
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
94
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
95
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "subscribes a customer with no card to a free plan" do
|
99
|
+
plan = Stripe::Plan.create(id: 'free_tier', amount: 0)
|
100
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
101
|
+
|
102
|
+
sub = customer.subscriptions.create({ :plan => 'free_tier' })
|
103
|
+
|
104
|
+
expect(sub.object).to eq('subscription')
|
105
|
+
expect(sub.plan).to eq('free_tier')
|
106
|
+
|
107
|
+
customer = Stripe::Customer.retrieve('cardless')
|
108
|
+
expect(customer.subscriptions.data).to_not be_empty
|
109
|
+
expect(customer.subscriptions.count).to eq(1)
|
110
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
111
|
+
|
112
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
113
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
114
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
115
|
+
end
|
56
116
|
end
|
57
117
|
|
58
|
-
|
59
|
-
|
60
|
-
customer
|
61
|
-
|
118
|
+
context "updating a subscription" do
|
119
|
+
|
120
|
+
it "updates a stripe customer's existing subscription" do
|
121
|
+
silver = Stripe::Plan.create(id: 'silver')
|
122
|
+
gold = Stripe::Plan.create(id: 'gold')
|
123
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: 'silver')
|
124
|
+
|
125
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
126
|
+
sub.plan = 'gold'
|
127
|
+
sub.save
|
128
|
+
|
129
|
+
expect(sub.object).to eq('subscription')
|
130
|
+
expect(sub.plan).to eq('gold')
|
131
|
+
|
132
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
133
|
+
expect(customer.subscriptions.data).to_not be_empty
|
134
|
+
expect(customer.subscriptions.count).to eq(1)
|
135
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
136
|
+
|
137
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
138
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gold.to_hash)
|
139
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "throws an error when plan does not exist" do
|
143
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
144
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
145
|
+
|
146
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
147
|
+
sub.plan = 'gazebo'
|
148
|
+
|
149
|
+
expect { sub.save }.to raise_error {|e|
|
150
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
151
|
+
expect(e.http_status).to eq(404)
|
152
|
+
expect(e.message).to_not be_nil
|
153
|
+
}
|
154
|
+
|
155
|
+
customer = Stripe::Customer.retrieve('cardless')
|
156
|
+
expect(customer.subscriptions.count).to eq(1)
|
157
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
158
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "throws an error when subscription does not exist" do
|
162
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
163
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
164
|
+
|
165
|
+
expect { customer.subscriptions.retrieve("gazebo") }.to raise_error {|e|
|
166
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
167
|
+
expect(e.http_status).to eq(404)
|
168
|
+
expect(e.message).to_not be_nil
|
169
|
+
}
|
62
170
|
|
63
|
-
|
64
|
-
|
65
|
-
|
171
|
+
customer = Stripe::Customer.retrieve('cardless')
|
172
|
+
expect(customer.subscriptions.count).to eq(1)
|
173
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
174
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
175
|
+
end
|
66
176
|
|
67
|
-
customer
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
177
|
+
it "throws an error when updating a customer with no card" do
|
178
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
179
|
+
paid = Stripe::Plan.create(id: 'enterprise', amount: 499)
|
180
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
181
|
+
|
182
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
183
|
+
sub.plan = 'enterprise'
|
184
|
+
|
185
|
+
expect { sub.save }.to raise_error {|e|
|
186
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
187
|
+
expect(e.http_status).to eq(400)
|
188
|
+
expect(e.message).to_not be_nil
|
189
|
+
}
|
190
|
+
|
191
|
+
customer = Stripe::Customer.retrieve('cardless')
|
192
|
+
expect(customer.subscriptions.count).to eq(1)
|
193
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
194
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "updates a customer with no card to a plan with a free trial" do
|
198
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
199
|
+
trial = Stripe::Plan.create(id: 'trial', amount: 999, trial_period_days: 14)
|
200
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
201
|
+
|
202
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
203
|
+
sub.plan = 'trial'
|
204
|
+
sub.save
|
205
|
+
|
206
|
+
expect(sub.object).to eq('subscription')
|
207
|
+
expect(sub.plan).to eq('trial')
|
208
|
+
|
209
|
+
customer = Stripe::Customer.retrieve('cardless')
|
210
|
+
expect(customer.subscriptions.data).to_not be_empty
|
211
|
+
expect(customer.subscriptions.count).to eq(1)
|
212
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
213
|
+
|
214
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
215
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(trial.to_hash)
|
216
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
217
|
+
end
|
218
|
+
|
219
|
+
it "updates a customer with no card to a free plan" do
|
220
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
221
|
+
gratis = Stripe::Plan.create(id: 'gratis', amount: 0)
|
222
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
223
|
+
|
224
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
225
|
+
sub.plan = 'gratis'
|
226
|
+
sub.save
|
227
|
+
|
228
|
+
expect(sub.object).to eq('subscription')
|
229
|
+
expect(sub.plan).to eq('gratis')
|
230
|
+
|
231
|
+
customer = Stripe::Customer.retrieve('cardless')
|
232
|
+
expect(customer.subscriptions.data).to_not be_empty
|
233
|
+
expect(customer.subscriptions.count).to eq(1)
|
234
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
235
|
+
|
236
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
237
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gratis.to_hash)
|
238
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
239
|
+
end
|
240
|
+
|
241
|
+
it "sets a card when updating a customer's subscription" do
|
242
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
243
|
+
paid = Stripe::Plan.create(id: 'paid', amount: 499)
|
244
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', plan: 'free')
|
245
|
+
|
246
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
247
|
+
sub.plan = 'paid'
|
248
|
+
sub.card = 'tk'
|
249
|
+
sub.save
|
250
|
+
|
251
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
252
|
+
|
253
|
+
expect(customer.cards.count).to eq(1)
|
254
|
+
expect(customer.cards.data.length).to eq(1)
|
255
|
+
expect(customer.default_card).to_not be_nil
|
256
|
+
expect(customer.default_card).to eq customer.cards.data.first.id
|
257
|
+
end
|
72
258
|
end
|
73
259
|
|
74
|
-
|
75
|
-
Stripe::Plan.create(id: 'the truth')
|
76
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk')
|
77
|
-
sub = customer.update_subscription({ :plan => 'the truth' })
|
260
|
+
context "cancelling a subscription" do
|
78
261
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
expect(result.id).to eq(sub.id)
|
262
|
+
it "cancels a stripe customer's subscription" do
|
263
|
+
truth = Stripe::Plan.create(id: 'the truth')
|
264
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: "the truth")
|
83
265
|
|
84
|
-
|
85
|
-
|
86
|
-
|
266
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
267
|
+
result = sub.delete()
|
268
|
+
|
269
|
+
expect(result.status).to eq('canceled')
|
270
|
+
expect(result.cancel_at_period_end).to be_false
|
271
|
+
expect(result.id).to eq(sub.id)
|
272
|
+
|
273
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
274
|
+
expect(customer.subscriptions.data).to_not be_empty
|
275
|
+
expect(customer.subscriptions.count).to eq(1)
|
276
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
277
|
+
|
278
|
+
expect(customer.subscriptions.data.first.status).to eq('canceled')
|
279
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to be_false
|
280
|
+
expect(customer.subscriptions.data.first.ended_at).to_not be_nil
|
281
|
+
expect(customer.subscriptions.data.first.canceled_at).to_not be_nil
|
282
|
+
end
|
283
|
+
|
284
|
+
it "cancels a stripe customer's subscription at period end" do
|
285
|
+
truth = Stripe::Plan.create(id: 'the_truth')
|
286
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: "the_truth")
|
287
|
+
|
288
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
289
|
+
result = sub.delete(at_period_end: true)
|
290
|
+
|
291
|
+
expect(result.status).to eq('active')
|
292
|
+
expect(result.cancel_at_period_end).to be_true
|
293
|
+
expect(result.id).to eq(sub.id)
|
294
|
+
|
295
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
296
|
+
expect(customer.subscriptions.data).to_not be_empty
|
297
|
+
expect(customer.subscriptions.count).to eq(1)
|
298
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
299
|
+
|
300
|
+
expect(customer.subscriptions.data.first.status).to eq('active')
|
301
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to be_true
|
302
|
+
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
303
|
+
expect(customer.subscriptions.data.first.canceled_at).to_not be_nil
|
304
|
+
end
|
87
305
|
end
|
88
306
|
|
89
|
-
it "
|
90
|
-
Stripe::Plan.create(id: '
|
91
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk')
|
92
|
-
|
307
|
+
it "doesn't change status of subscription when cancelling at period end" do
|
308
|
+
trial = Stripe::Plan.create(id: 'trial', trial_period_days: 14)
|
309
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: "trial")
|
310
|
+
|
311
|
+
sub = customer.subscriptions.retrieve(customer.subscriptions.data.first.id)
|
312
|
+
result = sub.delete(at_period_end: true)
|
93
313
|
|
94
|
-
result
|
95
|
-
expect(result.status).to eq('active')
|
96
|
-
expect(result.cancel_at_period_end).to be_true
|
97
|
-
expect(result.id).to eq(sub.id)
|
314
|
+
expect(result.status).to eq('trialing')
|
98
315
|
|
99
316
|
customer = Stripe::Customer.retrieve('test_customer_sub')
|
100
|
-
expect(customer.subscription).to_not be_nil
|
101
|
-
expect(customer.subscription.id).to eq(result.id)
|
102
|
-
end
|
103
317
|
|
104
|
-
|
105
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub')
|
106
|
-
expect {
|
107
|
-
customer.update_subscription(plan: 'imagination')
|
108
|
-
}.to raise_error Stripe::InvalidRequestError
|
318
|
+
expect(customer.subscriptions.data.first.status).to eq('trialing')
|
109
319
|
end
|
110
320
|
|
111
|
-
|
112
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub')
|
113
|
-
expect {
|
114
|
-
customer.cancel_subscription(plan: 'imagination')
|
115
|
-
}.to raise_error Stripe::InvalidRequestError
|
116
|
-
end
|
321
|
+
context "retrieve multiple subscriptions" do
|
117
322
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
323
|
+
it "retrieves a list of multiple subscriptions" do
|
324
|
+
free = Stripe::Plan.create(id: 'free', amount: 0)
|
325
|
+
paid = Stripe::Plan.create(id: 'paid', amount: 499)
|
326
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', card: 'tk', plan: "free")
|
327
|
+
customer.subscriptions.create({ :plan => 'paid' })
|
122
328
|
|
123
|
-
|
329
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
330
|
+
|
331
|
+
list = customer.subscriptions
|
332
|
+
|
333
|
+
expect(list.object).to eq("list")
|
334
|
+
expect(list.count).to eq(2)
|
335
|
+
expect(list.data.length).to eq(2)
|
336
|
+
|
337
|
+
expect(list.data.first.object).to eq("subscription")
|
338
|
+
expect(list.data.first.plan.to_hash).to eq(free.to_hash)
|
124
339
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
expect(customer.default_card).to eq customer.cards.data.first.id
|
340
|
+
expect(list.data.last.object).to eq("subscription")
|
341
|
+
expect(list.data.last.plan.to_hash).to eq(paid.to_hash)
|
342
|
+
end
|
129
343
|
end
|
130
344
|
|
131
345
|
end
|
@@ -81,18 +81,18 @@ shared_examples 'Webhook Events API' do
|
|
81
81
|
it "takes a hash and deep merges arrays in the data object" do
|
82
82
|
event = StripeMock.mock_webhook_event('invoice.created', {
|
83
83
|
:lines => {
|
84
|
-
:
|
84
|
+
:subscriptions => [
|
85
85
|
{ :amount => 555,
|
86
86
|
:plan => { :id => 'wh_test' }
|
87
87
|
}
|
88
88
|
]
|
89
89
|
}
|
90
90
|
})
|
91
|
-
expect(event.data.object.lines.
|
92
|
-
expect(event.data.object.lines.
|
91
|
+
expect(event.data.object.lines.subscriptions.first.amount).to eq(555)
|
92
|
+
expect(event.data.object.lines.subscriptions.first.plan.id).to eq('wh_test')
|
93
93
|
# Ensure data from invoice.created.json is still present
|
94
|
-
expect(event.data.object.lines.
|
95
|
-
expect(event.data.object.lines.
|
94
|
+
expect(event.data.object.lines.subscriptions.first.type).to eq('subscription')
|
95
|
+
expect(event.data.object.lines.subscriptions.first.plan.currency).to eq('usd')
|
96
96
|
end
|
97
97
|
|
98
98
|
it "can generate all events" do
|
@@ -20,11 +20,11 @@ def it_behaves_like_stripe(&block)
|
|
20
20
|
it_behaves_like 'Card API', &block
|
21
21
|
it_behaves_like 'Charge API', &block
|
22
22
|
it_behaves_like 'Customer API', &block
|
23
|
-
it_behaves_like 'Customer Subscriptions', &block
|
24
23
|
it_behaves_like 'Invoice API', &block
|
25
24
|
it_behaves_like 'Invoice Item API', &block
|
26
25
|
it_behaves_like 'Plan API', &block
|
27
26
|
it_behaves_like 'Recipient API', &block
|
28
27
|
it_behaves_like 'Stripe Error Mocking', &block
|
28
|
+
it_behaves_like 'Customer Subscriptions', &block
|
29
29
|
it_behaves_like 'Webhook Events API', &block
|
30
30
|
end
|
data/stripe-ruby-mock.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
|
-
gem.add_dependency 'stripe', '>= 1.
|
20
|
+
gem.add_dependency 'stripe', '>= 1.10.1'
|
21
21
|
gem.add_dependency 'jimson-temp'
|
22
22
|
gem.add_dependency 'dante', '>= 0.2.0'
|
23
23
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stripe-ruby-mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: stripe
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.
|
21
|
+
version: 1.10.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.
|
29
|
+
version: 1.10.1
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: jimson-temp
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- lib/stripe_mock/request_handlers/invoices.rb
|
152
152
|
- lib/stripe_mock/request_handlers/plans.rb
|
153
153
|
- lib/stripe_mock/request_handlers/recipients.rb
|
154
|
+
- lib/stripe_mock/request_handlers/subscriptions.rb
|
154
155
|
- lib/stripe_mock/request_handlers/tokens.rb
|
155
156
|
- lib/stripe_mock/server.rb
|
156
157
|
- lib/stripe_mock/util.rb
|
@@ -166,6 +167,9 @@ files:
|
|
166
167
|
- lib/stripe_mock/webhook_fixtures/charge.succeeded.json
|
167
168
|
- lib/stripe_mock/webhook_fixtures/coupon.created.json
|
168
169
|
- lib/stripe_mock/webhook_fixtures/coupon.deleted.json
|
170
|
+
- lib/stripe_mock/webhook_fixtures/customer.card.created.json
|
171
|
+
- lib/stripe_mock/webhook_fixtures/customer.card.deleted.json
|
172
|
+
- lib/stripe_mock/webhook_fixtures/customer.card.updated.json
|
169
173
|
- lib/stripe_mock/webhook_fixtures/customer.created.json
|
170
174
|
- lib/stripe_mock/webhook_fixtures/customer.deleted.json
|
171
175
|
- lib/stripe_mock/webhook_fixtures/customer.discount.created.json
|