stripe-ruby-mock 2.0.5 → 2.1.0
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 +7 -0
- data/README.md +13 -3
- data/lib/stripe_mock.rb +1 -0
- data/lib/stripe_mock/data.rb +19 -10
- data/lib/stripe_mock/instance.rb +1 -0
- data/lib/stripe_mock/request_handlers/cards.rb +0 -37
- data/lib/stripe_mock/request_handlers/charges.rb +4 -4
- data/lib/stripe_mock/request_handlers/customers.rb +9 -9
- data/lib/stripe_mock/request_handlers/helpers/card_helpers.rb +21 -11
- data/lib/stripe_mock/request_handlers/sources.rb +46 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +7 -7
- data/lib/stripe_mock/request_handlers/tokens.rb +4 -4
- data/lib/stripe_mock/version.rb +1 -1
- data/spec/integration_examples/charge_token_examples.rb +12 -12
- data/spec/integration_examples/customer_card_examples.rb +10 -10
- data/spec/readme_spec.rb +2 -2
- data/spec/shared_stripe_examples/card_examples.rb +36 -36
- data/spec/shared_stripe_examples/card_token_examples.rb +13 -13
- data/spec/shared_stripe_examples/charge_examples.rb +13 -12
- data/spec/shared_stripe_examples/customer_examples.rb +30 -30
- data/spec/shared_stripe_examples/invoice_examples.rb +1 -1
- data/spec/shared_stripe_examples/subscription_examples.rb +23 -23
- data/spec/shared_stripe_examples/transfer_examples.rb +1 -0
- data/stripe-ruby-mock.gemspec +1 -1
- metadata +18 -31
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 78209961f8a5b11ad4a2146246a6162b534af59e
|
4
|
+
data.tar.gz: 3192d4420c6f44537422804b4b60fb479584f6db
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fcec4c716ccd97608cb2e81c001baf9e174cc32e29d7578dd1ff5cb2eff1b412ba74299c5e0ae913e4f4fab01951cc3ea3f7f2927f040c6eca9b62891f30ad3a
|
7
|
+
data.tar.gz: 4a643be3f0acca2ad89dfc44dc76484df58c400f0bfcafca62338a0095dafdd4d7f5104ed9fa200d1cd6321db6dab616032bdbb6c6c8a88bb33f60117f510664
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
In your gemfile:
|
10
10
|
|
11
|
-
gem 'stripe-ruby-mock', '~> 2.0
|
11
|
+
gem 'stripe-ruby-mock', '~> 2.1.0', :require => 'stripe_mock'
|
12
12
|
|
13
13
|
## Features
|
14
14
|
|
@@ -19,9 +19,19 @@ In your gemfile:
|
|
19
19
|
|
20
20
|
### Specifications
|
21
21
|
|
22
|
-
**STRIPE API TARGET VERSION:**
|
22
|
+
**STRIPE API TARGET VERSION:** 2015-02-18 (master)
|
23
23
|
|
24
|
-
|
24
|
+
Older API version branches:
|
25
|
+
|
26
|
+
- [api-2014-06-17](https://github.com/rebelidealist/stripe-ruby-mock/tree/api-2014-06-17)
|
27
|
+
|
28
|
+
### Versioning System
|
29
|
+
|
30
|
+
Since StripeMock tries to keep up with Stripe's API version, its version system is a little different:
|
31
|
+
|
32
|
+
- The **major** number (1.x.x) is for breaking changes involving how you use StripeMock itself
|
33
|
+
- The **minor** number (x.1.x) is for breaking changes involving Stripe's API
|
34
|
+
- The **patch** number (x.x.0) is for non-breaking changes/fixes involving Stripe's API, or for non-breaking changes/fixes/features for StripeMock itself.
|
25
35
|
|
26
36
|
## Description
|
27
37
|
|
data/lib/stripe_mock.rb
CHANGED
@@ -43,6 +43,7 @@ require 'stripe_mock/request_handlers/validators/param_validators.rb'
|
|
43
43
|
|
44
44
|
require 'stripe_mock/request_handlers/charges.rb'
|
45
45
|
require 'stripe_mock/request_handlers/cards.rb'
|
46
|
+
require 'stripe_mock/request_handlers/sources.rb'
|
46
47
|
require 'stripe_mock/request_handlers/customers.rb'
|
47
48
|
require 'stripe_mock/request_handlers/coupons.rb'
|
48
49
|
require 'stripe_mock/request_handlers/events.rb'
|
data/lib/stripe_mock/data.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module StripeMock
|
2
2
|
module Data
|
3
3
|
|
4
|
-
def self.mock_customer(
|
4
|
+
def self.mock_customer(sources, params)
|
5
5
|
cus_id = params[:id] || "test_cus_default"
|
6
|
-
|
6
|
+
sources.each {|source| source[:customer] = cus_id}
|
7
7
|
{
|
8
8
|
email: 'stripe_mock@example.com',
|
9
9
|
description: 'an auto-generated stripe customer data mock',
|
@@ -14,11 +14,11 @@ module StripeMock
|
|
14
14
|
delinquent: false,
|
15
15
|
discount: nil,
|
16
16
|
account_balance: 0,
|
17
|
-
|
17
|
+
sources: {
|
18
18
|
object: "list",
|
19
|
-
total_count:
|
20
|
-
url: "/v1/customers/#{cus_id}/
|
21
|
-
data:
|
19
|
+
total_count: sources.size,
|
20
|
+
url: "/v1/customers/#{cus_id}/sources",
|
21
|
+
data: sources
|
22
22
|
},
|
23
23
|
subscriptions: {
|
24
24
|
object: "list",
|
@@ -26,7 +26,7 @@ module StripeMock
|
|
26
26
|
url: "/v1/customers/#{cus_id}/subscriptions",
|
27
27
|
data: []
|
28
28
|
},
|
29
|
-
|
29
|
+
default_source: nil
|
30
30
|
}.merge(params)
|
31
31
|
end
|
32
32
|
|
@@ -42,9 +42,10 @@ module StripeMock
|
|
42
42
|
currency: "usd",
|
43
43
|
refunded: false,
|
44
44
|
fee: 0,
|
45
|
+
status: 'succeeded',
|
45
46
|
fee_details: [
|
46
47
|
],
|
47
|
-
|
48
|
+
source: {
|
48
49
|
object: "card",
|
49
50
|
last4: "4242",
|
50
51
|
type: "Visa",
|
@@ -199,7 +200,7 @@ module StripeMock
|
|
199
200
|
period_start: 1349738950,
|
200
201
|
lines: {
|
201
202
|
object: "list",
|
202
|
-
|
203
|
+
total_count: lines.count,
|
203
204
|
url: "/v1/invoices/#{in_id}/lines",
|
204
205
|
data: lines
|
205
206
|
},
|
@@ -363,6 +364,7 @@ module StripeMock
|
|
363
364
|
end
|
364
365
|
|
365
366
|
def self.mock_transfer(params={})
|
367
|
+
id = params[:id] || 'tr_test_transfer'
|
366
368
|
{
|
367
369
|
:status => 'pending',
|
368
370
|
:amount => 100,
|
@@ -375,12 +377,19 @@ module StripeMock
|
|
375
377
|
:recipient => 'test_recipient',
|
376
378
|
:fee => 0,
|
377
379
|
:fee_details => [],
|
378
|
-
:id =>
|
380
|
+
:id => id,
|
379
381
|
:livemode => false,
|
380
382
|
:currency => "usd",
|
381
383
|
:object => "transfer",
|
382
384
|
:date => 1304114826,
|
383
385
|
:description => "Transfer description",
|
386
|
+
:reversed => false,
|
387
|
+
:reversals => {
|
388
|
+
:object => "list",
|
389
|
+
:total_count => 0,
|
390
|
+
:has_more => false,
|
391
|
+
:url => "/v1/transfers/#{id}/reversals"
|
392
|
+
},
|
384
393
|
}.merge(params)
|
385
394
|
end
|
386
395
|
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -20,6 +20,7 @@ module StripeMock
|
|
20
20
|
|
21
21
|
include StripeMock::RequestHandlers::Charges
|
22
22
|
include StripeMock::RequestHandlers::Cards
|
23
|
+
include StripeMock::RequestHandlers::Sources
|
23
24
|
include StripeMock::RequestHandlers::Subscriptions # must be before Customers
|
24
25
|
include StripeMock::RequestHandlers::Customers
|
25
26
|
include StripeMock::RequestHandlers::Coupons
|
@@ -3,44 +3,22 @@ module StripeMock
|
|
3
3
|
module Cards
|
4
4
|
|
5
5
|
def Cards.included(klass)
|
6
|
-
klass.add_handler 'get /v1/customers/(.*)/cards', :retrieve_cards
|
7
|
-
klass.add_handler 'post /v1/customers/(.*)/cards', :create_card
|
8
|
-
klass.add_handler 'get /v1/customers/(.*)/cards/(.*)', :retrieve_card
|
9
|
-
klass.add_handler 'delete /v1/customers/(.*)/cards/(.*)', :delete_card
|
10
|
-
klass.add_handler 'post /v1/customers/(.*)/cards/(.*)', :update_card
|
11
6
|
klass.add_handler 'get /v1/recipients/(.*)/cards', :retrieve_recipient_cards
|
12
7
|
klass.add_handler 'get /v1/recipients/(.*)/cards/(.*)', :retrieve_recipient_card
|
13
8
|
klass.add_handler 'post /v1/recipients/(.*)/cards', :create_recipient_card
|
14
9
|
klass.add_handler 'delete /v1/recipients/(.*)/cards/(.*)', :delete_recipient_card
|
15
10
|
end
|
16
11
|
|
17
|
-
def create_card(route, method_url, params, headers)
|
18
|
-
route =~ method_url
|
19
|
-
add_card_to(:customer, $1, params, customers)
|
20
|
-
end
|
21
|
-
|
22
12
|
def create_recipient_card(route, method_url, params, headers)
|
23
13
|
route =~ method_url
|
24
14
|
add_card_to(:recipient, $1, params, recipients)
|
25
15
|
end
|
26
16
|
|
27
|
-
def retrieve_cards(route, method_url, params, headers)
|
28
|
-
route =~ method_url
|
29
|
-
retrieve_object_cards(:customer, $1, customers)
|
30
|
-
end
|
31
|
-
|
32
17
|
def retrieve_recipient_cards(route, method_url, params, headers)
|
33
18
|
route =~ method_url
|
34
19
|
retrieve_object_cards(:recipient, $1, recipients)
|
35
20
|
end
|
36
21
|
|
37
|
-
def retrieve_card(route, method_url, params, headers)
|
38
|
-
route =~ method_url
|
39
|
-
customer = assert_existence :customer, $1, customers[$1]
|
40
|
-
|
41
|
-
assert_existence :card, $2, get_card(customer, $2)
|
42
|
-
end
|
43
|
-
|
44
22
|
def retrieve_recipient_card(route, method_url, params, headers)
|
45
23
|
route =~ method_url
|
46
24
|
recipient = assert_existence :recipient, $1, recipients[$1]
|
@@ -48,25 +26,10 @@ module StripeMock
|
|
48
26
|
assert_existence :card, $2, get_card(recipient, $2, "Recipient")
|
49
27
|
end
|
50
28
|
|
51
|
-
def delete_card(route, method_url, params, headers)
|
52
|
-
route =~ method_url
|
53
|
-
delete_card_from(:customer, $1, $2, customers)
|
54
|
-
end
|
55
|
-
|
56
29
|
def delete_recipient_card(route, method_url, params, headers)
|
57
30
|
route =~ method_url
|
58
31
|
delete_card_from(:recipient, $1, $2, recipients)
|
59
32
|
end
|
60
|
-
|
61
|
-
def update_card(route, method_url, params, headers)
|
62
|
-
route =~ method_url
|
63
|
-
customer = assert_existence :customer, $1, customers[$1]
|
64
|
-
|
65
|
-
card = assert_existence :card, $2, get_card(customer, $2)
|
66
|
-
card.merge!(params)
|
67
|
-
card
|
68
|
-
end
|
69
|
-
|
70
33
|
end
|
71
34
|
end
|
72
35
|
end
|
@@ -14,16 +14,16 @@ module StripeMock
|
|
14
14
|
def new_charge(route, method_url, params, headers)
|
15
15
|
id = new_id('ch')
|
16
16
|
|
17
|
-
if params[:
|
17
|
+
if params[:source] && params[:source].is_a?(String)
|
18
18
|
# if a customer is provided, the card parameter is assumed to be the actual
|
19
19
|
# card id, not a token. in this case we'll find the card in the customer
|
20
20
|
# object and return that.
|
21
21
|
if params[:customer]
|
22
|
-
params[:
|
22
|
+
params[:source] = get_card(customers[params[:customer]], params[:source])
|
23
23
|
else
|
24
|
-
params[:
|
24
|
+
params[:source] = get_card_by_token(params[:source])
|
25
25
|
end
|
26
|
-
elsif params[:
|
26
|
+
elsif params[:source] && params[:source][:id]
|
27
27
|
raise Stripe::InvalidRequestError.new("Invalid token id: #{params[:card]}", 'card', 400)
|
28
28
|
end
|
29
29
|
|
@@ -12,20 +12,20 @@ module StripeMock
|
|
12
12
|
|
13
13
|
def new_customer(route, method_url, params, headers)
|
14
14
|
params[:id] ||= new_id('cus')
|
15
|
-
|
15
|
+
sources = []
|
16
16
|
|
17
|
-
if params[:
|
18
|
-
|
19
|
-
params[:
|
17
|
+
if params[:source]
|
18
|
+
sources << get_card_by_token(params.delete(:source))
|
19
|
+
params[:default_source] = sources.first[:id]
|
20
20
|
end
|
21
21
|
|
22
|
-
customers[ params[:id] ] = Data.mock_customer(
|
22
|
+
customers[ params[:id] ] = Data.mock_customer(sources, params)
|
23
23
|
|
24
24
|
if params[:plan]
|
25
25
|
plan_id = params[:plan].to_s
|
26
26
|
plan = assert_existence :plan, plan_id, plans[plan_id]
|
27
27
|
|
28
|
-
if params[:
|
28
|
+
if params[:default_source].nil? && plan[:trial_period_days].nil? && plan[:amount] != 0
|
29
29
|
raise Stripe::InvalidRequestError.new('You must supply a valid card', nil, 400)
|
30
30
|
end
|
31
31
|
|
@@ -44,10 +44,10 @@ module StripeMock
|
|
44
44
|
cus = assert_existence :customer, $1, customers[$1]
|
45
45
|
cus.merge!(params)
|
46
46
|
|
47
|
-
if params[:
|
48
|
-
new_card = get_card_by_token(params.delete(:
|
47
|
+
if params[:source]
|
48
|
+
new_card = get_card_by_token(params.delete(:source))
|
49
49
|
add_card_to_object(:customer, new_card, cus, true)
|
50
|
-
cus[:
|
50
|
+
cus[:default_source] = new_card[:id]
|
51
51
|
end
|
52
52
|
|
53
53
|
cus
|
@@ -3,7 +3,8 @@ module StripeMock
|
|
3
3
|
module Helpers
|
4
4
|
|
5
5
|
def get_card(object, card_id, class_name='Customer')
|
6
|
-
|
6
|
+
cards = object[:cards] || object[:sources]
|
7
|
+
card = cards[:data].find{|cc| cc[:id] == card_id }
|
7
8
|
if card.nil?
|
8
9
|
msg = "#{class_name} #{object[:id]} does not have card #{card_id}"
|
9
10
|
raise Stripe::InvalidRequestError.new(msg, 'card', 404)
|
@@ -13,23 +14,28 @@ module StripeMock
|
|
13
14
|
|
14
15
|
def add_card_to_object(type, card, object, replace_current=false)
|
15
16
|
card[type] = object[:id]
|
17
|
+
cards_or_sources = object[:cards] || object[:sources]
|
18
|
+
|
19
|
+
is_customer = object.has_key?(:sources)
|
16
20
|
|
17
21
|
if replace_current
|
18
|
-
|
19
|
-
object[:default_card]
|
22
|
+
cards_or_sources[:data].delete_if {|card| card[:id] == object[:default_card]}
|
23
|
+
object[:default_card] = card[:id] unless is_customer
|
24
|
+
object[:default_source] = card[:id] if is_customer
|
20
25
|
else
|
21
|
-
|
26
|
+
cards_or_sources[:total_count] += 1
|
22
27
|
end
|
23
28
|
|
24
|
-
object[:default_card]
|
25
|
-
object[:
|
29
|
+
object[:default_card] = card[:id] if !is_customer && object[:default_card].nil?
|
30
|
+
object[:default_source] = card[:id] if is_customer && object[:default_source].nil?
|
31
|
+
cards_or_sources[:data] << card
|
26
32
|
|
27
33
|
card
|
28
34
|
end
|
29
35
|
|
30
36
|
def retrieve_object_cards(type, type_id, objects)
|
31
37
|
resource = assert_existence type, type_id, objects[type_id]
|
32
|
-
cards = resource[:cards]
|
38
|
+
cards = resource[:cards] || resource[:sources]
|
33
39
|
|
34
40
|
Data.mock_list_object(cards[:data])
|
35
41
|
end
|
@@ -40,17 +46,22 @@ module StripeMock
|
|
40
46
|
assert_existence :card, card_id, get_card(resource, card_id)
|
41
47
|
|
42
48
|
card = { id: card_id, deleted: true }
|
43
|
-
resource[:cards][:
|
49
|
+
cards_or_sources = resource[:cards] || resource[:sources]
|
50
|
+
cards_or_sources[:data].reject!{|cc|
|
44
51
|
cc[:id] == card[:id]
|
45
52
|
}
|
46
|
-
|
53
|
+
|
54
|
+
is_customer = resource.has_key?(:sources)
|
55
|
+
new_default = cards_or_sources[:data].count > 0 ? cards_or_sources[:data].first[:id] : nil
|
56
|
+
resource[:default_card] = new_default unless is_customer
|
57
|
+
resource[:default_source] = new_default if is_customer
|
47
58
|
card
|
48
59
|
end
|
49
60
|
|
50
61
|
def add_card_to(type, type_id, params, objects)
|
51
62
|
resource = assert_existence type, type_id, objects[type_id]
|
52
63
|
|
53
|
-
card = card_from_params(params[:card])
|
64
|
+
card = card_from_params(params[:card] || params[:source])
|
54
65
|
add_card_to_object(type, card, resource)
|
55
66
|
end
|
56
67
|
|
@@ -68,7 +79,6 @@ module StripeMock
|
|
68
79
|
card = get_card_by_token(attrs_or_token)
|
69
80
|
validate_card(card)
|
70
81
|
end
|
71
|
-
|
72
82
|
end
|
73
83
|
end
|
74
84
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module Sources
|
4
|
+
|
5
|
+
def Sources.included(klass)
|
6
|
+
klass.add_handler 'get /v1/customers/(.*)/sources', :retrieve_sources
|
7
|
+
klass.add_handler 'post /v1/customers/(.*)/sources', :create_source
|
8
|
+
klass.add_handler 'get /v1/customers/(.*)/sources/(.*)', :retrieve_source
|
9
|
+
klass.add_handler 'delete /v1/customers/(.*)/sources/(.*)', :delete_source
|
10
|
+
klass.add_handler 'post /v1/customers/(.*)/sources/(.*)', :update_source
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_source(route, method_url, params, headers)
|
14
|
+
route =~ method_url
|
15
|
+
add_card_to(:customer, $1, params, customers)
|
16
|
+
end
|
17
|
+
|
18
|
+
def retrieve_sources(route, method_url, params, headers)
|
19
|
+
route =~ method_url
|
20
|
+
retrieve_object_cards(:customer, $1, customers)
|
21
|
+
end
|
22
|
+
|
23
|
+
def retrieve_source(route, method_url, params, headers)
|
24
|
+
route =~ method_url
|
25
|
+
customer = assert_existence :customer, $1, customers[$1]
|
26
|
+
|
27
|
+
assert_existence :card, $2, get_card(customer, $2)
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_source(route, method_url, params, headers)
|
31
|
+
route =~ method_url
|
32
|
+
delete_card_from(:customer, $1, $2, customers)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_source(route, method_url, params, headers)
|
36
|
+
route =~ method_url
|
37
|
+
customer = assert_existence :customer, $1, customers[$1]
|
38
|
+
|
39
|
+
card = assert_existence :card, $2, get_card(customer, $2)
|
40
|
+
card.merge!(params)
|
41
|
+
card
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -17,10 +17,10 @@ module StripeMock
|
|
17
17
|
plan_id = params[:plan]
|
18
18
|
plan = assert_existence :plan, plan_id, plans[plan_id]
|
19
19
|
|
20
|
-
if params[:
|
21
|
-
new_card = get_card_by_token(params.delete(:
|
20
|
+
if params[:source]
|
21
|
+
new_card = get_card_by_token(params.delete(:source))
|
22
22
|
add_card_to_object(:customer, new_card, customer)
|
23
|
-
customer[:
|
23
|
+
customer[:default_source] = new_card[:id]
|
24
24
|
end
|
25
25
|
|
26
26
|
# Ensure customer has card to charge if plan has no trial and is not free
|
@@ -54,10 +54,10 @@ module StripeMock
|
|
54
54
|
subscription = get_customer_subscription(customer, $2)
|
55
55
|
assert_existence :subscription, $2, subscription
|
56
56
|
|
57
|
-
if params[:
|
58
|
-
new_card = get_card_by_token(params.delete(:
|
57
|
+
if params[:source]
|
58
|
+
new_card = get_card_by_token(params.delete(:source))
|
59
59
|
add_card_to_object(:customer, new_card, customer)
|
60
|
-
customer[:
|
60
|
+
customer[:default_source] = new_card[:id]
|
61
61
|
end
|
62
62
|
|
63
63
|
# expand the plan for addition to the customer object
|
@@ -111,7 +111,7 @@ module StripeMock
|
|
111
111
|
private
|
112
112
|
|
113
113
|
def verify_card_present(customer, plan, params={})
|
114
|
-
if customer[:
|
114
|
+
if customer[:default_source].nil? && plan[:trial_period_days].nil? && plan[:amount] != 0 && plan[:trial_end].nil? && params[:trial_end].nil?
|
115
115
|
raise Stripe::InvalidRequestError.new('You must supply a valid card xoxo', nil, 400)
|
116
116
|
end
|
117
117
|
end
|
@@ -14,12 +14,12 @@ module StripeMock
|
|
14
14
|
|
15
15
|
cus_id = params[:customer]
|
16
16
|
|
17
|
-
if cus_id && params[:
|
17
|
+
if cus_id && params[:source]
|
18
18
|
customer = assert_existence :customer, cus_id, customers[cus_id]
|
19
19
|
|
20
20
|
# params[:card] is an id; grab it from the db
|
21
|
-
customer_card = get_card(customer, params[:
|
22
|
-
assert_existence :card, params[:
|
21
|
+
customer_card = get_card(customer, params[:source])
|
22
|
+
assert_existence :card, params[:source], customer_card
|
23
23
|
elsif params[:card]
|
24
24
|
# params[:card] is a hash of cc info; "Sanitize" the card number
|
25
25
|
params[:card][:fingerprint] = StripeMock::Util.fingerprint(params[:card][:number])
|
@@ -27,7 +27,7 @@ module StripeMock
|
|
27
27
|
customer_card = params[:card]
|
28
28
|
else
|
29
29
|
customer = assert_existence :customer, cus_id, customers[cus_id]
|
30
|
-
customer_card = get_card(customer, customer[:
|
30
|
+
customer_card = get_card(customer, customer[:default_source])
|
31
31
|
end
|
32
32
|
|
33
33
|
token_id = generate_card_token(customer_card)
|