braintree 3.4.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/braintree.gemspec +2 -2
- data/lib/braintree.rb +4 -0
- data/lib/braintree/address.rb +1 -0
- data/lib/braintree/apple_pay_card.rb +9 -0
- data/lib/braintree/credit_card_gateway.rb +11 -1
- data/lib/braintree/customer.rb +4 -2
- data/lib/braintree/customer_gateway.rb +2 -0
- data/lib/braintree/dispute.rb +14 -0
- data/lib/braintree/dispute/paypal_message.rb +15 -0
- data/lib/braintree/dispute_search.rb +1 -0
- data/lib/braintree/error_codes.rb +4 -6
- data/lib/braintree/google_pay_card.rb +9 -0
- data/lib/braintree/payment_method_gateway.rb +7 -4
- data/lib/braintree/payment_method_nonce.rb +7 -4
- data/lib/braintree/payment_method_nonce_details.rb +37 -0
- data/lib/braintree/payment_method_nonce_details_payer_info.rb +32 -0
- data/lib/braintree/transaction/paypal_details.rb +2 -0
- data/lib/braintree/transaction_gateway.rb +3 -3
- data/lib/braintree/version.rb +2 -2
- data/lib/braintree/webhook_notification.rb +2 -1
- data/lib/braintree/webhook_testing_gateway.rb +20 -0
- data/lib/braintree/xml/libxml.rb +0 -1
- data/lib/braintree/xml/parser.rb +12 -2
- data/lib/braintree/xml/rexml.rb +70 -0
- data/spec/integration/braintree/address_spec.rb +4 -0
- data/spec/integration/braintree/credit_card_spec.rb +89 -0
- data/spec/integration/braintree/customer_spec.rb +144 -0
- data/spec/integration/braintree/dispute_search_spec.rb +25 -0
- data/spec/integration/braintree/merchant_account_spec.rb +3 -3
- data/spec/integration/braintree/payment_method_nonce_spec.rb +16 -23
- data/spec/integration/braintree/payment_method_spec.rb +131 -0
- data/spec/integration/braintree/transaction_spec.rb +82 -2
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/braintree/credit_card_spec.rb +6 -6
- data/spec/unit/braintree/customer_spec.rb +17 -7
- data/spec/unit/braintree/dispute_search_spec.rb +1 -0
- data/spec/unit/braintree/dispute_spec.rb +26 -1
- data/spec/unit/braintree/payment_method_nonce_details_payer_info_spec.rb +31 -0
- data/spec/unit/braintree/payment_method_nonce_details_spec.rb +43 -0
- data/spec/unit/braintree/payment_method_nonce_spec.rb +40 -0
- data/spec/unit/braintree/transaction/paypal_details_spec.rb +4 -0
- data/spec/unit/braintree/transaction_spec.rb +3 -3
- data/spec/unit/braintree/webhook_notification_spec.rb +16 -0
- data/spec/unit/braintree/xml/rexml_spec.rb +51 -0
- metadata +15 -7
data/lib/braintree/version.rb
CHANGED
@@ -25,6 +25,7 @@ module Braintree
|
|
25
25
|
GrantedPaymentInstrumentRevoked = "granted_payment_instrument_revoked"
|
26
26
|
|
27
27
|
GrantorUpdatedGrantedPaymentMethod = "grantor_updated_granted_payment_method"
|
28
|
+
GrantedPaymentMethodRevoked = "granted_payment_method_revoked"
|
28
29
|
|
29
30
|
LocalPaymentCompleted = "local_payment_completed"
|
30
31
|
LocalPaymentReversed = "local_payment_reversed"
|
@@ -95,7 +96,7 @@ module Braintree
|
|
95
96
|
@connected_merchant_status_transitioned = ConnectedMerchantStatusTransitioned._new(@subject[:connected_merchant_status_transitioned]) if @subject.has_key?(:connected_merchant_status_transitioned)
|
96
97
|
@connected_merchant_paypal_status_changed = ConnectedMerchantPayPalStatusChanged._new(@subject[:connected_merchant_paypal_status_changed]) if @subject.has_key?(:connected_merchant_paypal_status_changed)
|
97
98
|
@granted_payment_instrument_update = GrantedPaymentInstrumentUpdate._new(@subject[:granted_payment_instrument_update]) if @subject.has_key?(:granted_payment_instrument_update)
|
98
|
-
@revoked_payment_method_metadata = RevokedPaymentMethodMetadata._new(gateway, @subject) if [Kind::GrantedPaymentInstrumentRevoked, Kind::PaymentMethodRevokedByCustomer].include?(@kind)
|
99
|
+
@revoked_payment_method_metadata = RevokedPaymentMethodMetadata._new(gateway, @subject) if [Kind::GrantedPaymentInstrumentRevoked, Kind::PaymentMethodRevokedByCustomer, Kind::GrantedPaymentMethodRevoked].include?(@kind)
|
99
100
|
@local_payment_completed = LocalPaymentCompleted._new(@subject[:local_payment]) if @subject.has_key?(:local_payment) && Kind::LocalPaymentCompleted == @kind
|
100
101
|
@local_payment_reversed = LocalPaymentReversed._new(@subject[:local_payment_reversed]) if @subject.has_key?(:local_payment_reversed) && Kind::LocalPaymentReversed == @kind
|
101
102
|
end
|
@@ -82,6 +82,8 @@ module Braintree
|
|
82
82
|
_granted_payment_instrument_update_sample_xml(id)
|
83
83
|
when Braintree::WebhookNotification::Kind::RecipientUpdatedGrantedPaymentMethod
|
84
84
|
_granted_payment_instrument_update_sample_xml(id)
|
85
|
+
when Braintree::WebhookNotification::Kind::GrantedPaymentMethodRevoked
|
86
|
+
_granted_payment_method_revoked_xml(id)
|
85
87
|
when Braintree::WebhookNotification::Kind::PaymentMethodRevokedByCustomer
|
86
88
|
_payment_method_revoked_by_customer_sample_xml(id)
|
87
89
|
when Braintree::WebhookNotification::Kind::LocalPaymentCompleted
|
@@ -877,6 +879,24 @@ module Braintree
|
|
877
879
|
XML
|
878
880
|
end
|
879
881
|
|
882
|
+
def _granted_payment_method_revoked_xml(id)
|
883
|
+
<<-XML
|
884
|
+
<venmo-account>
|
885
|
+
<created-at type='dateTime'>2018-10-11T21:28:37Z</created-at>
|
886
|
+
<updated-at type='dateTime'>2018-10-11T21:28:37Z</updated-at>
|
887
|
+
<default type='boolean'>true</default>
|
888
|
+
<image-url>https://assets.braintreegateway.com/payment_method_logo/venmo.png?environment=test</image-url>
|
889
|
+
<token>#{id}</token>
|
890
|
+
<source-description>Venmo Account: venmojoe</source-description>
|
891
|
+
<username>venmojoe</username>
|
892
|
+
<venmo-user-id>456</venmo-user-id>
|
893
|
+
<subscriptions type='array'/>
|
894
|
+
<customer-id>venmo_customer_id</customer-id>
|
895
|
+
<global-id>cGF5bWVudG1ldGhvZF92ZW5tb2FjY291bnQ</global-id>
|
896
|
+
</venmo-account>
|
897
|
+
XML
|
898
|
+
end
|
899
|
+
|
880
900
|
def _payment_method_revoked_by_customer_sample_xml(id)
|
881
901
|
<<-XML
|
882
902
|
<paypal-account>
|
data/lib/braintree/xml/libxml.rb
CHANGED
data/lib/braintree/xml/parser.rb
CHANGED
@@ -11,12 +11,22 @@ module Braintree
|
|
11
11
|
"boolean" => Proc.new { |boolean| %w(1 true).include?(boolean.strip) },
|
12
12
|
}
|
13
13
|
|
14
|
-
def self.hash_from_xml(xml)
|
15
|
-
standardized_hash_structure =
|
14
|
+
def self.hash_from_xml(xml, parser = _determine_parser)
|
15
|
+
standardized_hash_structure = parser.parse(xml)
|
16
16
|
transformed_xml = _transform_xml(standardized_hash_structure)
|
17
17
|
Util.symbolize_keys(transformed_xml)
|
18
18
|
end
|
19
19
|
|
20
|
+
def self._determine_parser
|
21
|
+
# If LibXML is not available, we fall back to REXML
|
22
|
+
# This allows us to be compatible with JRuby, which LibXML does not support
|
23
|
+
if defined?(::LibXML::XML) && ::LibXML::XML.respond_to?(:default_keep_blanks=)
|
24
|
+
::Braintree::Xml::Libxml
|
25
|
+
else
|
26
|
+
::Braintree::Xml::Rexml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
20
30
|
# Transform into standard Ruby types and convert all keys to snake_case instead of dash-case
|
21
31
|
def self._transform_xml(value)
|
22
32
|
case value.class.to_s
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# Portions of this code were copied and modified from Ruby on Rails, released
|
2
|
+
# under the MIT license, copyright (c) 2005-2009 David Heinemeier Hansson
|
3
|
+
module Braintree
|
4
|
+
module Xml # :nodoc:
|
5
|
+
module Rexml # :nodoc:
|
6
|
+
|
7
|
+
CONTENT_KEY = "__content__".freeze
|
8
|
+
|
9
|
+
def self.parse(string)
|
10
|
+
require "rexml/document" unless defined?(REXML::Document)
|
11
|
+
doc = REXML::Document.new(string)
|
12
|
+
_merge_element!({}, doc.root)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self._merge_element!(hash, element)
|
16
|
+
_merge!(hash, element.name, _collapse(element))
|
17
|
+
end
|
18
|
+
|
19
|
+
def self._collapse(element)
|
20
|
+
hash = _get_attributes(element)
|
21
|
+
|
22
|
+
if element.has_elements?
|
23
|
+
element.each_element { |child| _merge_element!(hash, child) }
|
24
|
+
_merge_texts!(hash, element) unless _empty_content?(element)
|
25
|
+
hash
|
26
|
+
else
|
27
|
+
_merge_texts!(hash, element)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self._merge_texts!(hash, element)
|
32
|
+
unless element.has_text?
|
33
|
+
hash
|
34
|
+
else
|
35
|
+
# must use value to prevent double-escaping
|
36
|
+
_merge!(
|
37
|
+
hash,
|
38
|
+
CONTENT_KEY,
|
39
|
+
element.texts.map { |t| t.value }.join,
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self._merge!(hash, key, value)
|
45
|
+
if hash.has_key?(key)
|
46
|
+
if hash[key].instance_of?(Array)
|
47
|
+
hash[key] << value
|
48
|
+
else
|
49
|
+
hash[key] = [hash[key], value]
|
50
|
+
end
|
51
|
+
elsif value.instance_of?(Array)
|
52
|
+
hash[key] = [value]
|
53
|
+
else
|
54
|
+
hash[key] = value
|
55
|
+
end
|
56
|
+
hash
|
57
|
+
end
|
58
|
+
|
59
|
+
def self._get_attributes(element)
|
60
|
+
attributes = {}
|
61
|
+
element.attributes.each { |n,v| attributes[n] = v }
|
62
|
+
attributes
|
63
|
+
end
|
64
|
+
|
65
|
+
def self._empty_content?(element)
|
66
|
+
element.texts.join.strip == ""
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -14,6 +14,7 @@ describe Braintree::Address do
|
|
14
14
|
:extended_address => "Suite 200",
|
15
15
|
:locality => "Chicago",
|
16
16
|
:region => "Illinois",
|
17
|
+
:phone_number => "5551231234",
|
17
18
|
:postal_code => "60622",
|
18
19
|
:country_name => "United States of America",
|
19
20
|
)
|
@@ -26,6 +27,7 @@ describe Braintree::Address do
|
|
26
27
|
result.address.extended_address.should == "Suite 200"
|
27
28
|
result.address.locality.should == "Chicago"
|
28
29
|
result.address.region.should == "Illinois"
|
30
|
+
result.address.phone_number.should == "5551231234"
|
29
31
|
result.address.postal_code.should == "60622"
|
30
32
|
result.address.country_name.should == "United States of America"
|
31
33
|
result.address.country_code_alpha2.should == "US"
|
@@ -131,6 +133,7 @@ describe Braintree::Address do
|
|
131
133
|
:extended_address => "Suite 201",
|
132
134
|
:locality => "Bartlett",
|
133
135
|
:region => "IL",
|
136
|
+
:phone_number => "5551231234",
|
134
137
|
:postal_code => "60623",
|
135
138
|
:country_name => "United States of America",
|
136
139
|
)
|
@@ -139,6 +142,7 @@ describe Braintree::Address do
|
|
139
142
|
address.extended_address.should == "Suite 201"
|
140
143
|
address.locality.should == "Bartlett"
|
141
144
|
address.region.should == "IL"
|
145
|
+
address.phone_number.should == "5551231234"
|
142
146
|
address.postal_code.should == "60623"
|
143
147
|
address.country_name.should == "United States of America"
|
144
148
|
end
|
@@ -157,6 +157,48 @@ describe Braintree::CreditCard do
|
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
|
+
it "includes risk data when skip_advanced_fraud_checking is false" do
|
161
|
+
with_fraud_protection_enterprise_merchant do
|
162
|
+
customer = Braintree::Customer.create!
|
163
|
+
result = Braintree::CreditCard.create(
|
164
|
+
:cardholder_name => "Original Holder",
|
165
|
+
:customer_id => customer.id,
|
166
|
+
:cvv => "123",
|
167
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
168
|
+
:expiration_date => "05/2020",
|
169
|
+
:options => {
|
170
|
+
:skip_advanced_fraud_checking => false,
|
171
|
+
:verify_card => true,
|
172
|
+
},
|
173
|
+
)
|
174
|
+
|
175
|
+
expect(result).to be_success
|
176
|
+
verification = result.credit_card.verification
|
177
|
+
expect(verification.risk_data).not_to be_nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it "does not include risk data when skip_advanced_fraud_checking is true" do
|
182
|
+
with_fraud_protection_enterprise_merchant do
|
183
|
+
customer = Braintree::Customer.create!
|
184
|
+
result = Braintree::CreditCard.create(
|
185
|
+
:cardholder_name => "Original Holder",
|
186
|
+
:customer_id => customer.id,
|
187
|
+
:cvv => "123",
|
188
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
189
|
+
:expiration_date => "05/2020",
|
190
|
+
:options => {
|
191
|
+
:skip_advanced_fraud_checking => true,
|
192
|
+
:verify_card => true,
|
193
|
+
},
|
194
|
+
)
|
195
|
+
|
196
|
+
expect(result).to be_success
|
197
|
+
verification = result.credit_card.verification
|
198
|
+
expect(verification.risk_data).to be_nil
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
160
202
|
it "exposes the gateway rejection reason on verification" do
|
161
203
|
old_merchant = Braintree::Configuration.merchant_id
|
162
204
|
old_public_key = Braintree::Configuration.public_key
|
@@ -852,7 +894,54 @@ describe Braintree::CreditCard do
|
|
852
894
|
)
|
853
895
|
|
854
896
|
result.success?.should == true
|
897
|
+
end
|
855
898
|
|
899
|
+
it "includes risk data when skip_advanced_fraud_checking is false" do
|
900
|
+
with_fraud_protection_enterprise_merchant do
|
901
|
+
customer = Braintree::Customer.create!
|
902
|
+
credit_card = Braintree::CreditCard.create!(
|
903
|
+
:cardholder_name => "Original Holder",
|
904
|
+
:customer_id => customer.id,
|
905
|
+
:cvv => "123",
|
906
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
907
|
+
:expiration_date => "05/2020",
|
908
|
+
)
|
909
|
+
updated_result = Braintree::CreditCard.update(credit_card.token,
|
910
|
+
:expiration_date => "05/2021",
|
911
|
+
:options => {
|
912
|
+
:verify_card => true,
|
913
|
+
:skip_advanced_fraud_checking => false,
|
914
|
+
},
|
915
|
+
)
|
916
|
+
|
917
|
+
expect(updated_result).to be_success
|
918
|
+
verification = updated_result.credit_card.verification
|
919
|
+
expect(verification.risk_data).not_to be_nil
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
923
|
+
it "does not include risk data when skip_advanced_fraud_checking is true" do
|
924
|
+
with_fraud_protection_enterprise_merchant do
|
925
|
+
customer = Braintree::Customer.create!
|
926
|
+
credit_card = Braintree::CreditCard.create!(
|
927
|
+
:cardholder_name => "Original Holder",
|
928
|
+
:customer_id => customer.id,
|
929
|
+
:cvv => "123",
|
930
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
931
|
+
:expiration_date => "05/2020",
|
932
|
+
)
|
933
|
+
updated_result = Braintree::CreditCard.update(credit_card.token,
|
934
|
+
:expiration_date => "05/2021",
|
935
|
+
:options => {
|
936
|
+
:verify_card => true,
|
937
|
+
:skip_advanced_fraud_checking => true,
|
938
|
+
},
|
939
|
+
)
|
940
|
+
|
941
|
+
expect(updated_result).to be_success
|
942
|
+
verification = updated_result.credit_card.verification
|
943
|
+
expect(verification.risk_data).to be_nil
|
944
|
+
end
|
856
945
|
end
|
857
946
|
|
858
947
|
context "billing address" do
|
@@ -40,6 +40,7 @@ describe Braintree::Customer do
|
|
40
40
|
:phone => "312.555.1234",
|
41
41
|
:fax => "614.555.5678",
|
42
42
|
:website => "www.microsoft.com",
|
43
|
+
:tax_identifiers => [{:country_code => "US", :identifier => "987654321"}],
|
43
44
|
)
|
44
45
|
result.success?.should == true
|
45
46
|
result.customer.id.should =~ /^\d{6,}$/
|
@@ -114,6 +115,57 @@ describe Braintree::Customer do
|
|
114
115
|
result.should be_success
|
115
116
|
end
|
116
117
|
|
118
|
+
it "includes risk data when skip_advanced_fraud_checking is false" do
|
119
|
+
with_fraud_protection_enterprise_merchant do
|
120
|
+
result = Braintree::Customer.create(
|
121
|
+
:credit_card => {
|
122
|
+
:number => Braintree::Test::CreditCardNumbers::MasterCard,
|
123
|
+
:expiration_date => "05/2010",
|
124
|
+
:cvv => "100",
|
125
|
+
:options => {
|
126
|
+
:skip_advanced_fraud_checking => false,
|
127
|
+
:verify_card => true,
|
128
|
+
},
|
129
|
+
},
|
130
|
+
)
|
131
|
+
|
132
|
+
expect(result).to be_success
|
133
|
+
verification = result.customer.credit_cards.first.verification
|
134
|
+
expect(verification.risk_data).not_to be_nil
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
it "does not include risk data when skip_advanced_fraud_checking is true" do
|
139
|
+
with_fraud_protection_enterprise_merchant do
|
140
|
+
result = Braintree::Customer.create(
|
141
|
+
:credit_card => {
|
142
|
+
:number => Braintree::Test::CreditCardNumbers::MasterCard,
|
143
|
+
:expiration_date => "05/2010",
|
144
|
+
:cvv => "100",
|
145
|
+
:options => {
|
146
|
+
:skip_advanced_fraud_checking => true,
|
147
|
+
:verify_card => true,
|
148
|
+
},
|
149
|
+
},
|
150
|
+
)
|
151
|
+
|
152
|
+
expect(result).to be_success
|
153
|
+
verification = result.customer.credit_cards.first.verification
|
154
|
+
expect(verification.risk_data).to be_nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
it "supports creation with tax_identifiers" do
|
159
|
+
result = Braintree::Customer.create(
|
160
|
+
:tax_identifiers => [
|
161
|
+
{:country_code => "US", :identifier => "987654321"},
|
162
|
+
{:country_code => "CL", :identifier => "123456789"}
|
163
|
+
],
|
164
|
+
)
|
165
|
+
|
166
|
+
result.should be_success
|
167
|
+
end
|
168
|
+
|
117
169
|
it "can create without any attributes" do
|
118
170
|
result = Braintree::Customer.create
|
119
171
|
result.success?.should == true
|
@@ -969,6 +1021,15 @@ describe Braintree::Customer do
|
|
969
1021
|
apple_pay_card.token.should_not be_nil
|
970
1022
|
apple_pay_card.expiration_year.should_not be_nil
|
971
1023
|
apple_pay_card.payment_instrument_name.should == "AmEx 41002"
|
1024
|
+
apple_pay_card.commercial.should_not be_nil
|
1025
|
+
apple_pay_card.country_of_issuance.should_not be_nil
|
1026
|
+
apple_pay_card.debit.should_not be_nil
|
1027
|
+
apple_pay_card.durbin_regulated.should_not be_nil
|
1028
|
+
apple_pay_card.healthcare.should_not be_nil
|
1029
|
+
apple_pay_card.issuing_bank.should_not be_nil
|
1030
|
+
apple_pay_card.payroll.should_not be_nil
|
1031
|
+
apple_pay_card.prepaid.should_not be_nil
|
1032
|
+
apple_pay_card.product_id.should_not be_nil
|
972
1033
|
end
|
973
1034
|
|
974
1035
|
it "returns associated google pay proxy cards" do
|
@@ -985,6 +1046,15 @@ describe Braintree::Customer do
|
|
985
1046
|
google_pay_card.token.should_not be_nil
|
986
1047
|
google_pay_card.expiration_year.should_not be_nil
|
987
1048
|
google_pay_card.is_network_tokenized?.should == false
|
1049
|
+
google_pay_card.commercial.should_not be_nil
|
1050
|
+
google_pay_card.country_of_issuance.should_not be_nil
|
1051
|
+
google_pay_card.debit.should_not be_nil
|
1052
|
+
google_pay_card.durbin_regulated.should_not be_nil
|
1053
|
+
google_pay_card.healthcare.should_not be_nil
|
1054
|
+
google_pay_card.issuing_bank.should_not be_nil
|
1055
|
+
google_pay_card.payroll.should_not be_nil
|
1056
|
+
google_pay_card.prepaid.should_not be_nil
|
1057
|
+
google_pay_card.product_id.should_not be_nil
|
988
1058
|
end
|
989
1059
|
|
990
1060
|
it "returns associated google pay network tokens" do
|
@@ -1001,6 +1071,15 @@ describe Braintree::Customer do
|
|
1001
1071
|
google_pay_card.token.should_not be_nil
|
1002
1072
|
google_pay_card.expiration_year.should_not be_nil
|
1003
1073
|
google_pay_card.is_network_tokenized?.should == true
|
1074
|
+
google_pay_card.commercial.should_not be_nil
|
1075
|
+
google_pay_card.country_of_issuance.should_not be_nil
|
1076
|
+
google_pay_card.debit.should_not be_nil
|
1077
|
+
google_pay_card.durbin_regulated.should_not be_nil
|
1078
|
+
google_pay_card.healthcare.should_not be_nil
|
1079
|
+
google_pay_card.issuing_bank.should_not be_nil
|
1080
|
+
google_pay_card.payroll.should_not be_nil
|
1081
|
+
google_pay_card.prepaid.should_not be_nil
|
1082
|
+
google_pay_card.product_id.should_not be_nil
|
1004
1083
|
end
|
1005
1084
|
|
1006
1085
|
it "returns associated venmo accounts" do
|
@@ -1333,6 +1412,71 @@ describe Braintree::Customer do
|
|
1333
1412
|
result.success?.should == true
|
1334
1413
|
end
|
1335
1414
|
|
1415
|
+
it "includes risk data when skip_advanced_fraud_checking is false" do
|
1416
|
+
with_fraud_protection_enterprise_merchant do
|
1417
|
+
customer = Braintree::Customer.create!(
|
1418
|
+
:first_name => "Joe",
|
1419
|
+
)
|
1420
|
+
|
1421
|
+
updated_result = Braintree::Customer.update(
|
1422
|
+
customer.id,
|
1423
|
+
:credit_card => {
|
1424
|
+
:cardholder_name => "New Joe Cardholder",
|
1425
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
1426
|
+
:expiration_date => "12/2009",
|
1427
|
+
:options => {
|
1428
|
+
:skip_advanced_fraud_checking => false,
|
1429
|
+
:verify_card => true,
|
1430
|
+
},
|
1431
|
+
},
|
1432
|
+
)
|
1433
|
+
|
1434
|
+
expect(updated_result).to be_success
|
1435
|
+
verification = updated_result.customer.credit_cards.first.verification
|
1436
|
+
expect(verification.risk_data).not_to be_nil
|
1437
|
+
end
|
1438
|
+
end
|
1439
|
+
|
1440
|
+
it "does not include risk data when skip_advanced_fraud_checking is true" do
|
1441
|
+
with_fraud_protection_enterprise_merchant do
|
1442
|
+
customer = Braintree::Customer.create!(
|
1443
|
+
:first_name => "Joe",
|
1444
|
+
)
|
1445
|
+
|
1446
|
+
updated_result = Braintree::Customer.update(
|
1447
|
+
customer.id,
|
1448
|
+
:credit_card => {
|
1449
|
+
:cardholder_name => "New Joe Cardholder",
|
1450
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
1451
|
+
:expiration_date => "12/2009",
|
1452
|
+
:options => {
|
1453
|
+
:skip_advanced_fraud_checking => true,
|
1454
|
+
:verify_card => true,
|
1455
|
+
},
|
1456
|
+
},
|
1457
|
+
)
|
1458
|
+
|
1459
|
+
expect(updated_result).to be_success
|
1460
|
+
verification = updated_result.customer.credit_cards.first.verification
|
1461
|
+
expect(verification.risk_data).to be_nil
|
1462
|
+
end
|
1463
|
+
end
|
1464
|
+
|
1465
|
+
it "can update a tax_identifier" do
|
1466
|
+
customer = Braintree::Customer.create!(
|
1467
|
+
:tax_identifiers => [
|
1468
|
+
{:country_code => "US", :identifier => "987654321"},
|
1469
|
+
{:country_code => "CL", :identifier => "123456789"}
|
1470
|
+
],
|
1471
|
+
)
|
1472
|
+
|
1473
|
+
result = Braintree::Customer.update(
|
1474
|
+
customer.id,
|
1475
|
+
:tax_identifiers => [{:country_code => "US", :identifier => "567891234"}],
|
1476
|
+
)
|
1477
|
+
result.success?.should == true
|
1478
|
+
end
|
1479
|
+
|
1336
1480
|
it "validates presence of three_d_secure_version in 3ds pass thru params" do
|
1337
1481
|
result = Braintree::Customer.create(
|
1338
1482
|
:payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
|