braintree 2.69.1 → 2.70.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/lib/braintree.rb +3 -0
- data/lib/braintree/error_codes.rb +8 -0
- data/lib/braintree/gateway.rb +4 -0
- data/lib/braintree/ideal_payment.rb +46 -0
- data/lib/braintree/ideal_payment_gateway.rb +18 -0
- data/lib/braintree/merchant_account_gateway.rb +18 -0
- data/lib/braintree/payment_instrument_type.rb +1 -0
- data/lib/braintree/payment_method.rb +2 -2
- data/lib/braintree/payment_method_gateway.rb +9 -3
- data/lib/braintree/transaction.rb +2 -0
- data/lib/braintree/transaction/ideal_payment_details.rb +13 -0
- data/lib/braintree/transaction/paypal_details.rb +1 -1
- data/lib/braintree/transaction_gateway.rb +1 -0
- data/lib/braintree/version.rb +2 -2
- data/spec/httpsd.pid +1 -1
- data/spec/integration/braintree/client_api/spec_helper.rb +37 -14
- data/spec/integration/braintree/customer_spec.rb +2 -2
- data/spec/integration/braintree/ideal_payment_spec.rb +87 -0
- data/spec/integration/braintree/merchant_account_spec.rb +103 -0
- data/spec/integration/braintree/merchant_spec.rb +65 -55
- data/spec/integration/braintree/payment_method_spec.rb +3 -3
- data/spec/integration/braintree/transaction_spec.rb +69 -6
- data/spec/integration/braintree/us_bank_account_spec.rb +6 -6
- data/spec/spec_helper.rb +18 -1
- data/spec/unit/braintree/payment_method_spec.rb +27 -0
- data/spec/unit/braintree/transaction_spec.rb +77 -0
- metadata +169 -165
data/README.rdoc
CHANGED
data/lib/braintree.rb
CHANGED
@@ -55,6 +55,9 @@ require "braintree/error_result"
|
|
55
55
|
require "braintree/errors"
|
56
56
|
require "braintree/gateway"
|
57
57
|
require "braintree/http"
|
58
|
+
require "braintree/ideal_payment"
|
59
|
+
require "braintree/ideal_payment_gateway"
|
60
|
+
require "braintree/transaction/ideal_payment_details"
|
58
61
|
require "braintree/merchant"
|
59
62
|
require "braintree/merchant_gateway"
|
60
63
|
require "braintree/merchant_account"
|
@@ -290,6 +290,8 @@ module Braintree
|
|
290
290
|
CustomerDoesNotHaveCreditCard = "91511"
|
291
291
|
CustomerIdIsInvalid = "91510"
|
292
292
|
HasAlreadyBeenRefunded = "91512"
|
293
|
+
IdealPaymentNotComplete = "815141"
|
294
|
+
IdealPaymentAlreadyConsumed = "815142"
|
293
295
|
MerchantAccountDoesNotMatch3DSecureMerchantAccount = "91584"
|
294
296
|
MerchantAccountDoesNotSupportMOTO = "91558"
|
295
297
|
MerchantAccountDoesNotSupportRefunds = "91547"
|
@@ -401,6 +403,12 @@ module Braintree
|
|
401
403
|
InconsistentCountry = "93612"
|
402
404
|
PaymentMethodsAreInvalid = "93613"
|
403
405
|
PaymentMethodsAreNotAllowed = "93615"
|
406
|
+
MerchantAccountExistsForCurrency = "93616"
|
407
|
+
CurrencyIsRequired = "93617"
|
408
|
+
CurrencyIsInvalid = "93618"
|
409
|
+
NoMerchantAccounts = "93619"
|
410
|
+
MerchantAccountExistsForId = "93620"
|
411
|
+
MerchantAccountNotAuthOnboarded = "93621"
|
404
412
|
end
|
405
413
|
|
406
414
|
module MerchantAccount
|
data/lib/braintree/gateway.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Braintree
|
2
|
+
class IdealPayment
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :id, :ideal_transaction_id, :currency, :amount, :status, :order_id, :issuer, :approval_url, :iban_bank_account
|
6
|
+
|
7
|
+
def initialize(gateway, attributes) # :nodoc:
|
8
|
+
@gateway = gateway
|
9
|
+
set_instance_variables_from_hash(attributes)
|
10
|
+
@iban_bank_account = IbanBankAccount.new(attributes[:iban_bank_account])
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
protected :new
|
15
|
+
end
|
16
|
+
|
17
|
+
def self._new(*args) # :nodoc:
|
18
|
+
self.new *args
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.sale(ideal_payment_id, transaction_attributes)
|
22
|
+
Configuration.gateway.transaction.sale(transaction_attributes.merge(
|
23
|
+
:payment_method_nonce => ideal_payment_id,
|
24
|
+
:options => { :submit_for_settlement => true }
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.sale!(ideal_payment_id, transaction_attributes)
|
30
|
+
return_object_or_raise(:transaction) { sale(ideal_payment_id, transaction_attributes) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.find(ideal_payment_id)
|
34
|
+
Configuration.gateway.ideal_payment.find(ideal_payment_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
class IbanBankAccount
|
38
|
+
include BaseModule
|
39
|
+
attr_reader :account_holder_name, :bic, :masked_iban, :iban_account_number_last_4, :iban_country, :description
|
40
|
+
|
41
|
+
def initialize(attributes) # :nodoc:
|
42
|
+
set_instance_variables_from_hash(attributes)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Braintree
|
2
|
+
class IdealPaymentGateway
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(ideal_payment_id)
|
10
|
+
raise ArgumentError if ideal_payment_id.nil? || ideal_payment_id.to_s.strip == ""
|
11
|
+
response = @config.http.get("#{@config.base_merchant_path}/ideal_payments/#{ideal_payment_id}")
|
12
|
+
IdealPayment._new(@gateway, response[:ideal_payment])
|
13
|
+
rescue NotFoundError
|
14
|
+
raise NotFoundError, "ideal payment with ideal_payment_id #{ideal_payment_id.inspect} not found"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -25,6 +25,10 @@ module Braintree
|
|
25
25
|
_do_update "/merchant_accounts/#{merchant_account_id}/update_via_api", :merchant_account => attributes
|
26
26
|
end
|
27
27
|
|
28
|
+
def create_for_currency(params)
|
29
|
+
_create_for_currency(params)
|
30
|
+
end
|
31
|
+
|
28
32
|
def _do_create(path, params=nil) # :nodoc:
|
29
33
|
response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
|
30
34
|
if response[:api_error_response]
|
@@ -43,6 +47,20 @@ module Braintree
|
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
50
|
+
def _create_for_currency(params)
|
51
|
+
response = @config.http.post("#{@config.base_merchant_path}/merchant_accounts/create_for_currency", :merchant_account => params)
|
52
|
+
|
53
|
+
if response.has_key?(:response) && response[:response][:merchant_account]
|
54
|
+
Braintree::SuccessfulResult.new(
|
55
|
+
:merchant_account => MerchantAccount._new(@gateway, response[:response][:merchant_account])
|
56
|
+
)
|
57
|
+
elsif response[:api_error_response]
|
58
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
59
|
+
else
|
60
|
+
raise UnexpectedError, "expected :merchant or :api_error_response"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
46
64
|
def self._detect_signature(attributes)
|
47
65
|
if attributes.has_key?(:applicant_details)
|
48
66
|
warn "[DEPRECATED] Passing :applicant_details to create is deprecated. Please use :individual, :business, and :funding."
|
@@ -14,8 +14,8 @@ module Braintree
|
|
14
14
|
Configuration.gateway.payment_method.update(token, attributes)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.delete(token)
|
18
|
-
Configuration.gateway.payment_method.delete(token)
|
17
|
+
def self.delete(token, options = {})
|
18
|
+
Configuration.gateway.payment_method.delete(token, options)
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.grant(token, options = {})
|
@@ -43,9 +43,11 @@ module Braintree
|
|
43
43
|
raise UnexpectedError, "expected :payment_method or :api_error_response"
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
|
-
def delete(token)
|
48
|
-
|
46
|
+
|
47
|
+
def delete(token, options = {})
|
48
|
+
Util.verify_keys(PaymentMethodGateway._delete_signature, options)
|
49
|
+
query_param = "?" + Util.hash_to_query_string(options) if not options.empty?
|
50
|
+
@config.http.delete("#{@config.base_merchant_path}/payment_methods/any/#{token}#{query_param}")
|
49
51
|
SuccessfulResult.new
|
50
52
|
end
|
51
53
|
|
@@ -135,6 +137,10 @@ module Braintree
|
|
135
137
|
def self._update_signature # :nodoc:
|
136
138
|
_signature(:update)
|
137
139
|
end
|
140
|
+
|
141
|
+
def self._delete_signature # :nodoc:
|
142
|
+
[:revoke_all_grants]
|
143
|
+
end
|
138
144
|
|
139
145
|
def self._signature(type) # :nodoc:
|
140
146
|
billing_address_params = AddressGateway._shared_signature
|
@@ -123,6 +123,7 @@ module Braintree
|
|
123
123
|
attr_reader :facilitator_details
|
124
124
|
attr_reader :three_d_secure_info
|
125
125
|
attr_reader :us_bank_account_details
|
126
|
+
attr_reader :ideal_payment_details
|
126
127
|
|
127
128
|
def self.create(attributes)
|
128
129
|
Configuration.gateway.transaction.create(attributes)
|
@@ -269,6 +270,7 @@ module Braintree
|
|
269
270
|
@facilitator_details = FacilitatorDetails.new(attributes[:facilitator_details]) if attributes[:facilitator_details]
|
270
271
|
@three_d_secure_info = ThreeDSecureInfo.new(attributes[:three_d_secure_info]) if attributes[:three_d_secure_info]
|
271
272
|
@us_bank_account_details = UsBankAccountDetails.new(attributes[:us_bank_account]) if attributes[:us_bank_account]
|
273
|
+
@ideal_payment_details = IdealPaymentDetails.new(attributes[:ideal_payment]) if attributes[:ideal_payment]
|
272
274
|
end
|
273
275
|
|
274
276
|
# True if <tt>other</tt> is a Braintree::Transaction with the same id.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Transaction
|
3
|
+
class IdealPaymentDetails # :nodoc:
|
4
|
+
include BaseModule
|
5
|
+
|
6
|
+
attr_reader :ideal_payment_id, :ideal_transaction_id, :masked_iban, :bic, :image_url
|
7
|
+
|
8
|
+
def initialize(attributes)
|
9
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -5,7 +5,7 @@ module Braintree
|
|
5
5
|
|
6
6
|
attr_reader :custom_field, :payer_email, :payment_id, :authorization_id, :token,
|
7
7
|
:image_url, :debug_id, :payee_email, :payer_id, :payer_first_name, :payer_last_name,
|
8
|
-
:seller_protection_status, :capture_id, :refund_id, :transaction_fee_amount,
|
8
|
+
:payer_status, :seller_protection_status, :capture_id, :refund_id, :transaction_fee_amount,
|
9
9
|
:transaction_fee_currency_iso_code, :description
|
10
10
|
|
11
11
|
def initialize(attributes)
|
@@ -170,6 +170,7 @@ module Braintree
|
|
170
170
|
:store_shipping_address_in_vault,
|
171
171
|
:venmo_sdk_session,
|
172
172
|
:payee_email,
|
173
|
+
:skip_advanced_fraud_checking,
|
173
174
|
:skip_avs,
|
174
175
|
:skip_cvv,
|
175
176
|
{:paypal => [:custom_field, :payee_email, :description, {:supplementary_data => :_any_key_}]},
|
data/lib/braintree/version.rb
CHANGED
data/spec/httpsd.pid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2857
|
@@ -59,6 +59,7 @@ end
|
|
59
59
|
def generate_valid_us_bank_account_nonce()
|
60
60
|
raw_client_token = Braintree::ClientToken.generate
|
61
61
|
client_token = decode_client_token(raw_client_token)
|
62
|
+
|
62
63
|
url = client_token["braintree_api"]["url"] + "/tokens"
|
63
64
|
token = client_token["braintree_api"]["access_token"]
|
64
65
|
payload = {
|
@@ -70,7 +71,7 @@ def generate_valid_us_bank_account_nonce()
|
|
70
71
|
:postal_code => "94112"
|
71
72
|
},
|
72
73
|
:account_type => "checking",
|
73
|
-
:routing_number => "
|
74
|
+
:routing_number => "021000021",
|
74
75
|
:account_number => "567891234",
|
75
76
|
:account_holder_name => "Dan Schulman",
|
76
77
|
:account_description => "PayPal Checking - 1234",
|
@@ -79,20 +80,25 @@ def generate_valid_us_bank_account_nonce()
|
|
79
80
|
}
|
80
81
|
}
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
86
|
-
resp = connection.start do |http|
|
87
|
-
request = Net::HTTP::Post.new(uri.path)
|
88
|
-
request["Content-Type"] = "application/json"
|
89
|
-
request["Braintree-Version"] = "2015-11-01"
|
90
|
-
request["Authorization"] = "Bearer #{token}"
|
91
|
-
request.body = payload.to_json
|
92
|
-
http.request(request)
|
93
|
-
end
|
83
|
+
json = _cosmos_post(token, url, payload)
|
84
|
+
json["data"]["id"]
|
85
|
+
end
|
94
86
|
|
95
|
-
|
87
|
+
def generate_valid_ideal_payment_nonce(amount = Braintree::Test::TransactionAmounts::Authorize)
|
88
|
+
raw_client_token = Braintree::ClientToken.generate
|
89
|
+
client_token = decode_client_token(raw_client_token)
|
90
|
+
|
91
|
+
token = client_token["braintree_api"]["access_token"]
|
92
|
+
url = client_token["braintree_api"]["url"] + "/ideal-payments"
|
93
|
+
payload = {
|
94
|
+
:issuer => "RABONL2U",
|
95
|
+
:order_id => SpecHelper::DefaultOrderId,
|
96
|
+
:amount => amount,
|
97
|
+
:currency => "EUR",
|
98
|
+
:redirect_url => "https://braintree-api.com",
|
99
|
+
}
|
100
|
+
|
101
|
+
json = _cosmos_post(token, url, payload)
|
96
102
|
json["data"]["id"]
|
97
103
|
end
|
98
104
|
|
@@ -107,6 +113,23 @@ def generate_invalid_us_bank_account_nonce
|
|
107
113
|
nonce += "_xxx"
|
108
114
|
end
|
109
115
|
|
116
|
+
def _cosmos_post(token, url, payload)
|
117
|
+
uri = URI::parse(url)
|
118
|
+
connection = Net::HTTP.new(uri.host, uri.port)
|
119
|
+
connection.use_ssl = true
|
120
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
121
|
+
resp = connection.start do |http|
|
122
|
+
request = Net::HTTP::Post.new(uri.path)
|
123
|
+
request["Content-Type"] = "application/json"
|
124
|
+
request["Braintree-Version"] = "2015-11-01"
|
125
|
+
request["Authorization"] = "Bearer #{token}"
|
126
|
+
request.body = payload.to_json
|
127
|
+
http.request(request)
|
128
|
+
end
|
129
|
+
|
130
|
+
JSON.parse(resp.body)
|
131
|
+
end
|
132
|
+
|
110
133
|
class ClientApiHttp
|
111
134
|
attr_reader :config, :options
|
112
135
|
|
@@ -910,12 +910,12 @@ describe Braintree::Customer do
|
|
910
910
|
|
911
911
|
us_bank_account = found_customer.us_bank_accounts.first
|
912
912
|
us_bank_account.should be_a(Braintree::UsBankAccount)
|
913
|
-
us_bank_account.routing_number.should == "
|
913
|
+
us_bank_account.routing_number.should == "021000021"
|
914
914
|
us_bank_account.last_4.should == "1234"
|
915
915
|
us_bank_account.account_type.should == "checking"
|
916
916
|
us_bank_account.account_description.should == "PayPal Checking - 1234"
|
917
917
|
us_bank_account.account_holder_name.should == "Dan Schulman"
|
918
|
-
us_bank_account.bank_name.should
|
918
|
+
us_bank_account.bank_name.should =~ /CHASE/
|
919
919
|
end
|
920
920
|
|
921
921
|
it "works for a blank customer" do
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/client_api/spec_helper")
|
3
|
+
|
4
|
+
describe Braintree::IdealPayment do
|
5
|
+
context "self.sale" do
|
6
|
+
it "creates a transaction using an Ideal payment token and returns a result object" do
|
7
|
+
ideal_payment_id = generate_valid_ideal_payment_nonce
|
8
|
+
|
9
|
+
result = Braintree::IdealPayment.sale(
|
10
|
+
ideal_payment_id,
|
11
|
+
:order_id => SpecHelper::DefaultOrderId,
|
12
|
+
:merchant_account_id => "ideal_merchant_account",
|
13
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize
|
14
|
+
)
|
15
|
+
|
16
|
+
result.success?.should == true
|
17
|
+
result.transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
|
18
|
+
result.transaction.type.should == "sale"
|
19
|
+
ideal_payment_details = result.transaction.ideal_payment_details
|
20
|
+
ideal_payment_details.ideal_payment_id.should =~ /^idealpayment_\w{6,}$/
|
21
|
+
ideal_payment_details.ideal_transaction_id.should =~ /^\d{16,}$/
|
22
|
+
ideal_payment_details.image_url.should start_with("https://")
|
23
|
+
ideal_payment_details.masked_iban.should_not be_empty
|
24
|
+
ideal_payment_details.bic.should_not be_empty
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "self.sale!" do
|
29
|
+
it "creates a transaction using an ideal payment and returns a result object" do
|
30
|
+
ideal_payment_id = generate_valid_ideal_payment_nonce
|
31
|
+
|
32
|
+
transaction = Braintree::IdealPayment.sale!(
|
33
|
+
ideal_payment_id,
|
34
|
+
:order_id => SpecHelper::DefaultOrderId,
|
35
|
+
:merchant_account_id => "ideal_merchant_account",
|
36
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize
|
37
|
+
)
|
38
|
+
|
39
|
+
transaction.amount.should == BigDecimal.new(Braintree::Test::TransactionAmounts::Authorize)
|
40
|
+
transaction.type.should == "sale"
|
41
|
+
ideal_payment_details = transaction.ideal_payment_details
|
42
|
+
ideal_payment_details.ideal_payment_id.should =~ /^idealpayment_\w{6,}$/
|
43
|
+
ideal_payment_details.ideal_transaction_id.should =~ /^\d{16,}$/
|
44
|
+
ideal_payment_details.image_url.should start_with("https://")
|
45
|
+
ideal_payment_details.masked_iban.should_not be_empty
|
46
|
+
ideal_payment_details.bic.should_not be_empty
|
47
|
+
end
|
48
|
+
|
49
|
+
it "does not create a transaction using an ideal payment and returns raises an exception" do
|
50
|
+
expect do
|
51
|
+
Braintree::IdealPayment.sale!(
|
52
|
+
"invalid_nonce",
|
53
|
+
:merchant_account_id => "ideal_merchant_account",
|
54
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize
|
55
|
+
)
|
56
|
+
end.to raise_error(Braintree::ValidationsFailed)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "self.find" do
|
61
|
+
it "finds the Ideal payment with an id" do
|
62
|
+
ideal_payment_id = generate_valid_ideal_payment_nonce
|
63
|
+
ideal_payment = Braintree::IdealPayment.find(ideal_payment_id)
|
64
|
+
|
65
|
+
ideal_payment.id.should =~ /^idealpayment_\w{6,}$/
|
66
|
+
ideal_payment.ideal_transaction_id.should =~ /^\d{16,}$/
|
67
|
+
ideal_payment.currency.should_not be_empty
|
68
|
+
ideal_payment.amount.should_not be_empty
|
69
|
+
ideal_payment.status.should_not be_empty
|
70
|
+
ideal_payment.order_id.should_not be_empty
|
71
|
+
ideal_payment.issuer.should_not be_empty
|
72
|
+
ideal_payment.approval_url.should start_with("https://")
|
73
|
+
ideal_payment.iban_bank_account.account_holder_name.should_not be_empty
|
74
|
+
ideal_payment.iban_bank_account.bic.should_not be_empty
|
75
|
+
ideal_payment.iban_bank_account.masked_iban.should_not be_empty
|
76
|
+
ideal_payment.iban_bank_account.iban_account_number_last_4.should =~ /^\d{4}$/
|
77
|
+
ideal_payment.iban_bank_account.iban_country.should_not be_empty
|
78
|
+
ideal_payment.iban_bank_account.description.should_not be_empty
|
79
|
+
end
|
80
|
+
|
81
|
+
it "raises if the Ideal payment is not found" do
|
82
|
+
expect do
|
83
|
+
Braintree::IdealPayment.find("idealpayment_nxyqkq_s654wq_92jr64_mnr4kr_yjz")
|
84
|
+
end.to raise_error(Braintree::NotFoundError)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -135,6 +135,109 @@ describe Braintree::MerchantAccount do
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
+
describe "create_for_currency" do
|
139
|
+
it "creates a new merchant account for currency" do
|
140
|
+
result = SpecHelper::create_merchant
|
141
|
+
result.should be_success
|
142
|
+
|
143
|
+
gateway = Braintree::Gateway.new(
|
144
|
+
:access_token => result.credentials.access_token,
|
145
|
+
:logger => Logger.new("/dev/null")
|
146
|
+
)
|
147
|
+
|
148
|
+
result = gateway.merchant_account.create_for_currency(
|
149
|
+
:currency => "JPY"
|
150
|
+
)
|
151
|
+
result.should be_success
|
152
|
+
result.merchant_account.currency_iso_code.should == "JPY"
|
153
|
+
end
|
154
|
+
|
155
|
+
it "returns error if a merchant account already exists for that currency" do
|
156
|
+
result = SpecHelper::create_merchant
|
157
|
+
result.should be_success
|
158
|
+
|
159
|
+
gateway = Braintree::Gateway.new(
|
160
|
+
:access_token => result.credentials.access_token,
|
161
|
+
:logger => Logger.new("/dev/null")
|
162
|
+
)
|
163
|
+
|
164
|
+
result = gateway.merchant_account.create_for_currency(
|
165
|
+
:currency => "USD"
|
166
|
+
)
|
167
|
+
result.should be_success
|
168
|
+
|
169
|
+
result = gateway.merchant_account.create_for_currency(
|
170
|
+
:currency => "USD"
|
171
|
+
)
|
172
|
+
result.should_not be_success
|
173
|
+
|
174
|
+
errors = result.errors.for(:merchant).on(:currency)
|
175
|
+
errors[0].code.should == Braintree::ErrorCodes::Merchant::MerchantAccountExistsForCurrency
|
176
|
+
end
|
177
|
+
|
178
|
+
it "returns error if no currency is provided" do
|
179
|
+
result = SpecHelper::create_merchant
|
180
|
+
result.should be_success
|
181
|
+
|
182
|
+
gateway = Braintree::Gateway.new(
|
183
|
+
:access_token => result.credentials.access_token,
|
184
|
+
:logger => Logger.new("/dev/null")
|
185
|
+
)
|
186
|
+
|
187
|
+
result = gateway.merchant_account.create_for_currency(
|
188
|
+
:currency => nil
|
189
|
+
)
|
190
|
+
result.should_not be_success
|
191
|
+
|
192
|
+
errors = result.errors.for(:merchant).on(:currency)
|
193
|
+
errors[0].code.should == Braintree::ErrorCodes::Merchant::CurrencyIsRequired
|
194
|
+
|
195
|
+
result = gateway.merchant_account.create_for_currency({})
|
196
|
+
result.should_not be_success
|
197
|
+
|
198
|
+
errors = result.errors.for(:merchant).on(:currency)
|
199
|
+
errors[0].code.should == Braintree::ErrorCodes::Merchant::CurrencyIsRequired
|
200
|
+
end
|
201
|
+
|
202
|
+
it "returns error if a currency is not supported" do
|
203
|
+
result = SpecHelper::create_merchant
|
204
|
+
result.should be_success
|
205
|
+
|
206
|
+
gateway = Braintree::Gateway.new(
|
207
|
+
:access_token => result.credentials.access_token,
|
208
|
+
:logger => Logger.new("/dev/null")
|
209
|
+
)
|
210
|
+
|
211
|
+
result = gateway.merchant_account.create_for_currency(
|
212
|
+
:currency => "FAKE_CURRENCY"
|
213
|
+
)
|
214
|
+
result.should_not be_success
|
215
|
+
|
216
|
+
errors = result.errors.for(:merchant).on(:currency)
|
217
|
+
errors[0].code.should == Braintree::ErrorCodes::Merchant::CurrencyIsInvalid
|
218
|
+
end
|
219
|
+
|
220
|
+
it "returns error if id is passed and already taken" do
|
221
|
+
result = SpecHelper::create_merchant
|
222
|
+
result.should be_success
|
223
|
+
|
224
|
+
gateway = Braintree::Gateway.new(
|
225
|
+
:access_token => result.credentials.access_token,
|
226
|
+
:logger => Logger.new("/dev/null")
|
227
|
+
)
|
228
|
+
|
229
|
+
merchant = result.merchant
|
230
|
+
result = gateway.merchant_account.create_for_currency(
|
231
|
+
:currency => "USD",
|
232
|
+
:id => merchant.merchant_accounts.first.id
|
233
|
+
)
|
234
|
+
result.should_not be_success
|
235
|
+
|
236
|
+
errors = result.errors.for(:merchant).on(:id)
|
237
|
+
errors[0].code.should == Braintree::ErrorCodes::Merchant::MerchantAccountExistsForId
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
138
241
|
describe "find" do
|
139
242
|
it "finds the merchant account with the given token" do
|
140
243
|
result = Braintree::MerchantAccount.create(VALID_APPLICATION_PARAMS)
|