Skip to content

Commit

Permalink
Implement basic support for bank account sources.
Browse files Browse the repository at this point in the history
This allows creating a customer using bank account tokens, defaulting
to "new" state, and then verifying when verify endpoint gets called.
  • Loading branch information
lfittl committed May 3, 2016
1 parent 1f47959 commit 666f387
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 8 deletions.
1 change: 1 addition & 0 deletions lib/stripe_mock.rb
Expand Up @@ -34,6 +34,7 @@
require 'stripe_mock/api/test_helpers'
require 'stripe_mock/api/webhooks'

require 'stripe_mock/request_handlers/helpers/bank_account_helpers.rb'
require 'stripe_mock/request_handlers/helpers/card_helpers.rb'
require 'stripe_mock/request_handlers/helpers/charge_helpers.rb'
require 'stripe_mock/request_handlers/helpers/coupon_helpers.rb'
Expand Down
22 changes: 21 additions & 1 deletion lib/stripe_mock/data.rb
Expand Up @@ -235,9 +235,13 @@ def self.mock_bank_account(params={})
object: "bank_account",
bank_name: "STRIPEMOCK TEST BANK",
last4: "6789",
routing_number: '110000000',
country: "US",
currency: "usd",
validated: false,
status: 'new',
account_holder_name: 'John Doe',
account_holder_type: 'individual',
fingerprint: "aBcFinGerPrINt123"
}.merge(params)
end
Expand Down Expand Up @@ -487,7 +491,7 @@ def self.mock_recipient_array
}
end

def self.mock_token(params={})
def self.mock_card_token(params={})
{
:id => 'tok_default',
:livemode => false,
Expand Down Expand Up @@ -517,6 +521,22 @@ def self.mock_token(params={})
}.merge(params)
end

def self.mock_bank_account_token(params={})
{
:id => 'tok_default',
:livemode => false,
:used => false,
:object => 'token',
:type => 'bank_account',
:bank_account => {
:id => 'bank_account_default',
:object => 'bank_account',
:last4 => '2222',
:fingerprint => 'JRRLXGh38NiYygM7',
}
}.merge(params)
end

def self.mock_transfer(params={})
id = params[:id] || 'tr_test_transfer'
{
Expand Down
6 changes: 3 additions & 3 deletions lib/stripe_mock/request_handlers/customers.rb
Expand Up @@ -22,7 +22,7 @@ def new_customer(route, method_url, params, headers)
end
card_from_params(params[:source])
else
get_card_by_token(params.delete(:source))
get_card_or_bank_by_token(params.delete(:source))
end
sources << new_card
params[:default_source] = sources.first[:id]
Expand Down Expand Up @@ -71,9 +71,9 @@ def update_customer(route, method_url, params, headers)
end
cus.merge!(params)

if params[:source]
if params[:source]
if params[:source].is_a?(String)
new_card = get_card_by_token(params.delete(:source))
new_card = get_card_or_bank_by_token(params.delete(:source))
elsif params[:source].is_a?(Hash)
unless params[:source][:object] && params[:source][:number] && params[:source][:exp_month] && params[:source][:exp_year]
raise Stripe::InvalidRequestError.new('You must supply a valid card', nil, 400)
Expand Down
14 changes: 14 additions & 0 deletions lib/stripe_mock/request_handlers/helpers/bank_account_helpers.rb
@@ -0,0 +1,14 @@
module StripeMock
module RequestHandlers
module Helpers

def verify_bank_account(object, bank_account_id, class_name='Customer')
bank_accounts = object[:bank_accounts] || object[:sources]
bank_account = bank_accounts[:data].find{|acc| acc[:id] == bank_account_id }
return if bank_account.nil?
bank_account['status'] = 'verified'
bank_account
end
end
end
end
7 changes: 6 additions & 1 deletion lib/stripe_mock/request_handlers/helpers/token_helpers.rb
Expand Up @@ -4,6 +4,7 @@ module Helpers

def generate_bank_token(bank_params)
token = new_id 'btok'
bank_params[:id] = new_id 'bank_account'
@bank_tokens[token] = Data.mock_bank_account bank_params
token
end
Expand Down Expand Up @@ -33,6 +34,10 @@ def get_card_by_token(token)
end
end

def get_card_or_bank_by_token(token)
@card_tokens[token] || @bank_tokens[token] || raise(Stripe::InvalidRequestError.new("Invalid token id: #{token}", 'tok', 404))
end

end
end
end
end
9 changes: 9 additions & 0 deletions lib/stripe_mock/request_handlers/sources.rb
Expand Up @@ -5,6 +5,7 @@ module Sources
def Sources.included(klass)
klass.add_handler 'get /v1/customers/(.*)/sources', :retrieve_sources
klass.add_handler 'post /v1/customers/(.*)/sources', :create_source
klass.add_handler 'post /v1/customers/(.*)/sources/(.*)/verify', :verify_source
klass.add_handler 'get /v1/customers/(.*)/sources/(.*)', :retrieve_source
klass.add_handler 'delete /v1/customers/(.*)/sources/(.*)', :delete_source
klass.add_handler 'post /v1/customers/(.*)/sources/(.*)', :update_source
Expand Down Expand Up @@ -41,6 +42,14 @@ def update_source(route, method_url, params, headers)
card
end

def verify_source(route, method_url, params, headers)
route =~ method_url
customer = assert_existence :customer, $1, customers[$1]

bank_account = assert_existence :bank_account, $2, verify_bank_account(customer, $2)
bank_account
end

end
end
end
6 changes: 3 additions & 3 deletions lib/stripe_mock/request_handlers/tokens.rb
Expand Up @@ -39,7 +39,7 @@ def create_token(route, method_url, params, headers)
token_id = generate_card_token(customer_card)
card = @card_tokens[token_id]

Data.mock_token(params.merge :id => token_id, :card => card)
Data.mock_card_token(params.merge :id => token_id, :card => card)
end

def get_token(route, method_url, params, headers)
Expand All @@ -49,9 +49,9 @@ def get_token(route, method_url, params, headers)
assert_existence :token, $1, bank_or_card

if bank_or_card[:object] == 'card'
Data.mock_token(:id => $1, :card => bank_or_card)
Data.mock_card_token(:id => $1, :card => bank_or_card)
elsif bank_or_card[:object] == 'bank_account'
Data.mock_token(:id => $1, :bank_account => bank_or_card)
Data.mock_bank_account_token(:id => $1, :bank_account => bank_or_card)
end
end
end
Expand Down

0 comments on commit 666f387

Please sign in to comment.