braintree 3.1.0 → 4.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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/braintree.gemspec +3 -3
  3. data/lib/braintree.rb +8 -1
  4. data/lib/braintree/account_updater_daily_report.rb +1 -1
  5. data/lib/braintree/address.rb +2 -1
  6. data/lib/braintree/apple_pay.rb +1 -1
  7. data/lib/braintree/apple_pay_card.rb +1 -1
  8. data/lib/braintree/apple_pay_options.rb +1 -1
  9. data/lib/braintree/authorization_adjustment.rb +1 -1
  10. data/lib/braintree/client_token.rb +1 -1
  11. data/lib/braintree/configuration.rb +11 -11
  12. data/lib/braintree/connected_merchant_paypal_status_changed.rb +1 -1
  13. data/lib/braintree/connected_merchant_status_transitioned.rb +1 -1
  14. data/lib/braintree/credit_card.rb +2 -2
  15. data/lib/braintree/credit_card_gateway.rb +14 -4
  16. data/lib/braintree/credit_card_verification.rb +5 -5
  17. data/lib/braintree/credit_card_verification_search.rb +1 -1
  18. data/lib/braintree/customer.rb +6 -4
  19. data/lib/braintree/customer_gateway.rb +2 -0
  20. data/lib/braintree/customer_search.rb +1 -1
  21. data/lib/braintree/disbursement.rb +1 -1
  22. data/lib/braintree/dispute.rb +15 -1
  23. data/lib/braintree/dispute/paypal_message.rb +15 -0
  24. data/lib/braintree/dispute_gateway.rb +2 -2
  25. data/lib/braintree/dispute_search.rb +3 -2
  26. data/lib/braintree/document_upload.rb +1 -1
  27. data/lib/braintree/error_codes.rb +12 -4
  28. data/lib/braintree/google_pay_card.rb +1 -1
  29. data/lib/braintree/granted_payment_instrument_update.rb +1 -1
  30. data/lib/braintree/graphql_client.rb +7 -7
  31. data/lib/braintree/http.rb +3 -3
  32. data/lib/braintree/local_payment_completed.rb +1 -1
  33. data/lib/braintree/local_payment_reversed.rb +19 -0
  34. data/lib/braintree/merchant.rb +1 -1
  35. data/lib/braintree/merchant_account.rb +1 -1
  36. data/lib/braintree/merchant_account_gateway.rb +1 -1
  37. data/lib/braintree/merchant_gateway.rb +1 -1
  38. data/lib/braintree/modification.rb +1 -1
  39. data/lib/braintree/oauth_credentials.rb +1 -1
  40. data/lib/braintree/oauth_gateway.rb +5 -5
  41. data/lib/braintree/payment_instrument_type.rb +10 -10
  42. data/lib/braintree/payment_method_gateway.rb +11 -8
  43. data/lib/braintree/payment_method_nonce.rb +1 -1
  44. data/lib/braintree/payment_method_nonce_details.rb +37 -0
  45. data/lib/braintree/payment_method_nonce_details_payer_info.rb +32 -0
  46. data/lib/braintree/payment_method_nonce_gateway.rb +1 -1
  47. data/lib/braintree/plan.rb +1 -1
  48. data/lib/braintree/processor_response_types.rb +3 -3
  49. data/lib/braintree/resource_collection.rb +8 -3
  50. data/lib/braintree/revoked_payment_method_metadata.rb +1 -1
  51. data/lib/braintree/risk_data.rb +3 -1
  52. data/lib/braintree/samsung_pay_card.rb +1 -1
  53. data/lib/braintree/settlement_batch_summary.rb +2 -2
  54. data/lib/braintree/subscription.rb +6 -6
  55. data/lib/braintree/test/credit_card.rb +1 -0
  56. data/lib/braintree/three_d_secure_info.rb +22 -12
  57. data/lib/braintree/transaction.rb +40 -24
  58. data/lib/braintree/transaction/installment.rb +28 -0
  59. data/lib/braintree/transaction/installment/adjustment.rb +33 -0
  60. data/lib/braintree/transaction_gateway.rb +27 -6
  61. data/lib/braintree/transaction_line_item.rb +1 -1
  62. data/lib/braintree/transaction_search.rb +3 -1
  63. data/lib/braintree/unknown_payment_method.rb +1 -1
  64. data/lib/braintree/us_bank_account.rb +3 -3
  65. data/lib/braintree/us_bank_account_verification.rb +1 -1
  66. data/lib/braintree/us_bank_account_verification_gateway.rb +1 -1
  67. data/lib/braintree/util.rb +4 -4
  68. data/lib/braintree/venmo_account.rb +1 -1
  69. data/lib/braintree/version.rb +1 -1
  70. data/lib/braintree/visa_checkout_card.rb +2 -2
  71. data/lib/braintree/webhook_notification.rb +30 -20
  72. data/lib/braintree/webhook_notification_gateway.rb +5 -5
  73. data/lib/braintree/webhook_testing_gateway.rb +30 -0
  74. data/lib/braintree/xml/generator.rb +5 -4
  75. data/lib/braintree/xml/libxml.rb +0 -1
  76. data/lib/braintree/xml/parser.rb +22 -12
  77. data/lib/braintree/xml/rexml.rb +70 -0
  78. data/spec/integration/braintree/add_on_spec.rb +1 -1
  79. data/spec/integration/braintree/address_spec.rb +28 -24
  80. data/spec/integration/braintree/advanced_search_spec.rb +45 -45
  81. data/spec/integration/braintree/apple_pay_spec.rb +3 -3
  82. data/spec/integration/braintree/braintree_gateway_spec.rb +2 -1
  83. data/spec/integration/braintree/client_api/client_token_spec.rb +14 -14
  84. data/spec/integration/braintree/client_api/spec_helper.rb +5 -5
  85. data/spec/integration/braintree/credit_card_spec.rb +213 -122
  86. data/spec/integration/braintree/credit_card_verification_search_spec.rb +2 -2
  87. data/spec/integration/braintree/credit_card_verification_spec.rb +1 -1
  88. data/spec/integration/braintree/customer_search_spec.rb +8 -8
  89. data/spec/integration/braintree/customer_spec.rb +433 -149
  90. data/spec/integration/braintree/dispute_search_spec.rb +28 -3
  91. data/spec/integration/braintree/dispute_spec.rb +6 -6
  92. data/spec/integration/braintree/error_codes_spec.rb +1 -1
  93. data/spec/integration/braintree/http_spec.rb +2 -2
  94. data/spec/integration/braintree/merchant_account_spec.rb +25 -26
  95. data/spec/integration/braintree/merchant_spec.rb +14 -14
  96. data/spec/integration/braintree/oauth_spec.rb +11 -11
  97. data/spec/integration/braintree/payment_method_nonce_spec.rb +26 -35
  98. data/spec/integration/braintree/payment_method_spec.rb +430 -149
  99. data/spec/integration/braintree/payment_method_us_bank_account_spec.rb +17 -13
  100. data/spec/integration/braintree/paypal_account_spec.rb +28 -28
  101. data/spec/integration/braintree/samsung_pay_card_spec.rb +9 -9
  102. data/spec/integration/braintree/settlement_batch_summary_spec.rb +8 -8
  103. data/spec/integration/braintree/subscription_spec.rb +133 -133
  104. data/spec/integration/braintree/test/transaction_amounts_spec.rb +2 -2
  105. data/spec/integration/braintree/test_transaction_spec.rb +10 -10
  106. data/spec/integration/braintree/transaction_search_spec.rb +93 -67
  107. data/spec/integration/braintree/transaction_spec.rb +752 -383
  108. data/spec/integration/braintree/transaction_us_bank_account_spec.rb +32 -26
  109. data/spec/integration/braintree/us_bank_account_spec.rb +6 -6
  110. data/spec/integration/braintree/us_bank_account_verification_search_spec.rb +7 -7
  111. data/spec/integration/braintree/us_bank_account_verification_spec.rb +8 -8
  112. data/spec/integration/braintree/visa_checkout_card_spec.rb +5 -5
  113. data/spec/integration/spec_helper.rb +9 -3
  114. data/spec/oauth_test_helper.rb +1 -1
  115. data/spec/script/httpsd.rb +6 -6
  116. data/spec/spec_helper.rb +6 -3
  117. data/spec/unit/braintree/address_spec.rb +1 -1
  118. data/spec/unit/braintree/apple_pay_card_spec.rb +1 -1
  119. data/spec/unit/braintree/client_token_spec.rb +2 -2
  120. data/spec/unit/braintree/configuration_spec.rb +42 -42
  121. data/spec/unit/braintree/credit_card_spec.rb +13 -13
  122. data/spec/unit/braintree/credit_card_verification_search_spec.rb +1 -1
  123. data/spec/unit/braintree/credit_card_verification_spec.rb +8 -4
  124. data/spec/unit/braintree/customer_spec.rb +21 -10
  125. data/spec/unit/braintree/disbursement_spec.rb +7 -7
  126. data/spec/unit/braintree/dispute_search_spec.rb +1 -0
  127. data/spec/unit/braintree/dispute_spec.rb +34 -9
  128. data/spec/unit/braintree/error_result_spec.rb +5 -5
  129. data/spec/unit/braintree/errors_spec.rb +8 -8
  130. data/spec/unit/braintree/http_spec.rb +5 -5
  131. data/spec/unit/braintree/merchant_account_spec.rb +1 -1
  132. data/spec/unit/braintree/payment_method_nonce_details_payer_info_spec.rb +31 -0
  133. data/spec/unit/braintree/payment_method_nonce_details_spec.rb +43 -0
  134. data/spec/unit/braintree/payment_method_spec.rb +1 -1
  135. data/spec/unit/braintree/paypal_account_spec.rb +2 -2
  136. data/spec/unit/braintree/resource_collection_spec.rb +30 -1
  137. data/spec/unit/braintree/risk_data_spec.rb +9 -5
  138. data/spec/unit/braintree/subscription_search_spec.rb +1 -1
  139. data/spec/unit/braintree/successful_result_spec.rb +1 -1
  140. data/spec/unit/braintree/three_d_secure_info_spec.rb +32 -14
  141. data/spec/unit/braintree/transaction/credit_card_details_spec.rb +3 -3
  142. data/spec/unit/braintree/transaction/customer_details_spec.rb +1 -1
  143. data/spec/unit/braintree/transaction/deposit_details_spec.rb +2 -2
  144. data/spec/unit/braintree/transaction/installment_spec.rb +25 -0
  145. data/spec/unit/braintree/transaction/paypal_details_spec.rb +1 -1
  146. data/spec/unit/braintree/transaction_search_spec.rb +12 -12
  147. data/spec/unit/braintree/transaction_spec.rb +25 -17
  148. data/spec/unit/braintree/util_spec.rb +18 -18
  149. data/spec/unit/braintree/validation_error_collection_spec.rb +36 -36
  150. data/spec/unit/braintree/webhook_notification_spec.rb +88 -56
  151. data/spec/unit/braintree/xml/rexml_spec.rb +51 -0
  152. data/spec/unit/braintree/xml_spec.rb +31 -31
  153. metadata +18 -8
  154. data/lib/braintree/settlement_batch.rb +0 -0
@@ -108,7 +108,7 @@ describe Braintree::CreditCardVerification, "search" do
108
108
  search.id.is verification.id
109
109
  search.created_at.between(
110
110
  created_at - 60,
111
- created_at + 60
111
+ created_at + 60,
112
112
  )
113
113
  end
114
114
 
@@ -135,7 +135,7 @@ describe Braintree::CreditCardVerification, "search" do
135
135
  search.id.is verification.id
136
136
  search.created_at.between(
137
137
  created_at - 300,
138
- created_at - 100
138
+ created_at - 100,
139
139
  )
140
140
  end
141
141
 
@@ -242,7 +242,7 @@ describe Braintree::CreditCardVerification, "search" do
242
242
  :cardholder_name => cardholder_name,
243
243
  :expiration_date => "05/2012",
244
244
  :number => Braintree::Test::CreditCardNumbers::CardTypeIndicators::Prepaid,
245
- :cvv => '200',
245
+ :cvv => "200",
246
246
  :options => {
247
247
  :verify_card => true
248
248
  }
@@ -36,7 +36,7 @@ describe Braintree::Transaction, "search" do
36
36
  :postal_code => "60622",
37
37
  :country_name => "United States of America"
38
38
  }
39
- }
39
+ },
40
40
  )
41
41
 
42
42
  customer = Braintree::Customer.find(customer.id)
@@ -96,7 +96,7 @@ describe Braintree::Transaction, "search" do
96
96
  :credit_card => {
97
97
  :number => Braintree::Test::CreditCardNumbers::Maestro,
98
98
  :expiration_date => "05/2012"
99
- }
99
+ },
100
100
  ).customer
101
101
 
102
102
  joe = Braintree::Customer.create(
@@ -104,7 +104,7 @@ describe Braintree::Transaction, "search" do
104
104
  :credit_card => {
105
105
  :number => Braintree::Test::CreditCardNumbers::Maestro,
106
106
  :expiration_date => "05/2012"
107
- }
107
+ },
108
108
  ).customer
109
109
 
110
110
  collection = Braintree::Customer.search do |search|
@@ -118,7 +118,7 @@ describe Braintree::Transaction, "search" do
118
118
  it "can search by created_at" do
119
119
  company = "Company #{rand(1_000_000)}"
120
120
  customer = Braintree::Customer.create!(
121
- :company => company
121
+ :company => company,
122
122
  )
123
123
 
124
124
  created_at = customer.created_at
@@ -128,7 +128,7 @@ describe Braintree::Transaction, "search" do
128
128
  search.company.is company
129
129
  search.created_at.between(
130
130
  created_at - 60,
131
- created_at + 60
131
+ created_at + 60,
132
132
  )
133
133
  end
134
134
 
@@ -155,7 +155,7 @@ describe Braintree::Transaction, "search" do
155
155
  search.company.is customer.company
156
156
  search.created_at.between(
157
157
  created_at - 300,
158
- created_at - 100
158
+ created_at - 100,
159
159
  )
160
160
  end
161
161
 
@@ -175,13 +175,13 @@ describe Braintree::Transaction, "search" do
175
175
  paypal_token = rand(36**3).to_s(36)
176
176
  nonce = nonce_for_paypal_account(
177
177
  :consent_code => "PAYPAL_CONSENT_CODE",
178
- :token => paypal_token
178
+ :token => paypal_token,
179
179
  )
180
180
 
181
181
  customer_id = "UNIQUE_CUSTOMER_ID_" + rand(36**3).to_s(36)
182
182
  customer = Braintree::Customer.create!(
183
183
  :payment_method_nonce => nonce,
184
- :id => customer_id
184
+ :id => customer_id,
185
185
  )
186
186
 
187
187
  collection = Braintree::Customer.search do |search|
@@ -8,7 +8,7 @@ describe Braintree::Customer do
8
8
  customers = Braintree::Customer.all
9
9
  customers.maximum_size.should > 100
10
10
 
11
- customer_ids = customers.map {|c| c.id }.uniq.compact
11
+ customer_ids = customers.map { |c| c.id }.uniq.compact
12
12
  customer_ids.size.should == customers.maximum_size
13
13
  end
14
14
  end
@@ -17,7 +17,7 @@ describe Braintree::Customer do
17
17
  it "deletes the customer with the given id" do
18
18
  create_result = Braintree::Customer.create(
19
19
  :first_name => "Joe",
20
- :last_name => "Cool"
20
+ :last_name => "Cool",
21
21
  )
22
22
  create_result.success?.should == true
23
23
  customer = create_result.customer
@@ -39,7 +39,8 @@ describe Braintree::Customer do
39
39
  :email => "bill@microsoft.com",
40
40
  :phone => "312.555.1234",
41
41
  :fax => "614.555.5678",
42
- :website => "www.microsoft.com"
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,}$/
@@ -58,7 +59,7 @@ describe Braintree::Customer do
58
59
  oauth_gateway = Braintree::Gateway.new(
59
60
  :client_id => "client_id$#{Braintree::Configuration.environment}$integration_client_id",
60
61
  :client_secret => "client_secret$#{Braintree::Configuration.environment}$integration_client_secret",
61
- :logger => Logger.new("/dev/null")
62
+ :logger => Logger.new("/dev/null"),
62
63
  )
63
64
  access_token = Braintree::OAuthTestHelper.create_token(oauth_gateway, {
64
65
  :merchant_public_id => "integration_merchant_id",
@@ -67,7 +68,7 @@ describe Braintree::Customer do
67
68
 
68
69
  gateway = Braintree::Gateway.new(
69
70
  :access_token => access_token,
70
- :logger => Logger.new("/dev/null")
71
+ :logger => Logger.new("/dev/null"),
71
72
  )
72
73
 
73
74
  result = gateway.customer.create(
@@ -77,7 +78,7 @@ describe Braintree::Customer do
77
78
  :email => "joe@example.com",
78
79
  :phone => "312.555.1234",
79
80
  :fax => "614.555.5678",
80
- :website => "www.example.com"
81
+ :website => "www.example.com",
81
82
  )
82
83
  result.success?.should == true
83
84
  result.customer.id.should =~ /^\d{6,}$/
@@ -92,7 +93,7 @@ describe Braintree::Customer do
92
93
  :expiration_date => "05/2010",
93
94
  :cvv => "100",
94
95
  :device_data => "device_data",
95
- }
96
+ },
96
97
  )
97
98
 
98
99
  result.should be_success
@@ -108,7 +109,58 @@ describe Braintree::Customer do
108
109
  :risk_data => {
109
110
  :customer_browser => "IE5",
110
111
  :customer_ip => "192.168.0.1"
111
- }
112
+ },
113
+ )
114
+
115
+ result.should be_success
116
+ end
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
+ ],
112
164
  )
113
165
 
114
166
  result.should be_success
@@ -134,21 +186,21 @@ describe Braintree::Customer do
134
186
  found_customer.last_name.should == last_name
135
187
  else
136
188
  result.customer.first_name.should == "José"
137
- result.customer.first_name.bytes.map {|b| b.to_s(8)}.should == ["112", "157", "163", "303", "251"]
189
+ result.customer.first_name.bytes.map { |b| b.to_s(8) }.should == ["112", "157", "163", "303", "251"]
138
190
  result.customer.last_name.should == "Muñoz"
139
- result.customer.last_name.bytes.map {|b| b.to_s(8)}.should == ["115", "165", "303", "261", "157", "172"]
191
+ result.customer.last_name.bytes.map { |b| b.to_s(8) }.should == ["115", "165", "303", "261", "157", "172"]
140
192
 
141
193
  found_customer = Braintree::Customer.find(result.customer.id)
142
194
  found_customer.first_name.should == "José"
143
- found_customer.first_name.bytes.map {|b| b.to_s(8)}.should == ["112", "157", "163", "303", "251"]
195
+ found_customer.first_name.bytes.map { |b| b.to_s(8) }.should == ["112", "157", "163", "303", "251"]
144
196
  found_customer.last_name.should == "Muñoz"
145
- found_customer.last_name.bytes.map {|b| b.to_s(8)}.should == ["115", "165", "303", "261", "157", "172"]
197
+ found_customer.last_name.bytes.map { |b| b.to_s(8) }.should == ["115", "165", "303", "261", "157", "172"]
146
198
  end
147
199
  end
148
200
 
149
201
  it "returns an error response if invalid" do
150
202
  result = Braintree::Customer.create(
151
- :email => "@invalid.com"
203
+ :email => "@invalid.com",
152
204
  )
153
205
  result.success?.should == false
154
206
  result.errors.for(:customer).on(:email)[0].message.should == "Email is an invalid format."
@@ -162,7 +214,7 @@ describe Braintree::Customer do
162
214
  :number => Braintree::Test::CreditCardNumbers::MasterCard,
163
215
  :expiration_date => "05/2010",
164
216
  :cvv => "100"
165
- }
217
+ },
166
218
  )
167
219
 
168
220
  result.success?.should == true
@@ -182,7 +234,7 @@ describe Braintree::Customer do
182
234
  :email => "other@example.com",
183
235
  :billing_agreement_id => "B-123456",
184
236
  :options => {:make_default => true}
185
- }
237
+ },
186
238
  )
187
239
 
188
240
  result.success?.should == true
@@ -200,7 +252,7 @@ describe Braintree::Customer do
200
252
  :number => Braintree::Test::CreditCardNumbers::FailsSandboxVerification::MasterCard,
201
253
  :expiration_date => "05/2010",
202
254
  :options => {:verify_card => true}
203
- }
255
+ },
204
256
  )
205
257
  result.success?.should == false
206
258
  result.credit_card_verification.status.should == Braintree::Transaction::Status::ProcessorDeclined
@@ -214,7 +266,7 @@ describe Braintree::Customer do
214
266
  :number => Braintree::Test::CreditCardNumbers::MasterCard,
215
267
  :expiration_date => "05/2019",
216
268
  :options => {:verify_card => true, :verification_amount => "2.00"}
217
- }
269
+ },
218
270
  )
219
271
  result.success?.should == true
220
272
  end
@@ -224,7 +276,7 @@ describe Braintree::Customer do
224
276
  Braintree::CreditCard.create(
225
277
  :customer_id => customer.id,
226
278
  :number => Braintree::Test::CreditCardNumbers::Visa,
227
- :expiration_date => "05/2015"
279
+ :expiration_date => "05/2015",
228
280
  )
229
281
 
230
282
  result = Braintree::Customer.create(
@@ -234,7 +286,7 @@ describe Braintree::Customer do
234
286
  :number => Braintree::Test::CreditCardNumbers::Visa,
235
287
  :expiration_date => "05/2015",
236
288
  :options => {:fail_on_duplicate_payment_method => true}
237
- }
289
+ },
238
290
  )
239
291
  result.success?.should == false
240
292
  result.errors.for(:customer).for(:credit_card).on(:number)[0].message.should == "Duplicate card exists in the vault."
@@ -251,12 +303,98 @@ describe Braintree::Customer do
251
303
  :verify_card => true,
252
304
  :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId
253
305
  }
254
- }
306
+ },
255
307
  )
256
308
  result.success?.should == false
257
309
  result.credit_card_verification.status.should == Braintree::Transaction::Status::ProcessorDeclined
258
310
  end
259
311
 
312
+ it "can create a customer and a payment method at the same time after validating verification_currency_iso_code" do
313
+ result = Braintree::Customer.create(
314
+ :first_name => "Mike",
315
+ :last_name => "Jones",
316
+ :credit_card => {
317
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
318
+ :expiration_date => "05/2010",
319
+ :cvv => "100",
320
+ :options => {
321
+ :verify_card => true,
322
+ :verification_currency_iso_code => "USD"
323
+ }
324
+ },
325
+ )
326
+
327
+ result.success?.should == true
328
+ result.customer.first_name.should == "Mike"
329
+ result.customer.last_name.should == "Jones"
330
+ result.customer.credit_cards[0].bin.should == Braintree::Test::CreditCardNumbers::MasterCard[0, 6]
331
+ result.customer.credit_cards[0].last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
332
+ result.customer.credit_cards[0].expiration_date.should == "05/2010"
333
+ result.customer.credit_cards[0].unique_number_identifier.should =~ /\A\w{32}\z/
334
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
335
+ end
336
+
337
+ it "errors when verification_currency_iso_code is not supported by merchant account" do
338
+ result = Braintree::Customer.create(
339
+ :first_name => "Mike",
340
+ :last_name => "Jones",
341
+ :credit_card => {
342
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
343
+ :expiration_date => "05/2010",
344
+ :cvv => "100",
345
+ :options => {
346
+ :verify_card => true,
347
+ :verification_currency_iso_code => "GBP"
348
+ }
349
+ },
350
+ )
351
+ expect(result).to_not be_success
352
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
353
+ end
354
+
355
+ it "validates verification_currency_iso_code of the given verification_merchant_account_id and creates customer" do
356
+ result = Braintree::Customer.create(
357
+ :first_name => "Mike",
358
+ :last_name => "Jones",
359
+ :credit_card => {
360
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
361
+ :expiration_date => "05/2010",
362
+ :options => {
363
+ :verify_card => true,
364
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
365
+ :verification_currency_iso_code => "USD"
366
+ }
367
+ },
368
+ )
369
+ result.success?.should == true
370
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
371
+ result.customer.first_name.should == "Mike"
372
+ result.customer.last_name.should == "Jones"
373
+ result.customer.credit_cards[0].bin.should == Braintree::Test::CreditCardNumbers::MasterCard[0, 6]
374
+ result.customer.credit_cards[0].last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
375
+ result.customer.credit_cards[0].expiration_date.should == "05/2010"
376
+ result.customer.credit_cards[0].unique_number_identifier.should =~ /\A\w{32}\z/
377
+ end
378
+
379
+ it "validates verification_currency_iso_code of the given verification_merchant_account_id and returns error" do
380
+ result = Braintree::Customer.create(
381
+ :first_name => "Mike",
382
+ :last_name => "Jones",
383
+ :credit_card => {
384
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
385
+ :expiration_date => "05/2010",
386
+ :options => {
387
+ :verify_card => true,
388
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
389
+ :verification_currency_iso_code => "GBP"
390
+ }
391
+ },
392
+ )
393
+ expect(result).to_not be_success
394
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
395
+ end
396
+
397
+
260
398
  it "can create a customer, payment method, and billing address at the same time" do
261
399
  result = Braintree::Customer.create(
262
400
  :first_name => "Mike",
@@ -272,7 +410,7 @@ describe Braintree::Customer do
272
410
  :postal_code => "60622",
273
411
  :country_name => "United States of America"
274
412
  }
275
- }
413
+ },
276
414
  )
277
415
  result.success?.should == true
278
416
  result.customer.first_name.should == "Mike"
@@ -303,7 +441,7 @@ describe Braintree::Customer do
303
441
  :country_code_alpha3 => "COM",
304
442
  :country_code_numeric => "174"
305
443
  }
306
- }
444
+ },
307
445
  )
308
446
  result.success?.should == true
309
447
  result.customer.addresses[0].country_name.should == "Comoros"
@@ -318,7 +456,7 @@ describe Braintree::Customer do
318
456
  :last_name => "Gates",
319
457
  :custom_fields => {
320
458
  :store_me => "custom value"
321
- }
459
+ },
322
460
  )
323
461
  result.success?.should == true
324
462
  result.customer.custom_fields[:store_me].should == "custom value"
@@ -328,7 +466,7 @@ describe Braintree::Customer do
328
466
  result = Braintree::Customer.create(
329
467
  :first_name => "Bill",
330
468
  :last_name => "Gates",
331
- :custom_fields => { :store_me => "" }
469
+ :custom_fields => {:store_me => ""},
332
470
  )
333
471
  result.success?.should == true
334
472
  result.customer.custom_fields.should == {}
@@ -342,7 +480,7 @@ describe Braintree::Customer do
342
480
  :billing_address => {
343
481
  :country_name => "invalid"
344
482
  }
345
- }
483
+ },
346
484
  )
347
485
  result.success?.should == false
348
486
  result.errors.for(:customer).on(:email)[0].message.should == "Email is an invalid format."
@@ -362,10 +500,10 @@ describe Braintree::Customer do
362
500
  :country_code_alpha2 => "US",
363
501
  :country_code_alpha3 => "COM",
364
502
  }
365
- }
503
+ },
366
504
  )
367
505
  result.success?.should == false
368
- result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:base).map {|e| e.code}.should include(Braintree::ErrorCodes::Address::InconsistentCountry)
506
+ result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:base).map { |e| e.code }.should include(Braintree::ErrorCodes::Address::InconsistentCountry)
369
507
  end
370
508
 
371
509
  it "returns an error if country code alpha2 is invalid" do
@@ -378,10 +516,10 @@ describe Braintree::Customer do
378
516
  :billing_address => {
379
517
  :country_code_alpha2 => "zz",
380
518
  }
381
- }
519
+ },
382
520
  )
383
521
  result.success?.should == false
384
- result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_alpha2).map {|e| e.code}.should include(Braintree::ErrorCodes::Address::CountryCodeAlpha2IsNotAccepted)
522
+ result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_alpha2).map { |e| e.code }.should include(Braintree::ErrorCodes::Address::CountryCodeAlpha2IsNotAccepted)
385
523
  end
386
524
 
387
525
  it "returns an error if country code alpha3 is invalid" do
@@ -394,10 +532,10 @@ describe Braintree::Customer do
394
532
  :billing_address => {
395
533
  :country_code_alpha3 => "zzz",
396
534
  }
397
- }
535
+ },
398
536
  )
399
537
  result.success?.should == false
400
- result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_alpha3).map {|e| e.code}.should include(Braintree::ErrorCodes::Address::CountryCodeAlpha3IsNotAccepted)
538
+ result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_alpha3).map { |e| e.code }.should include(Braintree::ErrorCodes::Address::CountryCodeAlpha3IsNotAccepted)
401
539
  end
402
540
 
403
541
  it "returns an error if country code numeric is invalid" do
@@ -410,10 +548,10 @@ describe Braintree::Customer do
410
548
  :billing_address => {
411
549
  :country_code_numeric => "zzz",
412
550
  }
413
- }
551
+ },
414
552
  )
415
553
  result.success?.should == false
416
- result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_numeric).map {|e| e.code}.should include(Braintree::ErrorCodes::Address::CountryCodeNumericIsNotAccepted)
554
+ result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_code_numeric).map { |e| e.code }.should include(Braintree::ErrorCodes::Address::CountryCodeNumericIsNotAccepted)
417
555
  end
418
556
 
419
557
  it "returns errors if custom_fields are not registered" do
@@ -422,7 +560,7 @@ describe Braintree::Customer do
422
560
  :last_name => "Kennedy",
423
561
  :custom_fields => {
424
562
  :spouse_name => "Jacqueline"
425
- }
563
+ },
426
564
  )
427
565
  result.success?.should == false
428
566
  result.errors.for(:customer).on(:custom_fields)[0].message.should == "Custom field is invalid: spouse_name."
@@ -435,7 +573,7 @@ describe Braintree::Customer do
435
573
  :last_name => "Hamlin",
436
574
  :credit_card => {
437
575
  :venmo_sdk_payment_method_code => Braintree::Test::VenmoSDK::VisaPaymentMethodCode
438
- }
576
+ },
439
577
  )
440
578
  result.success?.should == true
441
579
  result.customer.credit_cards.first.bin.should == "400934"
@@ -452,7 +590,7 @@ describe Braintree::Customer do
452
590
  :options => {
453
591
  :venmo_sdk_session => Braintree::Test::VenmoSDK::Session
454
592
  }
455
- }
593
+ },
456
594
  )
457
595
  result.success?.should == true
458
596
  result.customer.credit_cards.first.venmo_sdk?.should == false
@@ -467,13 +605,13 @@ describe Braintree::Customer do
467
605
  :expiration_month => "11",
468
606
  :expiration_year => "2099",
469
607
  },
470
- :share => true
608
+ :share => true,
471
609
  )
472
610
 
473
611
  result = Braintree::Customer.create(
474
612
  :credit_card => {
475
613
  :payment_method_nonce => nonce
476
- }
614
+ },
477
615
  )
478
616
 
479
617
  result.success?.should == true
@@ -503,7 +641,7 @@ describe Braintree::Customer do
503
641
  :number => Braintree::Test::CreditCardNumbers::Hiper,
504
642
  :expiration_month => "11",
505
643
  :expiration_year => "2099",
506
- }
644
+ },
507
645
  )
508
646
  result = Braintree::Customer.create(
509
647
  :payment_method_nonce => nonce,
@@ -513,7 +651,7 @@ describe Braintree::Customer do
513
651
  :verification_merchant_account_id => SpecHelper::HiperBRLMerchantAccountId,
514
652
  :verification_account_type => "debit",
515
653
  }
516
- }
654
+ },
517
655
  )
518
656
 
519
657
  expect(result).to be_success
@@ -525,7 +663,7 @@ describe Braintree::Customer do
525
663
  :number => Braintree::Test::CreditCardNumbers::Hiper,
526
664
  :expiration_month => "11",
527
665
  :expiration_year => "2099",
528
- }
666
+ },
529
667
  )
530
668
  result = Braintree::Customer.create(
531
669
  :payment_method_nonce => nonce,
@@ -535,7 +673,7 @@ describe Braintree::Customer do
535
673
  :verification_merchant_account_id => SpecHelper::HiperBRLMerchantAccountId,
536
674
  :verification_account_type => "credit",
537
675
  }
538
- }
676
+ },
539
677
  )
540
678
 
541
679
  expect(result).to be_success
@@ -547,7 +685,7 @@ describe Braintree::Customer do
547
685
  :number => Braintree::Test::CreditCardNumbers::Hiper,
548
686
  :expiration_month => "11",
549
687
  :expiration_year => "2099",
550
- }
688
+ },
551
689
  )
552
690
  result = Braintree::Customer.create(
553
691
  :payment_method_nonce => nonce,
@@ -557,7 +695,7 @@ describe Braintree::Customer do
557
695
  :verification_merchant_account_id => SpecHelper::HiperBRLMerchantAccountId,
558
696
  :verification_account_type => "ach",
559
697
  }
560
- }
698
+ },
561
699
  )
562
700
 
563
701
  expect(result).to_not be_success
@@ -570,7 +708,7 @@ describe Braintree::Customer do
570
708
  :number => Braintree::Test::CreditCardNumbers::Visa,
571
709
  :expiration_month => "11",
572
710
  :expiration_year => "2099",
573
- }
711
+ },
574
712
  )
575
713
  result = Braintree::Customer.create(
576
714
  :payment_method_nonce => nonce,
@@ -579,7 +717,7 @@ describe Braintree::Customer do
579
717
  :verify_card => true,
580
718
  :verification_account_type => "credit",
581
719
  }
582
- }
720
+ },
583
721
  )
584
722
 
585
723
  expect(result).to_not be_success
@@ -592,7 +730,7 @@ describe Braintree::Customer do
592
730
  it "returns the customer if successful" do
593
731
  customer = Braintree::Customer.create!(
594
732
  :first_name => "Jim",
595
- :last_name => "Smith"
733
+ :last_name => "Smith",
596
734
  )
597
735
  customer.id.should =~ /\d+/
598
736
  customer.first_name.should == "Jim"
@@ -617,7 +755,7 @@ describe Braintree::Customer do
617
755
  :credit_card => {
618
756
  :number => Braintree::Test::CreditCardNumbers::Visa,
619
757
  :expiration_date => "05/2010"
620
- }
758
+ },
621
759
  )
622
760
  result = Braintree::Customer.credit(customer.id, :amount => "100.00")
623
761
  result.success?.should == true
@@ -637,7 +775,7 @@ describe Braintree::Customer do
637
775
  :credit_card => {
638
776
  :number => Braintree::Test::CreditCardNumbers::Visa,
639
777
  :expiration_date => "05/2010"
640
- }
778
+ },
641
779
  )
642
780
  transaction = Braintree::Customer.credit!(customer.id, :amount => "100.00")
643
781
  transaction.amount.should == BigDecimal("100.00")
@@ -656,7 +794,7 @@ describe Braintree::Customer do
656
794
  :credit_card => {
657
795
  :number => Braintree::Test::CreditCardNumbers::Visa,
658
796
  :expiration_date => "05/2010"
659
- }
797
+ },
660
798
  )
661
799
  result = Braintree::Customer.sale(customer.id, :amount => "100.00")
662
800
  result.success?.should == true
@@ -676,7 +814,7 @@ describe Braintree::Customer do
676
814
  :credit_card => {
677
815
  :number => Braintree::Test::CreditCardNumbers::Visa,
678
816
  :expiration_date => "05/2010"
679
- }
817
+ },
680
818
  )
681
819
  transaction = Braintree::Customer.sale!(customer.id, :amount => "100.00")
682
820
  transaction.amount.should == BigDecimal("100.00")
@@ -695,7 +833,7 @@ describe Braintree::Customer do
695
833
  :credit_card => {
696
834
  :number => Braintree::Test::CreditCardNumbers::Visa,
697
835
  :expiration_date => "05/2010"
698
- }
836
+ },
699
837
  )
700
838
  transaction = Braintree::Customer.sale!(customer.id, :amount => "100.00")
701
839
  collection = Braintree::Customer.transactions(customer.id)
@@ -709,10 +847,10 @@ describe Braintree::Customer do
709
847
  :credit_card => {
710
848
  :number => Braintree::Test::CreditCardNumbers::Visa,
711
849
  :expiration_date => "05/2010"
712
- }
850
+ },
713
851
  )
714
852
  result = customer.credit(
715
- :amount => "100.00"
853
+ :amount => "100.00",
716
854
  )
717
855
  result.success?.should == true
718
856
  result.transaction.amount.should == BigDecimal("100.00")
@@ -731,7 +869,7 @@ describe Braintree::Customer do
731
869
  :credit_card => {
732
870
  :number => Braintree::Test::CreditCardNumbers::Visa,
733
871
  :expiration_date => "05/2010"
734
- }
872
+ },
735
873
  )
736
874
  transaction = customer.credit!(:amount => "100.00")
737
875
  transaction.amount.should == BigDecimal("100.00")
@@ -748,7 +886,7 @@ describe Braintree::Customer do
748
886
  it "deletes the customer" do
749
887
  result = Braintree::Customer.create(
750
888
  :first_name => "Joe",
751
- :last_name => "Cool"
889
+ :last_name => "Cool",
752
890
  )
753
891
  result.success?.should == true
754
892
 
@@ -765,7 +903,7 @@ describe Braintree::Customer do
765
903
  it "finds the customer with the given id" do
766
904
  result = Braintree::Customer.create(
767
905
  :first_name => "Joe",
768
- :last_name => "Cool"
906
+ :last_name => "Cool",
769
907
  )
770
908
  result.success?.should == true
771
909
 
@@ -781,13 +919,13 @@ describe Braintree::Customer do
781
919
  credit_card = Braintree::CreditCard.create(
782
920
  :customer_id => customer.id,
783
921
  :number => Braintree::Test::CreditCardNumbers::Visa,
784
- :expiration_date => "05/2012"
922
+ :expiration_date => "05/2012",
785
923
  ).credit_card
786
924
 
787
925
  subscription = Braintree::Subscription.create(
788
926
  :payment_method_token => credit_card.token,
789
927
  :plan_id => "integration_trialless_plan",
790
- :price => "1.00"
928
+ :price => "1.00",
791
929
  ).subscription
792
930
 
793
931
  found_customer = Braintree::Customer.find(customer.id)
@@ -802,7 +940,7 @@ describe Braintree::Customer do
802
940
  customer = Braintree::Customer.create(
803
941
  :custom_fields => {
804
942
  :store_me => "custom value"
805
- }
943
+ },
806
944
  ).customer
807
945
  credit_card = Braintree::CreditCard.create(
808
946
  :customer_id => customer.id,
@@ -814,13 +952,13 @@ describe Braintree::Customer do
814
952
  :region => "Illinois",
815
953
  :postal_code => "60622",
816
954
  :country_name => "United States of America"
817
- }
955
+ },
818
956
  ).credit_card
819
957
 
820
958
  subscription = Braintree::Subscription.create(
821
959
  :payment_method_token => credit_card.token,
822
960
  :plan_id => "integration_trialless_plan",
823
- :price => "1.00"
961
+ :price => "1.00",
824
962
  ).subscription
825
963
 
826
964
  found_customer = Braintree::Customer.find(customer.id, {
@@ -836,7 +974,7 @@ describe Braintree::Customer do
836
974
  customer = Braintree::Customer.create(
837
975
  :custom_fields => {
838
976
  :store_me => "custom value"
839
- }
977
+ },
840
978
  ).customer
841
979
  credit_card = Braintree::CreditCard.create(
842
980
  :customer_id => customer.id,
@@ -848,13 +986,13 @@ describe Braintree::Customer do
848
986
  :region => "Illinois",
849
987
  :postal_code => "60622",
850
988
  :country_name => "United States of America"
851
- }
989
+ },
852
990
  ).credit_card
853
991
 
854
992
  subscription = Braintree::Subscription.create(
855
993
  :payment_method_token => credit_card.token,
856
994
  :plan_id => "integration_trialless_plan",
857
- :price => "1.00"
995
+ :price => "1.00",
858
996
  ).subscription
859
997
 
860
998
  found_customer = Braintree::Customer.find(customer.id, {
@@ -872,7 +1010,7 @@ describe Braintree::Customer do
872
1010
 
873
1011
  it "returns associated ApplePayCards" do
874
1012
  result = Braintree::Customer.create(
875
- :payment_method_nonce => Braintree::Test::Nonce::ApplePayAmEx
1013
+ :payment_method_nonce => Braintree::Test::Nonce::ApplePayAmEx,
876
1014
  )
877
1015
  result.success?.should == true
878
1016
 
@@ -887,7 +1025,7 @@ describe Braintree::Customer do
887
1025
 
888
1026
  it "returns associated google pay proxy cards" do
889
1027
  result = Braintree::Customer.create(
890
- :payment_method_nonce => Braintree::Test::Nonce::GooglePayDiscover
1028
+ :payment_method_nonce => Braintree::Test::Nonce::GooglePayDiscover,
891
1029
  )
892
1030
  result.success?.should == true
893
1031
 
@@ -903,7 +1041,7 @@ describe Braintree::Customer do
903
1041
 
904
1042
  it "returns associated google pay network tokens" do
905
1043
  result = Braintree::Customer.create(
906
- :payment_method_nonce => Braintree::Test::Nonce::GooglePayMasterCard
1044
+ :payment_method_nonce => Braintree::Test::Nonce::GooglePayMasterCard,
907
1045
  )
908
1046
  result.success?.should == true
909
1047
 
@@ -919,7 +1057,7 @@ describe Braintree::Customer do
919
1057
 
920
1058
  it "returns associated venmo accounts" do
921
1059
  result = Braintree::Customer.create(
922
- :payment_method_nonce => Braintree::Test::Nonce::VenmoAccount
1060
+ :payment_method_nonce => Braintree::Test::Nonce::VenmoAccount,
923
1061
  )
924
1062
  result.success?.should == true
925
1063
 
@@ -939,7 +1077,7 @@ describe Braintree::Customer do
939
1077
  :options => {
940
1078
  :verification_merchant_account_id => SpecHelper::UsBankMerchantAccountId,
941
1079
  }
942
- }
1080
+ },
943
1081
  )
944
1082
  result.should be_success
945
1083
 
@@ -985,7 +1123,7 @@ describe Braintree::Customer do
985
1123
  it "updates the credit card with three_d_secure pass thru params" do
986
1124
  customer = Braintree::Customer.create!(
987
1125
  :first_name => "Joe",
988
- :last_name => "Cool"
1126
+ :last_name => "Cool",
989
1127
  )
990
1128
  result = Braintree::Customer.update(
991
1129
  customer.id,
@@ -998,17 +1136,17 @@ describe Braintree::Customer do
998
1136
  :number => 4111111111111111,
999
1137
  :expiration_date => "05/2060",
1000
1138
  :three_d_secure_pass_thru => {
1001
- :eci_flag => '02',
1002
- :cavv => 'some_cavv',
1003
- :xid => 'some_xid',
1004
- :three_d_secure_version => '1.0.2',
1005
- :authentication_response => 'Y',
1006
- :directory_response => 'Y',
1007
- :cavv_algorithm => '2',
1008
- :ds_transaction_id => 'some_ds_transaction_id',
1139
+ :eci_flag => "02",
1140
+ :cavv => "some_cavv",
1141
+ :xid => "some_xid",
1142
+ :three_d_secure_version => "1.0.2",
1143
+ :authentication_response => "Y",
1144
+ :directory_response => "Y",
1145
+ :cavv_algorithm => "2",
1146
+ :ds_transaction_id => "some_ds_transaction_id",
1009
1147
  },
1010
1148
  :options => {:verify_card => true},
1011
- }
1149
+ },
1012
1150
  )
1013
1151
  result.success?.should == true
1014
1152
  result.customer.id.should == customer.id
@@ -1020,7 +1158,7 @@ describe Braintree::Customer do
1020
1158
  it "validates the presence of three_d_secure_version while passing three_d_secure_pass_thru in update" do
1021
1159
  customer = Braintree::Customer.create!(
1022
1160
  :first_name => "Joe",
1023
- :last_name => "Cool"
1161
+ :last_name => "Cool",
1024
1162
  )
1025
1163
  result = Braintree::Customer.update(
1026
1164
  customer.id,
@@ -1033,16 +1171,16 @@ describe Braintree::Customer do
1033
1171
  :number => 4111111111111111,
1034
1172
  :expiration_date => "05/2060",
1035
1173
  :three_d_secure_pass_thru => {
1036
- :eci_flag => '02',
1037
- :cavv => 'some_cavv',
1038
- :xid => 'some_xid',
1039
- :authentication_response => 'Y',
1040
- :directory_response => 'Y',
1041
- :cavv_algorithm => '2',
1042
- :ds_transaction_id => 'some_ds_transaction_id',
1174
+ :eci_flag => "02",
1175
+ :cavv => "some_cavv",
1176
+ :xid => "some_xid",
1177
+ :authentication_response => "Y",
1178
+ :directory_response => "Y",
1179
+ :cavv_algorithm => "2",
1180
+ :ds_transaction_id => "some_ds_transaction_id",
1043
1181
  },
1044
1182
  options: {:verify_card => true}
1045
- }
1183
+ },
1046
1184
  )
1047
1185
  expect(result).to_not be_success
1048
1186
  error = result.errors.for(:verification).first
@@ -1053,7 +1191,7 @@ describe Braintree::Customer do
1053
1191
  it "updates the customer with the given id if successful" do
1054
1192
  customer = Braintree::Customer.create!(
1055
1193
  :first_name => "Joe",
1056
- :last_name => "Cool"
1194
+ :last_name => "Cool",
1057
1195
  )
1058
1196
  result = Braintree::Customer.update(
1059
1197
  customer.id,
@@ -1061,7 +1199,7 @@ describe Braintree::Customer do
1061
1199
  :last_name => "Super Cool",
1062
1200
  :custom_fields => {
1063
1201
  :store_me => "a value"
1064
- }
1202
+ },
1065
1203
  )
1066
1204
  result.success?.should == true
1067
1205
  result.customer.id.should == customer.id
@@ -1075,7 +1213,7 @@ describe Braintree::Customer do
1075
1213
  :credit_card => {
1076
1214
  :number => 4111111111111111,
1077
1215
  :expiration_date => "05/2010",
1078
- }
1216
+ },
1079
1217
  )
1080
1218
  result = Braintree::Customer.update(
1081
1219
  customer.id,
@@ -1085,7 +1223,7 @@ describe Braintree::Customer do
1085
1223
  :options=> {
1086
1224
  :fail_on_duplicate_payment_method => true
1087
1225
  }
1088
- }
1226
+ },
1089
1227
  )
1090
1228
  result.success?.should == false
1091
1229
  result.errors.for(:customer).for(:credit_card).on(:number)[0].message.should == "Duplicate card exists in the vault."
@@ -1094,7 +1232,7 @@ describe Braintree::Customer do
1094
1232
  it "updates the default payment method" do
1095
1233
  customer = Braintree::Customer.create!(
1096
1234
  :first_name => "Joe",
1097
- :last_name => "Brown"
1235
+ :last_name => "Brown",
1098
1236
  )
1099
1237
 
1100
1238
  token1 = random_payment_method_token
@@ -1102,7 +1240,7 @@ describe Braintree::Customer do
1102
1240
  payment_method1 = Braintree::PaymentMethod.create(
1103
1241
  :customer_id => customer.id,
1104
1242
  :payment_method_nonce => Braintree::Test::Nonce::TransactableVisa,
1105
- :token => token1
1243
+ :token => token1,
1106
1244
  )
1107
1245
 
1108
1246
  payment_method1 = Braintree::PaymentMethod.find(token1)
@@ -1113,11 +1251,11 @@ describe Braintree::Customer do
1113
1251
  payment_method2 = Braintree::PaymentMethod.create(
1114
1252
  :customer_id => customer.id,
1115
1253
  :payment_method_nonce => Braintree::Test::Nonce::TransactableMasterCard,
1116
- :token => token2
1254
+ :token => token2,
1117
1255
  )
1118
1256
 
1119
1257
  Braintree::Customer.update(customer.id,
1120
- :default_payment_method_token => token2
1258
+ :default_payment_method_token => token2,
1121
1259
  )
1122
1260
 
1123
1261
  payment_method2 = Braintree::PaymentMethod.find(token2)
@@ -1127,7 +1265,7 @@ describe Braintree::Customer do
1127
1265
  it "updates the default payment method in the options" do
1128
1266
  customer = Braintree::Customer.create!(
1129
1267
  :first_name => "Joe",
1130
- :last_name => "Brown"
1268
+ :last_name => "Brown",
1131
1269
  )
1132
1270
 
1133
1271
  token1 = random_payment_method_token
@@ -1135,7 +1273,7 @@ describe Braintree::Customer do
1135
1273
  payment_method1 = Braintree::PaymentMethod.create(
1136
1274
  :customer_id => customer.id,
1137
1275
  :payment_method_nonce => Braintree::Test::Nonce::TransactableVisa,
1138
- :token => token1
1276
+ :token => token1,
1139
1277
  )
1140
1278
 
1141
1279
  payment_method1 = Braintree::PaymentMethod.find(token1)
@@ -1146,7 +1284,7 @@ describe Braintree::Customer do
1146
1284
  payment_method2 = Braintree::PaymentMethod.create(
1147
1285
  :customer_id => customer.id,
1148
1286
  :payment_method_nonce => Braintree::Test::Nonce::TransactableMasterCard,
1149
- :token => token2
1287
+ :token => token2,
1150
1288
  )
1151
1289
 
1152
1290
  Braintree::Customer.update(customer.id,
@@ -1155,7 +1293,7 @@ describe Braintree::Customer do
1155
1293
  :update_existing_token => token2,
1156
1294
  :make_default => true
1157
1295
  }
1158
- }
1296
+ },
1159
1297
  )
1160
1298
 
1161
1299
  payment_method2 = Braintree::PaymentMethod.find(token2)
@@ -1165,7 +1303,7 @@ describe Braintree::Customer do
1165
1303
  it "can use any country code" do
1166
1304
  customer = Braintree::Customer.create!(
1167
1305
  :first_name => "Alex",
1168
- :last_name => "Matterson"
1306
+ :last_name => "Matterson",
1169
1307
  )
1170
1308
  result = Braintree::Customer.update(
1171
1309
  customer.id,
@@ -1180,7 +1318,7 @@ describe Braintree::Customer do
1180
1318
  :country_code_alpha3 => "FJI",
1181
1319
  :country_code_numeric => "242"
1182
1320
  }
1183
- }
1321
+ },
1184
1322
  )
1185
1323
  result.success?.should == true
1186
1324
  result.customer.addresses[0].country_name.should == "Fiji"
@@ -1199,7 +1337,7 @@ describe Braintree::Customer do
1199
1337
  :first_name => "Joe",
1200
1338
  :postal_code => "60622"
1201
1339
  }
1202
- }
1340
+ },
1203
1341
  )
1204
1342
 
1205
1343
  result = Braintree::Customer.update(
@@ -1207,13 +1345,13 @@ describe Braintree::Customer do
1207
1345
  :first_name => "New Joe",
1208
1346
  :credit_card => {
1209
1347
  :cardholder_name => "New Joe Cardholder",
1210
- :options => { :update_existing_token => customer.credit_cards.first.token },
1348
+ :options => {:update_existing_token => customer.credit_cards.first.token},
1211
1349
  :billing_address => {
1212
1350
  :last_name => "Cool",
1213
1351
  :postal_code => "60666",
1214
- :options => { :update_existing => true }
1352
+ :options => {:update_existing => true}
1215
1353
  }
1216
- }
1354
+ },
1217
1355
  )
1218
1356
  result.success?.should == true
1219
1357
  result.customer.id.should == customer.id
@@ -1231,7 +1369,7 @@ describe Braintree::Customer do
1231
1369
 
1232
1370
  it "can update the customer and verify_card with a specific verification_amount" do
1233
1371
  customer = Braintree::Customer.create!(
1234
- :first_name => "Joe"
1372
+ :first_name => "Joe",
1235
1373
  )
1236
1374
 
1237
1375
  result = Braintree::Customer.update(
@@ -1241,8 +1379,73 @@ describe Braintree::Customer do
1241
1379
  :cardholder_name => "New Joe Cardholder",
1242
1380
  :number => Braintree::Test::CreditCardNumbers::Visa,
1243
1381
  :expiration_date => "12/2009",
1244
- :options => { :verify_card => true, :verification_amount => "2.00" }
1245
- }
1382
+ :options => {:verify_card => true, :verification_amount => "2.00"}
1383
+ },
1384
+ )
1385
+ result.success?.should == true
1386
+ end
1387
+
1388
+ it "includes risk data when skip_advanced_fraud_checking is false" do
1389
+ with_fraud_protection_enterprise_merchant do
1390
+ customer = Braintree::Customer.create!(
1391
+ :first_name => "Joe",
1392
+ )
1393
+
1394
+ updated_result = Braintree::Customer.update(
1395
+ customer.id,
1396
+ :credit_card => {
1397
+ :cardholder_name => "New Joe Cardholder",
1398
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1399
+ :expiration_date => "12/2009",
1400
+ :options => {
1401
+ :skip_advanced_fraud_checking => false,
1402
+ :verify_card => true,
1403
+ },
1404
+ },
1405
+ )
1406
+
1407
+ expect(updated_result).to be_success
1408
+ verification = updated_result.customer.credit_cards.first.verification
1409
+ expect(verification.risk_data).not_to be_nil
1410
+ end
1411
+ end
1412
+
1413
+ it "does not include risk data when skip_advanced_fraud_checking is true" do
1414
+ with_fraud_protection_enterprise_merchant do
1415
+ customer = Braintree::Customer.create!(
1416
+ :first_name => "Joe",
1417
+ )
1418
+
1419
+ updated_result = Braintree::Customer.update(
1420
+ customer.id,
1421
+ :credit_card => {
1422
+ :cardholder_name => "New Joe Cardholder",
1423
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1424
+ :expiration_date => "12/2009",
1425
+ :options => {
1426
+ :skip_advanced_fraud_checking => true,
1427
+ :verify_card => true,
1428
+ },
1429
+ },
1430
+ )
1431
+
1432
+ expect(updated_result).to be_success
1433
+ verification = updated_result.customer.credit_cards.first.verification
1434
+ expect(verification.risk_data).to be_nil
1435
+ end
1436
+ end
1437
+
1438
+ it "can update a tax_identifier" do
1439
+ customer = Braintree::Customer.create!(
1440
+ :tax_identifiers => [
1441
+ {:country_code => "US", :identifier => "987654321"},
1442
+ {:country_code => "CL", :identifier => "123456789"}
1443
+ ],
1444
+ )
1445
+
1446
+ result = Braintree::Customer.update(
1447
+ customer.id,
1448
+ :tax_identifiers => [{:country_code => "US", :identifier => "567891234"}],
1246
1449
  )
1247
1450
  result.success?.should == true
1248
1451
  end
@@ -1252,17 +1455,17 @@ describe Braintree::Customer do
1252
1455
  :payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
1253
1456
  :credit_card => {
1254
1457
  :three_d_secure_pass_thru => {
1255
- :eci_flag => '02',
1256
- :cavv => 'some_cavv',
1257
- :xid => 'some_xid',
1258
- :three_d_secure_version => 'xx',
1259
- :authentication_response => 'Y',
1260
- :directory_response => 'Y',
1261
- :cavv_algorithm => '2',
1262
- :ds_transaction_id => 'some_ds_transaction_id',
1458
+ :eci_flag => "02",
1459
+ :cavv => "some_cavv",
1460
+ :xid => "some_xid",
1461
+ :three_d_secure_version => "xx",
1462
+ :authentication_response => "Y",
1463
+ :directory_response => "Y",
1464
+ :cavv_algorithm => "2",
1465
+ :ds_transaction_id => "some_ds_transaction_id",
1263
1466
  },
1264
1467
  :options => {:verify_card => true}
1265
- }
1468
+ },
1266
1469
  )
1267
1470
 
1268
1471
  expect(result).not_to be_success
@@ -1276,17 +1479,17 @@ describe Braintree::Customer do
1276
1479
  :payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
1277
1480
  :credit_card => {
1278
1481
  :three_d_secure_pass_thru => {
1279
- :eci_flag => '02',
1280
- :cavv => 'some_cavv',
1281
- :xid => 'some_xid',
1282
- :three_d_secure_version => '2.2.1',
1283
- :authentication_response => 'Y',
1284
- :directory_response => 'Y',
1285
- :cavv_algorithm => '2',
1286
- :ds_transaction_id => 'some_ds_transaction_id',
1482
+ :eci_flag => "02",
1483
+ :cavv => "some_cavv",
1484
+ :xid => "some_xid",
1485
+ :three_d_secure_version => "2.2.1",
1486
+ :authentication_response => "Y",
1487
+ :directory_response => "Y",
1488
+ :cavv_algorithm => "2",
1489
+ :ds_transaction_id => "some_ds_transaction_id",
1287
1490
  },
1288
1491
  :options => {:verify_card => true}
1289
- }
1492
+ },
1290
1493
  )
1291
1494
 
1292
1495
  expect(result).to be_success
@@ -1297,7 +1500,7 @@ describe Braintree::Customer do
1297
1500
  :payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
1298
1501
  :credit_card => {
1299
1502
  :options => {:verify_card => true}
1300
- }
1503
+ },
1301
1504
  )
1302
1505
  result.success?.should == true
1303
1506
 
@@ -1319,7 +1522,7 @@ describe Braintree::Customer do
1319
1522
  address = Braintree::Address.create!(
1320
1523
  :customer_id => customer.id,
1321
1524
  :first_name => "John",
1322
- :last_name => "Doe"
1525
+ :last_name => "Doe",
1323
1526
  )
1324
1527
 
1325
1528
  customer = Braintree::Customer.update(
@@ -1328,7 +1531,7 @@ describe Braintree::Customer do
1328
1531
  :number => Braintree::Test::CreditCardNumbers::Visa,
1329
1532
  :expiration_date => "12/2009",
1330
1533
  :billing_address_id => address.id
1331
- }
1534
+ },
1332
1535
  ).customer
1333
1536
 
1334
1537
  billing_address = customer.credit_cards.first.billing_address
@@ -1341,12 +1544,93 @@ describe Braintree::Customer do
1341
1544
  customer = Braintree::Customer.create!(:email => "valid@email.com")
1342
1545
  result = Braintree::Customer.update(
1343
1546
  customer.id,
1344
- :email => "@invalid.com"
1547
+ :email => "@invalid.com",
1345
1548
  )
1346
1549
  result.success?.should == false
1347
1550
  result.errors.for(:customer).on(:email)[0].message.should == "Email is an invalid format."
1348
1551
  end
1349
1552
 
1553
+ context "verification_currency_iso_code" do
1554
+ it "can update the customer after validating verification_currency_iso_code" do
1555
+ customer = Braintree::Customer.create!(
1556
+ :first_name => "Joe",
1557
+ )
1558
+
1559
+ result = Braintree::Customer.update(
1560
+ customer.id,
1561
+ :first_name => "New Joe",
1562
+ :credit_card => {
1563
+ :cardholder_name => "New Joe Cardholder",
1564
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1565
+ :expiration_date => "12/2009",
1566
+ :options => {:verify_card => true, :verification_currency_iso_code => "USD"}
1567
+ },
1568
+ )
1569
+ result.success?.should == true
1570
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
1571
+ end
1572
+
1573
+ it "can update the customer after validating verification_currency_iso_code against the given verification_merchant_account_id" do
1574
+ customer = Braintree::Customer.create!(
1575
+ :first_name => "Joe",
1576
+ )
1577
+
1578
+ result = Braintree::Customer.update(
1579
+ customer.id,
1580
+ :first_name => "New Joe",
1581
+ :credit_card => {
1582
+ :cardholder_name => "New Joe Cardholder",
1583
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1584
+ :expiration_date => "12/2009",
1585
+ :options => {:verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "USD"}
1586
+ },
1587
+ )
1588
+ result.success?.should == true
1589
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
1590
+ result.customer.credit_cards[0].verification.merchant_account_id == SpecHelper::NonDefaultMerchantAccountId
1591
+ end
1592
+
1593
+ it "throws error due to verification_currency_iso_code not matching against the currency configured in default merchant account" do
1594
+ customer = Braintree::Customer.create!(
1595
+ :first_name => "Joe",
1596
+ )
1597
+
1598
+ result = Braintree::Customer.update(
1599
+ customer.id,
1600
+ :first_name => "New Joe",
1601
+ :credit_card => {
1602
+ :cardholder_name => "New Joe Cardholder",
1603
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1604
+ :expiration_date => "12/2009",
1605
+ :options => {:verify_card => true, :verification_currency_iso_code => "GBP"}
1606
+ },
1607
+ )
1608
+ result.success?.should == false
1609
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1610
+
1611
+ end
1612
+
1613
+ it "throws error due to verification_currency_iso_code not matching against the currency configured in the given verification merchant account" do
1614
+ customer = Braintree::Customer.create!(
1615
+ :first_name => "Joe",
1616
+ )
1617
+
1618
+ result = Braintree::Customer.update(
1619
+ customer.id,
1620
+ :first_name => "New Joe",
1621
+ :credit_card => {
1622
+ :cardholder_name => "New Joe Cardholder",
1623
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1624
+ :expiration_date => "12/2009",
1625
+ :options => {:verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "GBP"}
1626
+ },
1627
+ )
1628
+ result.success?.should == false
1629
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1630
+
1631
+ end
1632
+ end
1633
+
1350
1634
  context "verification_account_type" do
1351
1635
  it "updates the credit card with account_type credit" do
1352
1636
  customer = Braintree::Customer.create!
@@ -1362,7 +1646,7 @@ describe Braintree::Customer do
1362
1646
  :verification_merchant_account_id => SpecHelper::HiperBRLMerchantAccountId,
1363
1647
  :verification_account_type => "credit",
1364
1648
  },
1365
- }
1649
+ },
1366
1650
  )
1367
1651
  expect(update_result).to be_success
1368
1652
  end
@@ -1381,7 +1665,7 @@ describe Braintree::Customer do
1381
1665
  :verification_merchant_account_id => SpecHelper::HiperBRLMerchantAccountId,
1382
1666
  :verification_account_type => "debit",
1383
1667
  },
1384
- }
1668
+ },
1385
1669
  )
1386
1670
  expect(update_result).to be_success
1387
1671
  end
@@ -1392,12 +1676,12 @@ describe Braintree::Customer do
1392
1676
  it "returns the updated customer if successful" do
1393
1677
  customer = Braintree::Customer.create!(
1394
1678
  :first_name => "Joe",
1395
- :last_name => "Cool"
1679
+ :last_name => "Cool",
1396
1680
  )
1397
1681
  updated_customer = Braintree::Customer.update!(
1398
1682
  customer.id,
1399
1683
  :first_name => "Mr. Joe",
1400
- :last_name => "Super Cool"
1684
+ :last_name => "Super Cool",
1401
1685
  )
1402
1686
  updated_customer.first_name.should == "Mr. Joe"
1403
1687
  updated_customer.last_name.should == "Super Cool"
@@ -1421,7 +1705,7 @@ describe Braintree::Customer do
1421
1705
  :options => {
1422
1706
  :make_default => false
1423
1707
  }
1424
- }
1708
+ },
1425
1709
  )
1426
1710
 
1427
1711
  default_payment_method = Braintree::CreditCard.create!(
@@ -1430,7 +1714,7 @@ describe Braintree::Customer do
1430
1714
  :expiration_date => "11/2015",
1431
1715
  :options => {
1432
1716
  :make_default => true
1433
- }
1717
+ },
1434
1718
  )
1435
1719
 
1436
1720
  customer = Braintree::Customer.find(customer.id)
@@ -1443,7 +1727,7 @@ describe Braintree::Customer do
1443
1727
  context "future" do
1444
1728
  it "creates a customer with a future paypal account" do
1445
1729
  result = Braintree::Customer.create(
1446
- :payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment
1730
+ :payment_method_nonce => Braintree::Test::Nonce::PayPalFuturePayment,
1447
1731
  )
1448
1732
 
1449
1733
  result.should be_success
@@ -1457,7 +1741,7 @@ describe Braintree::Customer do
1457
1741
  :options => {
1458
1742
  :make_default => true
1459
1743
  }
1460
- }
1744
+ },
1461
1745
  )
1462
1746
 
1463
1747
  paypal_account_token = "PAYPAL_ACCOUNT_TOKEN_#{rand(36**3).to_s(36)}"
@@ -1466,12 +1750,12 @@ describe Braintree::Customer do
1466
1750
  :token => paypal_account_token,
1467
1751
  :options => {
1468
1752
  :make_default => true
1469
- }
1753
+ },
1470
1754
  )
1471
1755
 
1472
1756
  result = Braintree::Customer.update(
1473
1757
  customer.id,
1474
- :payment_method_nonce => nonce
1758
+ :payment_method_nonce => nonce,
1475
1759
  )
1476
1760
 
1477
1761
  result.should be_success
@@ -1487,7 +1771,7 @@ describe Braintree::Customer do
1487
1771
  :token => paypal_account_token,
1488
1772
  :options => {
1489
1773
  :make_default => true
1490
- }
1774
+ },
1491
1775
  )
1492
1776
 
1493
1777
  result = Braintree::Customer.create(
@@ -1523,7 +1807,7 @@ describe Braintree::Customer do
1523
1807
  :options => {
1524
1808
  :make_default => true
1525
1809
  }
1526
- }
1810
+ },
1527
1811
  )
1528
1812
 
1529
1813
  paypal_account_token = "PAYPAL_ACCOUNT_TOKEN_#{rand(36**3).to_s(36)}"
@@ -1532,7 +1816,7 @@ describe Braintree::Customer do
1532
1816
  :token => paypal_account_token,
1533
1817
  :options => {
1534
1818
  :make_default => true
1535
- }
1819
+ },
1536
1820
  )
1537
1821
 
1538
1822
  result = Braintree::Customer.update(
@@ -1566,7 +1850,7 @@ describe Braintree::Customer do
1566
1850
  context "onetime" do
1567
1851
  it "does not create a customer with a onetime paypal account" do
1568
1852
  result = Braintree::Customer.create(
1569
- :payment_method_nonce => Braintree::Test::Nonce::PayPalOneTimePayment
1853
+ :payment_method_nonce => Braintree::Test::Nonce::PayPalOneTimePayment,
1570
1854
  )
1571
1855
 
1572
1856
  result.should_not be_success
@@ -1582,7 +1866,7 @@ describe Braintree::Customer do
1582
1866
  :options => {
1583
1867
  :make_default => true
1584
1868
  }
1585
- }
1869
+ },
1586
1870
  )
1587
1871
 
1588
1872
  paypal_account_token = "PAYPAL_ACCOUNT_TOKEN_#{rand(36**3).to_s(36)}"
@@ -1591,12 +1875,12 @@ describe Braintree::Customer do
1591
1875
  :token => paypal_account_token,
1592
1876
  :options => {
1593
1877
  :make_default => true
1594
- }
1878
+ },
1595
1879
  )
1596
1880
 
1597
1881
  result = Braintree::Customer.update(
1598
1882
  customer.id,
1599
- :payment_method_nonce => nonce
1883
+ :payment_method_nonce => nonce,
1600
1884
  )
1601
1885
 
1602
1886
  result.should_not be_success