stripe-ruby-mock 2.2.4 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/stripe_mock/api/bank_tokens.rb +5 -5
- data/lib/stripe_mock/api/card_tokens.rb +4 -4
- data/lib/stripe_mock/api/client.rb +6 -3
- data/lib/stripe_mock/api/errors.rb +4 -4
- data/lib/stripe_mock/api/server.rb +0 -1
- data/lib/stripe_mock/client.rb +12 -7
- data/lib/stripe_mock/data.rb +48 -2
- data/lib/stripe_mock/error_queue.rb +5 -1
- data/lib/stripe_mock/instance.rb +5 -3
- data/lib/stripe_mock/request_handlers/balance_transactions.rb +21 -0
- data/lib/stripe_mock/request_handlers/charges.rb +17 -10
- data/lib/stripe_mock/request_handlers/customers.rb +1 -0
- data/lib/stripe_mock/request_handlers/helpers/card_helpers.rb +35 -0
- data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +2 -2
- data/lib/stripe_mock/request_handlers/sources.rb +1 -1
- data/lib/stripe_mock/request_handlers/subscriptions.rb +79 -17
- data/lib/stripe_mock/request_handlers/tokens.rb +14 -4
- data/lib/stripe_mock/server.rb +21 -15
- data/lib/stripe_mock/test_strategies/base.rb +15 -0
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock.rb +2 -1
- data/spec/server_spec.rb +1 -1
- data/spec/shared_stripe_examples/balance_transaction_examples.rb +35 -0
- data/spec/shared_stripe_examples/bank_examples.rb +202 -0
- data/spec/shared_stripe_examples/bank_token_examples.rb +8 -0
- data/spec/shared_stripe_examples/card_token_examples.rb +10 -0
- data/spec/shared_stripe_examples/charge_examples.rb +27 -1
- data/spec/shared_stripe_examples/customer_examples.rb +2 -1
- data/spec/shared_stripe_examples/invoice_examples.rb +12 -12
- data/spec/shared_stripe_examples/refund_examples.rb +13 -0
- data/spec/shared_stripe_examples/subscription_examples.rb +47 -56
- data/spec/support/stripe_examples.rb +5 -3
- data/stripe-ruby-mock.gemspec +2 -2
- metadata +14 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e17b14c466a95e28e23f56859b0f20ce0fc0e6f2
|
4
|
+
data.tar.gz: 14b2121916a871814374262884df72a0501c32d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cf3ee166d1a5e9cac2b1c61bf50822568986b84fdaff85166739137d936bfe34f0cdf08ddc25ee6781412cb8a84dd55b4b4beae2a440fecf4966f6c042a7316
|
7
|
+
data.tar.gz: 8237f3fbfbc338f16e64ac7671acf8715254fd35fd6ab992e55c34c68dd79bc15c4526831694e954df9327428c55cca9d32394d1d3b7fa89e2e7d4846e69f5e1
|
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module StripeMock
|
2
2
|
|
3
|
-
def self.generate_bank_token(bank_params)
|
4
|
-
|
3
|
+
def self.generate_bank_token(bank_params = {})
|
4
|
+
case @state
|
5
|
+
when 'local'
|
5
6
|
instance.generate_bank_token(bank_params)
|
6
|
-
|
7
|
+
when 'remote'
|
7
8
|
client.generate_bank_token(bank_params)
|
8
9
|
else
|
9
10
|
raise UnstartedStateError
|
10
11
|
end
|
11
12
|
end
|
12
|
-
|
13
|
-
end
|
13
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module StripeMock
|
2
2
|
|
3
|
-
def self.generate_card_token(card_params)
|
4
|
-
|
3
|
+
def self.generate_card_token(card_params = {})
|
4
|
+
case @state
|
5
|
+
when 'local'
|
5
6
|
instance.generate_card_token(card_params)
|
6
|
-
|
7
|
+
when 'remote'
|
7
8
|
client.generate_card_token(card_params)
|
8
9
|
else
|
9
10
|
raise UnstartedStateError
|
10
11
|
end
|
11
12
|
end
|
12
|
-
|
13
13
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module StripeMock
|
2
2
|
|
3
|
-
def self.client
|
3
|
+
def self.client
|
4
|
+
@client
|
5
|
+
end
|
4
6
|
|
5
7
|
def self.start_client(port=4999)
|
6
8
|
return false if @state == 'live'
|
@@ -27,11 +29,12 @@ module StripeMock
|
|
27
29
|
|
28
30
|
def self.redirect_to_mock_server(method, url, api_key, params={}, headers={}, api_base_url=nil)
|
29
31
|
handler = Instance.handler_for_method_url("#{method} #{url}")
|
30
|
-
|
31
|
-
if mock_error
|
32
|
+
|
33
|
+
if mock_error = client.error_queue.error_for_handler_name(handler[:name])
|
32
34
|
client.error_queue.dequeue
|
33
35
|
raise mock_error
|
34
36
|
end
|
37
|
+
|
35
38
|
Stripe::Util.symbolize_names client.mock_request(method, url, api_key, params, headers)
|
36
39
|
end
|
37
40
|
|
@@ -4,12 +4,12 @@ module StripeMock
|
|
4
4
|
handler_names.push(:all) if handler_names.count == 0
|
5
5
|
|
6
6
|
if @state == 'local'
|
7
|
-
instance
|
7
|
+
instance
|
8
8
|
elsif @state == 'remote'
|
9
|
-
client
|
9
|
+
client
|
10
10
|
else
|
11
11
|
raise UnstartedStateError
|
12
|
-
end
|
12
|
+
end.error_queue.queue stripe_error, handler_names
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.prepare_card_error(code, *handler_names)
|
@@ -17,7 +17,7 @@ module StripeMock
|
|
17
17
|
|
18
18
|
args = CardErrors.argument_map[code]
|
19
19
|
raise StripeMockError.new("Unrecognized stripe card error code: #{code}") if args.nil?
|
20
|
-
self.prepare_error
|
20
|
+
self.prepare_error Stripe::CardError.new(*args), *handler_names
|
21
21
|
end
|
22
22
|
|
23
23
|
module CardErrors
|
data/lib/stripe_mock/client.rb
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
module StripeMock
|
2
|
-
|
3
2
|
class Client
|
4
|
-
attr_reader :port, :state
|
3
|
+
attr_reader :port, :state
|
5
4
|
|
6
5
|
def initialize(port)
|
7
6
|
@port = port
|
8
|
-
|
7
|
+
|
8
|
+
DRb.start_service
|
9
|
+
@pipe = DRbObject.new_with_uri "druby://localhost:#{port}"
|
10
|
+
|
9
11
|
# Ensure client can connect to server
|
10
12
|
timeout_wrap(5) { @pipe.ping }
|
11
13
|
@state = 'ready'
|
12
|
-
@error_queue = ErrorQueue.new
|
13
14
|
end
|
14
15
|
|
15
16
|
def mock_request(method, url, api_key, params={}, headers={})
|
16
17
|
timeout_wrap do
|
17
18
|
@pipe.mock_request(method, url, api_key, params, headers).tap {|result|
|
18
19
|
response, api_key = result
|
19
|
-
if response.is_a?(Hash) && response[
|
20
|
-
raise Stripe::InvalidRequestError.new(*response[
|
20
|
+
if response.is_a?(Hash) && response[:error_raised] == 'invalid_request'
|
21
|
+
raise Stripe::InvalidRequestError.new(*response[:error_params])
|
21
22
|
end
|
22
23
|
}
|
23
24
|
end
|
@@ -32,6 +33,10 @@ module StripeMock
|
|
32
33
|
}
|
33
34
|
end
|
34
35
|
|
36
|
+
def error_queue
|
37
|
+
timeout_wrap { @pipe.error_queue }
|
38
|
+
end
|
39
|
+
|
35
40
|
def set_server_debug(toggle)
|
36
41
|
timeout_wrap { @pipe.set_debug(toggle) }
|
37
42
|
end
|
@@ -86,7 +91,7 @@ module StripeMock
|
|
86
91
|
yield
|
87
92
|
rescue ClosedClientConnectionError
|
88
93
|
raise
|
89
|
-
rescue Errno::ECONNREFUSED => e
|
94
|
+
rescue Errno::ECONNREFUSED, DRb::DRbConnError => e
|
90
95
|
tries -= 1
|
91
96
|
if tries > 0
|
92
97
|
if tries == original_tries - 1
|
data/lib/stripe_mock/data.rb
CHANGED
@@ -192,7 +192,9 @@ module StripeMock
|
|
192
192
|
object: "refund",
|
193
193
|
balance_transaction: "txn_4fWh2RKvgxcXqV",
|
194
194
|
metadata: {},
|
195
|
-
charge: "ch_4fWhYjzQ23UFWT"
|
195
|
+
charge: "ch_4fWhYjzQ23UFWT",
|
196
|
+
receipt_number: nil,
|
197
|
+
status: "succeeded"
|
196
198
|
}.merge(params)
|
197
199
|
end
|
198
200
|
|
@@ -695,9 +697,53 @@ module StripeMock
|
|
695
697
|
}
|
696
698
|
end
|
697
699
|
|
698
|
-
def self.mock_list_object(data, params
|
700
|
+
def self.mock_list_object(data, params={})
|
699
701
|
list = StripeMock::Data::List.new(data, params)
|
700
702
|
list.to_h
|
701
703
|
end
|
704
|
+
|
705
|
+
def self.mock_balance_transactions(ids=[])
|
706
|
+
bts = {}
|
707
|
+
ids.each do |id|
|
708
|
+
bts[id] = self.mock_balance_transaction(id: id)
|
709
|
+
end
|
710
|
+
bts
|
711
|
+
end
|
712
|
+
|
713
|
+
def self.mock_balance_transaction(params = {})
|
714
|
+
bt_id = params[:id] || 'test_txn_default'
|
715
|
+
source = params[:source] || 'ch_test_charge'
|
716
|
+
{
|
717
|
+
id: bt_id,
|
718
|
+
object: "balance_transaction",
|
719
|
+
amount: 10000,
|
720
|
+
available_on: 1462406400,
|
721
|
+
created: 1461880226,
|
722
|
+
currency: "usd",
|
723
|
+
description: nil,
|
724
|
+
fee: 320,
|
725
|
+
fee_details: [
|
726
|
+
{
|
727
|
+
amount: 320,
|
728
|
+
application: nil,
|
729
|
+
currency: "usd",
|
730
|
+
description: "Stripe processing fees",
|
731
|
+
type: "stripe_fee"
|
732
|
+
}
|
733
|
+
],
|
734
|
+
net: 9680,
|
735
|
+
source: source,
|
736
|
+
sourced_transfers: {
|
737
|
+
object: "list",
|
738
|
+
data: [],
|
739
|
+
has_more: false,
|
740
|
+
total_count: 0,
|
741
|
+
url: "/v1/transfers?source_transaction=#{source}"
|
742
|
+
},
|
743
|
+
status: "pending",
|
744
|
+
type: "charge"
|
745
|
+
}.merge(params)
|
746
|
+
end
|
747
|
+
|
702
748
|
end
|
703
749
|
end
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -21,6 +21,7 @@ module StripeMock
|
|
21
21
|
end
|
22
22
|
|
23
23
|
include StripeMock::RequestHandlers::Accounts
|
24
|
+
include StripeMock::RequestHandlers::BalanceTransactions
|
24
25
|
include StripeMock::RequestHandlers::Charges
|
25
26
|
include StripeMock::RequestHandlers::Cards
|
26
27
|
include StripeMock::RequestHandlers::Sources
|
@@ -38,14 +39,15 @@ module StripeMock
|
|
38
39
|
include StripeMock::RequestHandlers::Tokens
|
39
40
|
|
40
41
|
|
41
|
-
attr_reader :accounts, :bank_tokens, :charges, :coupons, :customers,
|
42
|
-
:invoices, :invoice_items, :orders, :plans, :recipients,
|
43
|
-
:subscriptions
|
42
|
+
attr_reader :accounts, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
43
|
+
:disputes, :events, :invoices, :invoice_items, :orders, :plans, :recipients,
|
44
|
+
:transfers, :subscriptions
|
44
45
|
|
45
46
|
attr_accessor :error_queue, :debug
|
46
47
|
|
47
48
|
def initialize
|
48
49
|
@accounts = {}
|
50
|
+
@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'])
|
49
51
|
@bank_tokens = {}
|
50
52
|
@card_tokens = {}
|
51
53
|
@customers = {}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module BalanceTransactions
|
4
|
+
|
5
|
+
def BalanceTransactions.included(klass)
|
6
|
+
klass.add_handler 'get /v1/balance/history/(.*)', :get_balance_transaction
|
7
|
+
klass.add_handler 'get /v1/balance/history', :list_balance_transactions
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_balance_transaction(route, method_url, params, headers)
|
11
|
+
route =~ method_url
|
12
|
+
assert_existence :balance_transaction, $1, balance_transactions[$1]
|
13
|
+
end
|
14
|
+
|
15
|
+
def list_balance_transactions(route, method_url, params, headers)
|
16
|
+
Data.mock_list_object(balance_transactions.values, params)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -15,17 +15,24 @@ module StripeMock
|
|
15
15
|
def new_charge(route, method_url, params, headers)
|
16
16
|
id = new_id('ch')
|
17
17
|
|
18
|
-
if params[:source]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
if params[:source]
|
19
|
+
if params[:source].is_a?(String)
|
20
|
+
# if a customer is provided, the card parameter is assumed to be the actual
|
21
|
+
# card id, not a token. in this case we'll find the card in the customer
|
22
|
+
# object and return that.
|
23
|
+
if params[:customer]
|
24
|
+
params[:source] = get_card(customers[params[:customer]], params[:source])
|
25
|
+
else
|
26
|
+
params[:source] = get_card_by_token(params[:source])
|
27
|
+
end
|
28
|
+
elsif params[:source][:id]
|
29
|
+
raise Stripe::InvalidRequestError.new("Invalid token id: #{params[:source]}", 'card', 400)
|
30
|
+
end
|
31
|
+
elsif params[:customer]
|
32
|
+
customer = customers[params[:customer]]
|
33
|
+
if customer && customer[:default_source]
|
34
|
+
params[:source] = get_card(customer, customer[:default_source])
|
26
35
|
end
|
27
|
-
elsif params[:source] && params[:source][:id]
|
28
|
-
raise Stripe::InvalidRequestError.new("Invalid token id: #{params[:card]}", 'card', 400)
|
29
36
|
end
|
30
37
|
|
31
38
|
ensure_required_params(params)
|
@@ -41,6 +41,7 @@ module StripeMock
|
|
41
41
|
subscription = Data.mock_subscription({ id: new_id('su') })
|
42
42
|
subscription.merge!(custom_subscription_params(plan, customers[ params[:id] ], params))
|
43
43
|
add_subscription_to_customer(customers[ params[:id] ], subscription)
|
44
|
+
subscriptions[subscription[:id]] = subscription
|
44
45
|
elsif params[:trial_end]
|
45
46
|
raise Stripe::InvalidRequestError.new('Received unknown parameter: trial_end', nil, 400)
|
46
47
|
end
|
@@ -17,6 +17,23 @@ module StripeMock
|
|
17
17
|
card
|
18
18
|
end
|
19
19
|
|
20
|
+
def add_source_to_object(type, source, object, replace_current=false)
|
21
|
+
source[type] = object[:id]
|
22
|
+
sources = object[:sources]
|
23
|
+
|
24
|
+
if replace_current && sources[:data]
|
25
|
+
sources[:data].delete_if {|source| source[:id] == object[:default_source]}
|
26
|
+
object[:default_source] = source[:id]
|
27
|
+
sources[:data] = [source]
|
28
|
+
else
|
29
|
+
sources[:total_count] = (sources[:total_count] || 0) + 1
|
30
|
+
(sources[:data] ||= []) << source
|
31
|
+
end
|
32
|
+
object[:default_source] = source[:id] if object[:default_source].nil?
|
33
|
+
|
34
|
+
source
|
35
|
+
end
|
36
|
+
|
20
37
|
def add_card_to_object(type, card, object, replace_current=false)
|
21
38
|
card[type] = object[:id]
|
22
39
|
cards_or_sources = object[:cards] || object[:sources]
|
@@ -64,6 +81,24 @@ module StripeMock
|
|
64
81
|
card
|
65
82
|
end
|
66
83
|
|
84
|
+
def add_source_to(type, type_id, params, objects)
|
85
|
+
resource = assert_existence type, type_id, objects[type_id]
|
86
|
+
|
87
|
+
source =
|
88
|
+
if params[:card]
|
89
|
+
card_from_params(params[:card])
|
90
|
+
elsif params[:bank_account]
|
91
|
+
get_bank_by_token(params[:bank_account])
|
92
|
+
else
|
93
|
+
begin
|
94
|
+
get_card_by_token(params[:source])
|
95
|
+
rescue Stripe::InvalidRequestError
|
96
|
+
get_bank_by_token(params[:source])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
add_source_to_object(type, source, resource)
|
100
|
+
end
|
101
|
+
|
67
102
|
def add_card_to(type, type_id, params, objects)
|
68
103
|
resource = assert_existence type, type_id, objects[type_id]
|
69
104
|
|
@@ -2,14 +2,14 @@ module StripeMock
|
|
2
2
|
module RequestHandlers
|
3
3
|
module Helpers
|
4
4
|
|
5
|
-
def generate_bank_token(bank_params)
|
5
|
+
def generate_bank_token(bank_params = {})
|
6
6
|
token = new_id 'btok'
|
7
7
|
bank_params[:id] = new_id 'bank_account'
|
8
8
|
@bank_tokens[token] = Data.mock_bank_account bank_params
|
9
9
|
token
|
10
10
|
end
|
11
11
|
|
12
|
-
def generate_card_token(card_params)
|
12
|
+
def generate_card_token(card_params = {})
|
13
13
|
token = new_id 'tok'
|
14
14
|
card_params[:id] = new_id 'cc'
|
15
15
|
@card_tokens[token] = Data.mock_card symbolize_names(card_params)
|
@@ -13,7 +13,7 @@ module StripeMock
|
|
13
13
|
|
14
14
|
def create_source(route, method_url, params, headers)
|
15
15
|
route =~ method_url
|
16
|
-
|
16
|
+
add_source_to(:customer, $1, params, customers)
|
17
17
|
end
|
18
18
|
|
19
19
|
def retrieve_sources(route, method_url, params, headers)
|
@@ -3,20 +3,41 @@ module StripeMock
|
|
3
3
|
module Subscriptions
|
4
4
|
|
5
5
|
def Subscriptions.included(klass)
|
6
|
-
klass.add_handler 'get /v1/
|
7
|
-
klass.add_handler 'post /v1/
|
8
|
-
klass.add_handler 'get /v1/
|
9
|
-
klass.add_handler 'post /v1/
|
10
|
-
klass.add_handler 'delete /v1/
|
6
|
+
klass.add_handler 'get /v1/subscriptions', :retrieve_subscriptions
|
7
|
+
klass.add_handler 'post /v1/subscriptions', :create_subscription
|
8
|
+
klass.add_handler 'get /v1/subscriptions/(.*)', :retrieve_subscription
|
9
|
+
klass.add_handler 'post /v1/subscriptions/(.*)', :update_subscription
|
10
|
+
klass.add_handler 'delete /v1/subscriptions/(.*)', :cancel_subscription
|
11
|
+
|
12
|
+
klass.add_handler 'post /v1/customers/(.*)/subscriptions', :create_customer_subscription
|
13
|
+
klass.add_handler 'get /v1/customers/(.*)/subscriptions/(.*)', :retrieve_customer_subscription
|
14
|
+
klass.add_handler 'get /v1/customers/(.*)/subscriptions', :retrieve_customer_subscriptions
|
11
15
|
end
|
12
16
|
|
13
|
-
def
|
17
|
+
def retrieve_customer_subscription(route, method_url, params, headers)
|
18
|
+
route =~ method_url
|
19
|
+
|
20
|
+
customer = :customer, $1, customers[$1]
|
21
|
+
subscription = get_customer_subscription(customer, $2)
|
22
|
+
|
23
|
+
assert_existence :subscription, $2, subscription
|
24
|
+
end
|
25
|
+
|
26
|
+
def retrieve_customer_subscriptions(route, method_url, params, headers)
|
14
27
|
route =~ method_url
|
28
|
+
|
15
29
|
customer = assert_existence :customer, $1, customers[$1]
|
30
|
+
customer[:subscriptions]
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_customer_subscription(route, method_url, params, headers)
|
34
|
+
route =~ method_url
|
16
35
|
|
17
36
|
plan_id = params[:plan].to_s
|
18
37
|
plan = assert_existence :plan, plan_id, plans[plan_id]
|
19
38
|
|
39
|
+
customer = assert_existence :customer, $1, customers[$1]
|
40
|
+
|
20
41
|
if params[:source]
|
21
42
|
new_card = get_card_by_token(params.delete(:source))
|
22
43
|
add_card_to_object(:customer, new_card, customer)
|
@@ -42,32 +63,72 @@ module StripeMock
|
|
42
63
|
subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {})
|
43
64
|
end
|
44
65
|
|
66
|
+
subscriptions[subscription[:id]] = subscription
|
45
67
|
add_subscription_to_customer(customer, subscription)
|
46
68
|
|
69
|
+
subscriptions[subscription[:id]]
|
70
|
+
end
|
47
71
|
|
48
|
-
|
72
|
+
def create_subscription(route, method_url, params, headers)
|
73
|
+
route =~ method_url
|
74
|
+
|
75
|
+
plan_id = params[:plan].to_s
|
76
|
+
plan = assert_existence :plan, plan_id, plans[plan_id]
|
77
|
+
|
78
|
+
customer_id = params[:customer].to_s
|
79
|
+
customer = assert_existence :customer, customer_id, customers[customer_id]
|
80
|
+
|
81
|
+
if params[:source]
|
82
|
+
new_card = get_card_by_token(params.delete(:source))
|
83
|
+
add_card_to_object(:customer, new_card, customer)
|
84
|
+
customer[:default_source] = new_card[:id]
|
85
|
+
end
|
86
|
+
|
87
|
+
# Ensure customer has card to charge if plan has no trial and is not free
|
88
|
+
verify_card_present(customer, plan, params)
|
89
|
+
|
90
|
+
subscription = Data.mock_subscription({ id: (params[:id] || new_id('su')) })
|
91
|
+
subscription.merge!(custom_subscription_params(plan, customer, params))
|
92
|
+
|
93
|
+
if params[:coupon]
|
94
|
+
coupon_id = params[:coupon]
|
95
|
+
|
96
|
+
raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', 400) unless coupons[coupon_id]
|
97
|
+
|
98
|
+
# FIXME assert_existence returns 404 error code but Stripe returns 400
|
99
|
+
# coupon = assert_existence :coupon, coupon_id, coupons[coupon_id]
|
100
|
+
|
101
|
+
coupon = Data.mock_coupon({ id: coupon_id })
|
102
|
+
|
103
|
+
subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {})
|
104
|
+
end
|
105
|
+
|
106
|
+
subscriptions[subscription[:id]] = subscription
|
107
|
+
add_subscription_to_customer(customer, subscription)
|
108
|
+
|
109
|
+
subscriptions[subscription[:id]]
|
49
110
|
end
|
50
111
|
|
51
112
|
def retrieve_subscription(route, method_url, params, headers)
|
52
113
|
route =~ method_url
|
53
114
|
|
54
|
-
|
55
|
-
assert_existence :subscription, $2, get_customer_subscription(customer, $2)
|
115
|
+
assert_existence :subscription, $1, subscriptions[$1]
|
56
116
|
end
|
57
117
|
|
58
118
|
def retrieve_subscriptions(route, method_url, params, headers)
|
59
119
|
route =~ method_url
|
60
120
|
|
61
|
-
|
62
|
-
customer[
|
121
|
+
Data.mock_list_object(subscriptions.values, params)
|
122
|
+
#customer = assert_existence :customer, $1, customers[$1]
|
123
|
+
#customer[:subscriptions]
|
63
124
|
end
|
64
125
|
|
65
126
|
def update_subscription(route, method_url, params, headers)
|
66
127
|
route =~ method_url
|
67
|
-
|
128
|
+
subscription = assert_existence :subscription, $1, subscriptions[$1]
|
68
129
|
|
69
|
-
|
70
|
-
assert_existence :
|
130
|
+
customer_id = subscription[:customer]
|
131
|
+
customer = assert_existence :customer, customer_id, customers[customer_id]
|
71
132
|
|
72
133
|
if params[:source]
|
73
134
|
new_card = get_card_by_token(params.delete(:source))
|
@@ -111,10 +172,11 @@ module StripeMock
|
|
111
172
|
|
112
173
|
def cancel_subscription(route, method_url, params, headers)
|
113
174
|
route =~ method_url
|
114
|
-
customer = assert_existence :customer, $1, customers[$1]
|
115
175
|
|
116
|
-
subscription =
|
117
|
-
|
176
|
+
subscription = assert_existence :subscription, $1, subscriptions[$1]
|
177
|
+
|
178
|
+
customer_id = subscription[:customer]
|
179
|
+
customer = assert_existence :customer, customer_id, customers[customer_id]
|
118
180
|
|
119
181
|
cancel_params = { canceled_at: Time.now.utc.to_i }
|
120
182
|
cancelled_at_period_end = (params[:at_period_end] == true)
|
@@ -8,7 +8,7 @@ module StripeMock
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def create_token(route, method_url, params, headers)
|
11
|
-
if params[:customer].nil? && params[:card].nil?
|
11
|
+
if params[:customer].nil? && params[:card].nil? && params[:bank_account].nil?
|
12
12
|
raise Stripe::InvalidRequestError.new('You must supply either a card, customer, or bank account to create a token.', nil, 400)
|
13
13
|
end
|
14
14
|
|
@@ -31,15 +31,25 @@ module StripeMock
|
|
31
31
|
params[:card][:fingerprint] = StripeMock::Util.fingerprint(params[:card][:number])
|
32
32
|
params[:card][:last4] = params[:card][:number][-4,4]
|
33
33
|
customer_card = params[:card]
|
34
|
+
elsif params[:bank_account]
|
35
|
+
# params[:card] is a hash of cc info; "Sanitize" the card number
|
36
|
+
bank_account = params[:bank_account]
|
34
37
|
else
|
35
38
|
customer = assert_existence :customer, cus_id, customers[cus_id]
|
36
39
|
customer_card = get_card(customer, customer[:default_source])
|
37
40
|
end
|
38
41
|
|
39
|
-
|
40
|
-
|
42
|
+
if bank_account
|
43
|
+
token_id = generate_bank_token(bank_account)
|
44
|
+
bank_account = @bank_tokens[token_id]
|
45
|
+
|
46
|
+
Data.mock_bank_account_token(params.merge :id => token_id, :bank_account => bank_account)
|
47
|
+
else
|
48
|
+
token_id = generate_card_token(customer_card)
|
49
|
+
card = @card_tokens[token_id]
|
41
50
|
|
42
|
-
|
51
|
+
Data.mock_card_token(params.merge :id => token_id, :card => card)
|
52
|
+
end
|
43
53
|
end
|
44
54
|
|
45
55
|
def get_token(route, method_url, params, headers)
|
data/lib/stripe_mock/server.rb
CHANGED
@@ -1,19 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'drb/drb'
|
2
2
|
|
3
3
|
module StripeMock
|
4
|
-
|
5
4
|
class Server
|
6
|
-
extend Jimson::Handler
|
7
|
-
|
8
5
|
def self.start_new(opts)
|
9
6
|
puts "Starting StripeMock server on port #{opts[:port] || 4999}"
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
server.start
|
7
|
+
|
8
|
+
host = opts.fetch :host,'0.0.0.0'
|
9
|
+
port = opts.fetch :port, 4999
|
10
|
+
|
11
|
+
DRb.start_service "druby://#{host}:#{port}", Server.new
|
12
|
+
DRb.thread.join
|
17
13
|
end
|
18
14
|
|
19
15
|
def initialize
|
@@ -26,7 +22,9 @@ module StripeMock
|
|
26
22
|
rescue Stripe::InvalidRequestError => e
|
27
23
|
{
|
28
24
|
:error_raised => 'invalid_request',
|
29
|
-
:error_params => [
|
25
|
+
:error_params => [
|
26
|
+
e.message, e.param, e.http_status, e.http_body, e.json_body
|
27
|
+
]
|
30
28
|
}
|
31
29
|
end
|
32
30
|
end
|
@@ -67,8 +65,16 @@ module StripeMock
|
|
67
65
|
@instance.generate_webhook_event(event_data)
|
68
66
|
end
|
69
67
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
68
|
+
def error_queue
|
69
|
+
@instance.error_queue
|
70
|
+
end
|
71
|
+
|
72
|
+
def debug?
|
73
|
+
@instance.debug
|
74
|
+
end
|
73
75
|
|
76
|
+
def ping
|
77
|
+
true
|
78
|
+
end
|
79
|
+
end
|
74
80
|
end
|