braintree 3.1.0 → 3.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fd29c86922c84315bcc22c0318136adefa3b5023ffec6b805578ad9e9f9be0d
4
- data.tar.gz: f35f8eef6ccc321816005117c7bd0323a3b1d1e707ddc93ea082f43597ad75e6
3
+ metadata.gz: 78d503215e210019aebf40c5b4f0d42f8e98721a728016930efedc008c138ccc
4
+ data.tar.gz: 688dca23d5029e44cdb81915b2935bdf93d1b3b68f0e44703b46856d4a1abf6a
5
5
  SHA512:
6
- metadata.gz: a286c7e29b1f24de08aa3da6818f6061904f1ab52f581c44b7ce80e37fc7ff42a54a5bdcf39a70255c53965a3e580965d07677a56053d643652a56d39aef1f80
7
- data.tar.gz: 7b9f4bef3725bd17dac212babe68a9382a23bde7bacb458c5ca970c2137d374792a84247c222168f5e68518f22917891efd1720d90e2786e85e3a1ba40edd6e1
6
+ metadata.gz: 8a3a1935223a681e1b7935ef2e81bbe68448ebac245e3fe460892c423098c0db6c9cc9d05d25e11539fe392fdc34cef60e8a41e18a1ed1e95191729cf5aa624c
7
+ data.tar.gz: bb1137c11f4ab8e12fba995e6fb547222ceb99f13231b393a8f631b487f11d74661c6d461383614eccdbce9acbbd8d91890bf8bd3c759b8579e0ecbbcccc24ce
@@ -141,6 +141,8 @@ require "braintree/transaction/status_details"
141
141
  require "braintree/transaction/venmo_account_details"
142
142
  require "braintree/transaction/visa_checkout_card_details"
143
143
  require "braintree/transaction/samsung_pay_card_details"
144
+ require "braintree/transaction/installment"
145
+ require "braintree/transaction/installment/adjustment"
144
146
  require "braintree/unknown_payment_method"
145
147
  require "braintree/disbursement"
146
148
  require "braintree/dispute_search"
@@ -79,7 +79,7 @@ module Braintree
79
79
 
80
80
  def self._signature(type) # :nodoc:
81
81
  billing_address_params = AddressGateway._shared_signature
82
- options = [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type]
82
+ options = [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type,:verification_currency_iso_code]
83
83
  signature = [
84
84
  :billing_address_id, :cardholder_name, :cvv, :expiration_date, :expiration_month,
85
85
  :expiration_year, :number, :token, :venmo_sdk_payment_method_code, :device_data,
@@ -68,6 +68,7 @@ module Braintree
68
68
  CardholderNameIsTooLong = "81723"
69
69
  CreditCardTypeIsNotAccepted = "81703"
70
70
  CreditCardTypeIsNotAcceptedBySubscriptionMerchantAccount = "81718"
71
+ CurrencyCodeNotSupportedByMerchantAccount = "91760"
71
72
  CustomerIdIsInvalid = "91705"
72
73
  CustomerIdIsRequired = "91704"
73
74
  CvvIsInvalid = "81707"
@@ -301,6 +302,7 @@ module Braintree
301
302
  CannotUpdateTransactionDetailsNotSubmittedForSettlement = "915129"
302
303
  ChannelIsTooLong = "91550"
303
304
  CreditCardIsRequired = "91508"
305
+ CurrencyCodeNotSupportedByMerchantAccount = "915214"
304
306
  CustomFieldIsInvalid = "91526"
305
307
  CustomFieldIsTooLong = "81527"
306
308
  CustomerDefaultPaymentMethodCardTypeIsNotAccepted = "81509"
@@ -354,6 +356,7 @@ module Braintree
354
356
  RefundAmountIsTooLarge = "91521"
355
357
  RefundAuthHardDeclined = "915200"
356
358
  RefundAuthSoftDeclined = "915201"
359
+ ScaExemptionInvalid = "915213"
357
360
  ServiceFeeAmountCannotBeNegative = "91554"
358
361
  ServiceFeeAmountFormatIsInvalid = "91555"
359
362
  ServiceFeeAmountIsTooLarge = "91556"
@@ -507,6 +510,7 @@ module Braintree
507
510
  end
508
511
 
509
512
  module ExternalVault
513
+ # NEXT_MAJOR_VERSION remove this validation error as it is no longer returned by the gateway
510
514
  CardTypeIsInvalid = "915178"
511
515
  PreviousNetworkTransactionIdIsInvalid = "915179"
512
516
  StatusIsInvalid = "915175"
@@ -775,6 +779,7 @@ module Braintree
775
779
  end
776
780
 
777
781
  module RiskData
782
+ # NEXT_MAJOR_VERSION Remove CustomerBrowserIsTooLong (this validation is no longer applied)
778
783
  CustomerBrowserIsTooLong = "94701"
779
784
  CustomerDeviceIdIsTooLong = "94702"
780
785
  CustomerLocationZipInvalidCharacters = "94703"
@@ -19,7 +19,6 @@ module Braintree
19
19
 
20
20
  def _do_create(path, params=nil) # :nodoc:
21
21
  response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
22
-
23
22
  if response[:api_error_response]
24
23
  ErrorResult.new(@gateway, response[:api_error_response])
25
24
  elsif response
@@ -152,6 +151,7 @@ module Braintree
152
151
  :make_default, :verification_merchant_account_id, :verify_card, :venmo_sdk_session,
153
152
  :verification_amount, :us_bank_account_verification_method,
154
153
  :verification_account_type,
154
+ :verification_currency_iso_code,
155
155
  :paypal => [
156
156
  :payee_email,
157
157
  :order_id,
@@ -22,9 +22,14 @@ module Braintree
22
22
  @ids.empty?
23
23
  end
24
24
 
25
- # Returns the first item in the collection or nil if the collection is empty
26
- def first
27
- @paging_block.call([@ids.first]).first
25
+ # Returns the first or the first N items in the collection or nil if the collection is empty
26
+ def first(amount = 1)
27
+ return nil if @ids.empty?
28
+ return @paging_block.call([@ids.first]).first if amount == 1
29
+
30
+ @ids.first(amount).each_slice(@page_size).flat_map do |page_of_ids|
31
+ @paging_block.call(page_of_ids)
32
+ end
28
33
  end
29
34
 
30
35
  # Only the maximum size of a resource collection can be determined since the data on the server can change while
@@ -36,6 +36,7 @@ module Braintree
36
36
  Hipercard = "6062820524845321"
37
37
 
38
38
  Visa = "4012888888881881"
39
+ VisaCountryOfIssuanceIE = "4023490000000008"
39
40
  VisaInternational = "4009348888881881" # :nodoc:
40
41
  VisaPrepaid = "4500600000000061"
41
42
 
@@ -121,6 +121,8 @@ module Braintree
121
121
  attr_reader :google_pay_details
122
122
  attr_reader :graphql_id
123
123
  attr_reader :id
124
+ attr_reader :installment_count
125
+ attr_reader :installments
124
126
  attr_reader :local_payment_details
125
127
  attr_reader :merchant_account_id
126
128
  attr_reader :network_response_code # Response code from the card network
@@ -143,9 +145,11 @@ module Braintree
143
145
  attr_reader :recurring
144
146
  attr_reader :refund_ids
145
147
  attr_reader :refunded_transaction_id
148
+ attr_reader :refunded_installments
146
149
  attr_reader :retrieval_reference_number
147
150
  attr_reader :risk_data
148
151
  attr_reader :samsung_pay_card_details
152
+ attr_reader :sca_exemption_requested
149
153
  attr_reader :service_fee_amount
150
154
  attr_reader :settlement_batch_id
151
155
  attr_reader :shipping_amount
@@ -305,7 +309,11 @@ module Braintree
305
309
  @us_bank_account_details = UsBankAccountDetails.new(attributes[:us_bank_account]) if attributes[:us_bank_account]
306
310
  @visa_checkout_card_details = VisaCheckoutCardDetails.new(attributes[:visa_checkout_card])
307
311
  @samsung_pay_card_details = SamsungPayCardDetails.new(attributes[:samsung_pay_card])
312
+ @sca_exemption_requested = attributes[:sca_exemption_requested]
308
313
  authorization_adjustments.map! { |attrs| AuthorizationAdjustment._new(attrs) } if authorization_adjustments
314
+
315
+ installments.map! { |attrs| Installment.new(attrs) } if installments
316
+ refunded_installments.map! { |attrs| Installment.new(attrs) } if refunded_installments
309
317
  end
310
318
 
311
319
  def inspect # :nodoc:
@@ -0,0 +1,28 @@
1
+ module Braintree
2
+ class Transaction
3
+ class Installment
4
+ include BaseModule
5
+
6
+ attr_reader :id
7
+ attr_reader :amount
8
+ attr_reader :projected_disbursement_date
9
+ attr_reader :actual_disbursement_date
10
+ attr_reader :adjustments
11
+
12
+ def initialize(attributes)
13
+ set_instance_variables_from_hash attributes unless attributes.nil?
14
+ @amount = Util.to_big_decimal(amount)
15
+ adjustments.map! { |attrs| Adjustment.new(attrs) } if adjustments
16
+ end
17
+
18
+ def inspect
19
+ attrs = [:id, :amount, :projected_disbursement_date, :actual_disbursement_date, :adjustments]
20
+ formatted_attrs = attrs.map do |attr|
21
+ "#{attr}: #{send(attr).inspect}"
22
+ end
23
+
24
+ "#<#{formatted_attrs.join(", ")}>"
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ module Braintree
2
+ class Transaction
3
+ class Installment
4
+ class Adjustment
5
+ include BaseModule
6
+
7
+ module Kind
8
+ Refund = "REFUND"
9
+ Dispute = "DISPUTE"
10
+ end
11
+
12
+ attr_reader :amount
13
+ attr_reader :kind
14
+ attr_reader :projected_disbursement_date
15
+ attr_reader :actual_disbursement_date
16
+
17
+ def initialize(attributes)
18
+ set_instance_variables_from_hash attributes unless attributes.nil?
19
+ @amount = Util.to_big_decimal(amount)
20
+ end
21
+
22
+ def inspect
23
+ attrs = [:amount, :kind, :projected_disbursement_date, :actual_disbursement_date]
24
+ formatted_attrs = attrs.map do |attr|
25
+ "#{attr}: #{send(attr).inspect}"
26
+ end
27
+
28
+ "#<#{formatted_attrs.join(", ")}>"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -180,6 +180,7 @@ module Braintree
180
180
  :shared_shipping_address_id, :shipping_address_id, :shipping_amount,
181
181
  :ships_from_postal_code, :tax_amount, :tax_exempt, :three_d_secure_authentication_id,
182
182
  :three_d_secure_token, :transaction_source, :type, :venmo_sdk_payment_method_code,
183
+ :sca_exemption, :currency_iso_code,
183
184
  {:line_items => [:quantity, :name, :description, :kind, :unit_amount, :unit_tax_amount, :total_amount, :discount_amount, :tax_amount, :unit_of_measure, :product_code, :commodity_code, :url]},
184
185
  {:risk_data => [:customer_browser, :customer_device_id, :customer_ip, :customer_location_zip, :customer_tenure]},
185
186
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
@@ -245,7 +246,8 @@ module Braintree
245
246
  ]},
246
247
  ]},
247
248
  {:apple_pay_card => [:number, :cardholder_name, :cryptogram, :expiration_month, :expiration_year, :eci_indicator]},
248
- {:google_pay_card => [:number, :cryptogram, :google_transaction_id, :expiration_month, :expiration_year, :source_card_type, :source_card_last_four, :eci_indicator]}
249
+ {:google_pay_card => [:number, :cryptogram, :google_transaction_id, :expiration_month, :expiration_year, :source_card_type, :source_card_last_four, :eci_indicator]},
250
+ {:installments => [:count]},
249
251
  ]
250
252
  end
251
253
 
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 3
4
- Minor = 1
4
+ Minor = 2
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -257,6 +257,92 @@ describe Braintree::Customer do
257
257
  result.credit_card_verification.status.should == Braintree::Transaction::Status::ProcessorDeclined
258
258
  end
259
259
 
260
+ it "can create a customer and a payment method at the same time after validating verification_currency_iso_code" do
261
+ result = Braintree::Customer.create(
262
+ :first_name => "Mike",
263
+ :last_name => "Jones",
264
+ :credit_card => {
265
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
266
+ :expiration_date => "05/2010",
267
+ :cvv => "100",
268
+ :options => {
269
+ :verify_card => true,
270
+ :verification_currency_iso_code => "USD"
271
+ }
272
+ }
273
+ )
274
+
275
+ result.success?.should == true
276
+ result.customer.first_name.should == "Mike"
277
+ result.customer.last_name.should == "Jones"
278
+ result.customer.credit_cards[0].bin.should == Braintree::Test::CreditCardNumbers::MasterCard[0, 6]
279
+ result.customer.credit_cards[0].last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
280
+ result.customer.credit_cards[0].expiration_date.should == "05/2010"
281
+ result.customer.credit_cards[0].unique_number_identifier.should =~ /\A\w{32}\z/
282
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
283
+ end
284
+
285
+ it "errors when verification_currency_iso_code is not supported by merchant account" do
286
+ result = Braintree::Customer.create(
287
+ :first_name => "Mike",
288
+ :last_name => "Jones",
289
+ :credit_card => {
290
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
291
+ :expiration_date => "05/2010",
292
+ :cvv => "100",
293
+ :options => {
294
+ :verify_card => true,
295
+ :verification_currency_iso_code => "GBP"
296
+ }
297
+ }
298
+ )
299
+ expect(result).to_not be_success
300
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
301
+ end
302
+
303
+ it "validates verification_currency_iso_code of the given verification_merchant_account_id and creates customer" do
304
+ result = Braintree::Customer.create(
305
+ :first_name => "Mike",
306
+ :last_name => "Jones",
307
+ :credit_card => {
308
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
309
+ :expiration_date => "05/2010",
310
+ :options => {
311
+ :verify_card => true,
312
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
313
+ :verification_currency_iso_code => "USD"
314
+ }
315
+ }
316
+ )
317
+ result.success?.should == true
318
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
319
+ result.customer.first_name.should == "Mike"
320
+ result.customer.last_name.should == "Jones"
321
+ result.customer.credit_cards[0].bin.should == Braintree::Test::CreditCardNumbers::MasterCard[0, 6]
322
+ result.customer.credit_cards[0].last_4.should == Braintree::Test::CreditCardNumbers::MasterCard[-4..-1]
323
+ result.customer.credit_cards[0].expiration_date.should == "05/2010"
324
+ result.customer.credit_cards[0].unique_number_identifier.should =~ /\A\w{32}\z/
325
+ end
326
+
327
+ it "validates verification_currency_iso_code of the given verification_merchant_account_id and returns error" do
328
+ result = Braintree::Customer.create(
329
+ :first_name => "Mike",
330
+ :last_name => "Jones",
331
+ :credit_card => {
332
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
333
+ :expiration_date => "05/2010",
334
+ :options => {
335
+ :verify_card => true,
336
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
337
+ :verification_currency_iso_code => "GBP"
338
+ }
339
+ }
340
+ )
341
+ expect(result).to_not be_success
342
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
343
+ end
344
+
345
+
260
346
  it "can create a customer, payment method, and billing address at the same time" do
261
347
  result = Braintree::Customer.create(
262
348
  :first_name => "Mike",
@@ -1347,6 +1433,87 @@ describe Braintree::Customer do
1347
1433
  result.errors.for(:customer).on(:email)[0].message.should == "Email is an invalid format."
1348
1434
  end
1349
1435
 
1436
+ context "verification_currency_iso_code" do
1437
+ it "can update the customer after validating verification_currency_iso_code" do
1438
+ customer = Braintree::Customer.create!(
1439
+ :first_name => "Joe"
1440
+ )
1441
+
1442
+ result = Braintree::Customer.update(
1443
+ customer.id,
1444
+ :first_name => "New Joe",
1445
+ :credit_card => {
1446
+ :cardholder_name => "New Joe Cardholder",
1447
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1448
+ :expiration_date => "12/2009",
1449
+ :options => { :verify_card => true, :verification_currency_iso_code => "USD" }
1450
+ }
1451
+ )
1452
+ result.success?.should == true
1453
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
1454
+ end
1455
+
1456
+ it "can update the customer after validating verification_currency_iso_code against the given verification_merchant_account_id" do
1457
+ customer = Braintree::Customer.create!(
1458
+ :first_name => "Joe"
1459
+ )
1460
+
1461
+ result = Braintree::Customer.update(
1462
+ customer.id,
1463
+ :first_name => "New Joe",
1464
+ :credit_card => {
1465
+ :cardholder_name => "New Joe Cardholder",
1466
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1467
+ :expiration_date => "12/2009",
1468
+ :options => { :verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "USD" }
1469
+ }
1470
+ )
1471
+ result.success?.should == true
1472
+ result.customer.credit_cards[0].verification.currency_iso_code == "USD"
1473
+ result.customer.credit_cards[0].verification.merchant_account_id == SpecHelper::NonDefaultMerchantAccountId
1474
+ end
1475
+
1476
+ it "throws error due to verification_currency_iso_code not matching against the currency configured in default merchant account" do
1477
+ customer = Braintree::Customer.create!(
1478
+ :first_name => "Joe"
1479
+ )
1480
+
1481
+ result = Braintree::Customer.update(
1482
+ customer.id,
1483
+ :first_name => "New Joe",
1484
+ :credit_card => {
1485
+ :cardholder_name => "New Joe Cardholder",
1486
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1487
+ :expiration_date => "12/2009",
1488
+ :options => { :verify_card => true, :verification_currency_iso_code => "GBP" }
1489
+ }
1490
+ )
1491
+ result.success?.should == false
1492
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1493
+
1494
+ end
1495
+
1496
+ it "throws error due to verification_currency_iso_code not matching against the currency configured in the given verification merchant account" do
1497
+ customer = Braintree::Customer.create!(
1498
+ :first_name => "Joe"
1499
+ )
1500
+
1501
+ result = Braintree::Customer.update(
1502
+ customer.id,
1503
+ :first_name => "New Joe",
1504
+ :credit_card => {
1505
+ :cardholder_name => "New Joe Cardholder",
1506
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1507
+ :expiration_date => "12/2009",
1508
+ :options => { :verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "GBP" }
1509
+ }
1510
+ )
1511
+ result.success?.should == false
1512
+ expect(result.errors.for(:customer).for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code).to eq Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1513
+
1514
+ end
1515
+ end
1516
+
1350
1517
  context "verification_account_type" do
1351
1518
  it "updates the credit card with account_type credit" do
1352
1519
  customer = Braintree::Customer.create!
@@ -849,6 +849,99 @@ describe Braintree::PaymentMethod do
849
849
  payment_method.should be_a Braintree::UnknownPaymentMethod
850
850
  end
851
851
  end
852
+
853
+ context "verification_currency_iso_code" do
854
+ it "validates verification_currency_iso_code against currency configured in default merchant account" do
855
+ nonce = nonce_for_new_payment_method(
856
+ :credit_card => {
857
+ :number => Braintree::Test::CreditCardNumbers::Visa,
858
+ :expiration_month => "11",
859
+ :expiration_year => "2099",
860
+ }
861
+ )
862
+ customer = Braintree::Customer.create!
863
+ result = Braintree::PaymentMethod.create(
864
+ :payment_method_nonce => nonce,
865
+ :customer_id => customer.id,
866
+ :options => {
867
+ :verify_card => true,
868
+ :verification_currency_iso_code => "USD"
869
+ }
870
+ )
871
+
872
+ result.should be_success
873
+ result.payment_method.verification.currency_iso_code == "USD"
874
+ end
875
+
876
+ it "validates verification_currency_iso_code against currency configured in verification_merchant_account_id" do
877
+ nonce = nonce_for_new_payment_method(
878
+ :credit_card => {
879
+ :number => Braintree::Test::CreditCardNumbers::Visa,
880
+ :expiration_month => "11",
881
+ :expiration_year => "2099",
882
+ }
883
+ )
884
+ customer = Braintree::Customer.create!
885
+ result = Braintree::PaymentMethod.create(
886
+ :payment_method_nonce => nonce,
887
+ :customer_id => customer.id,
888
+ :options => {
889
+ :verify_card => true,
890
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
891
+ :verification_currency_iso_code => "USD"
892
+ }
893
+ )
894
+
895
+ result.should be_success
896
+ result.payment_method.verification.currency_iso_code == "USD"
897
+ result.payment_method.verification.merchant_account_id == SpecHelper::NonDefaultMerchantAccountId
898
+ end
899
+
900
+
901
+ it "errors with invalid presentment currency due to verification_currency_iso_code not matching with currency configured in default merchant account" do
902
+ nonce = nonce_for_new_payment_method(
903
+ :credit_card => {
904
+ :number => Braintree::Test::CreditCardNumbers::Visa,
905
+ :expiration_month => "11",
906
+ :expiration_year => "2099",
907
+ }
908
+ )
909
+ customer = Braintree::Customer.create!
910
+ result = Braintree::PaymentMethod.create(
911
+ :payment_method_nonce => nonce,
912
+ :customer_id => customer.id,
913
+ :options => {
914
+ :verify_card => true,
915
+ :verification_currency_iso_code => "GBP"
916
+ }
917
+ )
918
+ result.should_not be_success
919
+ result.errors.for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code.should == Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
920
+ end
921
+
922
+ it "errors with invalid presentment currency due to verification_currency_iso_code not matching with currency configured in verification_merchant_account_id" do
923
+ nonce = nonce_for_new_payment_method(
924
+ :credit_card => {
925
+ :number => Braintree::Test::CreditCardNumbers::Visa,
926
+ :expiration_month => "11",
927
+ :expiration_year => "2099",
928
+ }
929
+ )
930
+ customer = Braintree::Customer.create!
931
+ result = Braintree::PaymentMethod.create(
932
+ :payment_method_nonce => nonce,
933
+ :customer_id => customer.id,
934
+ :options => {
935
+ :verify_card => true,
936
+ :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
937
+ :verification_currency_iso_code => "GBP"
938
+ }
939
+ )
940
+
941
+ result.should_not be_success
942
+ result.errors.for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code.should == Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
943
+ end
944
+ end
852
945
  end
853
946
 
854
947
  describe "self.create!" do
@@ -1275,6 +1368,90 @@ describe Braintree::PaymentMethod do
1275
1368
  updated_credit_card.expiration_date.should == "06/2013"
1276
1369
  end
1277
1370
 
1371
+ context "verification_currency_iso_code" do
1372
+ it "validates verification_currency_iso_code and updates the credit card " do
1373
+ customer = Braintree::Customer.create!
1374
+ credit_card = Braintree::CreditCard.create!(
1375
+ :cardholder_name => "Original Holder",
1376
+ :customer_id => customer.id,
1377
+ :cvv => "123",
1378
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1379
+ :expiration_date => "05/2012"
1380
+ )
1381
+ update_result = Braintree::PaymentMethod.update(credit_card.token,
1382
+ :cardholder_name => "New Holder",
1383
+ :cvv => "456",
1384
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
1385
+ :expiration_date => "06/2013",
1386
+ :options => {:verify_card => true, :verification_currency_iso_code => "USD"}
1387
+ )
1388
+ update_result.success?.should == true
1389
+ update_result.payment_method.verification.currency_iso_code == "USD"
1390
+ end
1391
+
1392
+ it "validates verification_currency_iso_code against the given verification_merchant_account_id and updates the credit card " do
1393
+ customer = Braintree::Customer.create!
1394
+ credit_card = Braintree::CreditCard.create!(
1395
+ :cardholder_name => "Original Holder",
1396
+ :customer_id => customer.id,
1397
+ :cvv => "123",
1398
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1399
+ :expiration_date => "05/2012"
1400
+ )
1401
+ update_result = Braintree::PaymentMethod.update(credit_card.token,
1402
+ :cardholder_name => "New Holder",
1403
+ :cvv => "456",
1404
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
1405
+ :expiration_date => "06/2013",
1406
+ :options => {:verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "USD"}
1407
+ )
1408
+ update_result.success?.should == true
1409
+ update_result.payment_method.verification.currency_iso_code == "USD"
1410
+ update_result.payment_method.verification.merchant_account_id == SpecHelper::NonDefaultMerchantAccountId
1411
+ end
1412
+
1413
+ it "throws validation error when passing invalid verification_currency_iso_code" do
1414
+ customer = Braintree::Customer.create!
1415
+ credit_card = Braintree::CreditCard.create!(
1416
+ :cardholder_name => "Original Holder",
1417
+ :customer_id => customer.id,
1418
+ :cvv => "123",
1419
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1420
+ :expiration_date => "05/2012"
1421
+ )
1422
+ update_result = Braintree::PaymentMethod.update(credit_card.token,
1423
+ :cardholder_name => "New Holder",
1424
+ :cvv => "456",
1425
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
1426
+ :expiration_date => "06/2013",
1427
+ :options => {:verify_card => true, :verification_currency_iso_code => "GBP"}
1428
+ )
1429
+ expect(update_result).to_not be_success
1430
+ update_result.errors.for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code.should == Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1431
+ end
1432
+
1433
+ it "throws validation error when passing invalid verification_currency_iso_code of the given verification merchant account id" do
1434
+ customer = Braintree::Customer.create!
1435
+ credit_card = Braintree::CreditCard.create!(
1436
+ :cardholder_name => "Original Holder",
1437
+ :customer_id => customer.id,
1438
+ :cvv => "123",
1439
+ :number => Braintree::Test::CreditCardNumbers::Visa,
1440
+ :expiration_date => "05/2012"
1441
+ )
1442
+ update_result = Braintree::PaymentMethod.update(credit_card.token,
1443
+ :cardholder_name => "New Holder",
1444
+ :cvv => "456",
1445
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
1446
+ :expiration_date => "06/2013",
1447
+ :options => {:verify_card => true, :verification_merchant_account_id => SpecHelper::NonDefaultMerchantAccountId, :verification_currency_iso_code => "GBP"}
1448
+ )
1449
+ expect(update_result).to_not be_success
1450
+ update_result.errors.for(:credit_card).for(:options).on(:verification_currency_iso_code)[0].code.should == Braintree::ErrorCodes::CreditCard::CurrencyCodeNotSupportedByMerchantAccount
1451
+ end
1452
+ end
1453
+
1454
+
1278
1455
  context "billing address" do
1279
1456
  it "creates a new billing address by default" do
1280
1457
  customer = Braintree::Customer.create!
@@ -13,7 +13,8 @@ describe Braintree::PaymentMethod do
13
13
  context "plaid verified nonce" do
14
14
  let(:nonce) { generate_valid_plaid_us_bank_account_nonce }
15
15
 
16
- it "succeeds" do
16
+ # we are temporarily skipping this test until we have a more stable CI env
17
+ xit "succeeds" do
17
18
  customer = Braintree::Customer.create.customer
18
19
  result = Braintree::PaymentMethod.create(
19
20
  :payment_method_nonce => nonce,
@@ -49,7 +50,8 @@ describe Braintree::PaymentMethod do
49
50
  Braintree::UsBankAccountVerification::VerificationMethod::IndependentCheck,
50
51
  Braintree::UsBankAccountVerification::VerificationMethod::NetworkCheck,
51
52
  ].each do |method|
52
- it "succeeds and verifies via #{method}" do
53
+ # we are temporarily skipping this test until we have a more stable CI env
54
+ xit "succeeds and verifies via #{method}" do
53
55
  customer = Braintree::Customer.create.customer
54
56
  result = Braintree::PaymentMethod.create(
55
57
  :payment_method_nonce => nonce,
@@ -183,7 +185,8 @@ describe Braintree::PaymentMethod do
183
185
 
184
186
  let(:nonce) { generate_valid_plaid_us_bank_account_nonce }
185
187
 
186
- it "succeeds and verifies via independent check" do
188
+ # we are temporarily skipping this test until we have a more stable CI env
189
+ xit "succeeds and verifies via independent check" do
187
190
  customer = Braintree::Customer.create.customer
188
191
  result = Braintree::PaymentMethod.create(
189
192
  :payment_method_nonce => nonce,
@@ -219,7 +222,8 @@ describe Braintree::PaymentMethod do
219
222
  context "non plaid verified nonce" do
220
223
  let(:nonce) { generate_non_plaid_us_bank_account_nonce }
221
224
 
222
- it "succeeds and verifies via independent check" do
225
+ # we are temporarily skipping this test until we have a more stable CI env
226
+ xit "succeeds and verifies via independent check" do
223
227
  customer = Braintree::Customer.create.customer
224
228
  result = Braintree::PaymentMethod.create(
225
229
  :payment_method_nonce => nonce,
@@ -159,7 +159,6 @@ describe Braintree::Transaction do
159
159
  }
160
160
  )
161
161
  result.success?.should == false
162
- result.errors.for(:transaction).for(:risk_data).on(:customer_browser).map { |e| e.code }.should include Braintree::ErrorCodes::RiskData::CustomerBrowserIsTooLong
163
162
  result.errors.for(:transaction).for(:risk_data).on(:customer_device_id).map { |e| e.code }.should include Braintree::ErrorCodes::RiskData::CustomerDeviceIdIsTooLong
164
163
  result.errors.for(:transaction).for(:risk_data).on(:customer_location_zip).map { |e| e.code }.should include Braintree::ErrorCodes::RiskData::CustomerLocationZipInvalidCharacters
165
164
  result.errors.for(:transaction).for(:risk_data).on(:customer_tenure).map { |e| e.code }.should include Braintree::ErrorCodes::RiskData::CustomerTenureIsTooLong
@@ -182,6 +181,42 @@ describe Braintree::Transaction do
182
181
  end
183
182
  end
184
183
 
184
+ describe "sca_exemption" do
185
+ context "with a valid request" do
186
+ it "succeeds" do
187
+ requested_exemption = "low_value"
188
+ result = Braintree::Transaction.create(
189
+ :type => "sale",
190
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
191
+ :credit_card => {
192
+ :number => Braintree::Test::CreditCardNumbers::VisaCountryOfIssuanceIE,
193
+ :expiration_date => "05/2009"
194
+ },
195
+ :sca_exemption => requested_exemption,
196
+ )
197
+ expect(result).to be_success
198
+ expect(result.transaction.sca_exemption_requested).to eq(requested_exemption)
199
+ end
200
+ end
201
+
202
+ context "with an invalid request" do
203
+ it "returns an error" do
204
+ result = Braintree::Transaction.create(
205
+ :type => "sale",
206
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
207
+ :credit_card => {
208
+ :number => Braintree::Test::CreditCardNumbers::Visa,
209
+ :expiration_date => "05/2009"
210
+ },
211
+ :sca_exemption => "invalid_sca_exemption_value",
212
+ )
213
+ sca_exemption_invalid = Braintree::ErrorCodes::Transaction::ScaExemptionInvalid
214
+ expect(result).not_to be_success
215
+ expect(result.errors.for(:transaction).map(&:code)).to eq([sca_exemption_invalid])
216
+ end
217
+ end
218
+ end
219
+
185
220
  describe "industry data" do
186
221
  context "for lodging" do
187
222
  it "accepts valid industry data" do
@@ -4270,7 +4305,7 @@ describe Braintree::Transaction do
4270
4305
  result.errors.for(:transaction).for(:external_vault).on(:status)[0].code.should == Braintree::ErrorCodes::Transaction::ExternalVault::StatusIsInvalid
4271
4306
  end
4272
4307
 
4273
- context "Visa/Mastercard/Discover" do
4308
+ context "Visa/Mastercard/Discover/AmEx" do
4274
4309
  it "accepts status" do
4275
4310
  result = Braintree::Transaction.create(
4276
4311
  :type => "sale",
@@ -4322,12 +4357,12 @@ describe Braintree::Transaction do
4322
4357
  end
4323
4358
  end
4324
4359
 
4325
- context "Non-(Visa/Mastercard/Discover) card types" do
4360
+ context "Non-(Visa/Mastercard/Discover/AmEx) card types" do
4326
4361
  it "accepts status" do
4327
4362
  result = Braintree::Transaction.create(
4328
4363
  :type => "sale",
4329
4364
  :credit_card => {
4330
- :number => Braintree::Test::CreditCardNumbers::AmExes[0],
4365
+ :number => Braintree::Test::CreditCardNumbers::JCBs[0],
4331
4366
  :expiration_date => "05/2009"
4332
4367
  },
4333
4368
  :external_vault => {
@@ -4343,7 +4378,7 @@ describe Braintree::Transaction do
4343
4378
  result = Braintree::Transaction.create(
4344
4379
  :type => "sale",
4345
4380
  :credit_card => {
4346
- :number => Braintree::Test::CreditCardNumbers::AmExes[0],
4381
+ :number => Braintree::Test::CreditCardNumbers::JCBs[0],
4347
4382
  :expiration_date => "05/2009"
4348
4383
  },
4349
4384
  :external_vault => {
@@ -4355,25 +4390,7 @@ describe Braintree::Transaction do
4355
4390
  result.success?.should == true
4356
4391
  result.transaction.network_transaction_id.should be_nil
4357
4392
  end
4358
-
4359
- it "rejects previous_network_transaction_id" do
4360
- result = Braintree::Transaction.create(
4361
- :type => "sale",
4362
- :credit_card => {
4363
- :number => Braintree::Test::CreditCardNumbers::AmExes[0],
4364
- :expiration_date => "05/2009"
4365
- },
4366
- :external_vault => {
4367
- :status => Braintree::Transaction::ExternalVault::Status::Vaulted,
4368
- :previous_network_transaction_id => "123456789012345",
4369
- },
4370
- :amount => "10.00",
4371
- )
4372
- result.success?.should == false
4373
- result.errors.for(:transaction).for(:external_vault).on(:previous_network_transaction_id)[0].code.should == Braintree::ErrorCodes::Transaction::ExternalVault::CardTypeIsInvalid
4374
- end
4375
4393
  end
4376
-
4377
4394
  end
4378
4395
 
4379
4396
  context "account_type" do
@@ -4959,6 +4976,73 @@ describe Braintree::Transaction do
4959
4976
  result.errors.for(:transaction).on(:amount)[0].code.should == Braintree::ErrorCodes::Transaction::AmountIsRequired
4960
4977
  end
4961
4978
 
4979
+ it "validates currency_iso_code and creates transaction" do
4980
+ params = {
4981
+ :transaction => {
4982
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
4983
+ :currency_iso_code => "USD",
4984
+ :credit_card => {
4985
+ :number => Braintree::Test::CreditCardNumbers::Visa,
4986
+ :expiration_date => "05/2009"
4987
+ }
4988
+ }
4989
+ }
4990
+ result = Braintree::Transaction.sale(params[:transaction])
4991
+ result.success?.should == true
4992
+ result.transaction.currency_iso_code == "USD"
4993
+ end
4994
+
4995
+ it "validates currency_iso_code and returns error" do
4996
+ params = {
4997
+ :transaction => {
4998
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
4999
+ :currency_iso_code => "CAD",
5000
+ :credit_card => {
5001
+ :number => Braintree::Test::CreditCardNumbers::Visa,
5002
+ :expiration_date => "05/2009"
5003
+ }
5004
+ }
5005
+ }
5006
+ result = Braintree::Transaction.sale(params[:transaction])
5007
+ result.success?.should == false
5008
+ result.errors.for(:transaction).on(:currency_iso_code)[0].code.should == Braintree::ErrorCodes::Transaction::CurrencyCodeNotSupportedByMerchantAccount
5009
+ end
5010
+
5011
+ it "validates currency_iso_code and creates transaction with specified merchant account" do
5012
+ params = {
5013
+ :transaction => {
5014
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5015
+ :merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
5016
+ :currency_iso_code => "USD",
5017
+ :credit_card => {
5018
+ :number => Braintree::Test::CreditCardNumbers::Visa,
5019
+ :expiration_date => "05/2009"
5020
+ }
5021
+ }
5022
+ }
5023
+ result = Braintree::Transaction.sale(params[:transaction])
5024
+ result.success?.should == true
5025
+ result.transaction.currency_iso_code == "USD"
5026
+ result.transaction.merchant_account_id == SpecHelper::NonDefaultMerchantAccountId
5027
+ end
5028
+
5029
+ it "validates currency_iso_code and returns error with specified merchant account" do
5030
+ params = {
5031
+ :transaction => {
5032
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5033
+ :merchant_account_id => SpecHelper::NonDefaultMerchantAccountId,
5034
+ :currency_iso_code => "CAD",
5035
+ :credit_card => {
5036
+ :number => Braintree::Test::CreditCardNumbers::Visa,
5037
+ :expiration_date => "05/2009"
5038
+ }
5039
+ }
5040
+ }
5041
+ result = Braintree::Transaction.sale(params[:transaction])
5042
+ result.success?.should == false
5043
+ result.errors.for(:transaction).on(:currency_iso_code)[0].code.should == Braintree::ErrorCodes::Transaction::CurrencyCodeNotSupportedByMerchantAccount
5044
+ end
5045
+
4962
5046
  it "skips advanced fraud checking if transaction[options][skip_advanced_fraud_checking] is set to true" do
4963
5047
  with_advanced_fraud_integration_merchant do
4964
5048
  result = Braintree::Transaction.sale(
@@ -6789,4 +6873,91 @@ describe Braintree::Transaction do
6789
6873
  transaction.processed_with_network_token?.should == false
6790
6874
  end
6791
6875
  end
6876
+
6877
+ describe "installments" do
6878
+ it "creates a transaction with an installment count" do
6879
+ result = Braintree::Transaction.create(
6880
+ :type => "sale",
6881
+ :merchant_account_id => SpecHelper::CardProcessorBRLMerchantAccountId,
6882
+ :credit_card => {
6883
+ :number => Braintree::Test::CreditCardNumbers::Visa,
6884
+ :expiration_date => "05/2009"
6885
+ },
6886
+ :amount => "100.01",
6887
+ :installments => {
6888
+ :count => 12,
6889
+ },
6890
+ )
6891
+
6892
+ expect(result.success?).to eq(true)
6893
+ expect(result.transaction.installment_count).to eq(12)
6894
+ end
6895
+
6896
+ it "creates a transaction with a installments during capture" do
6897
+ result = Braintree::Transaction.create(
6898
+ :type => "sale",
6899
+ :merchant_account_id => SpecHelper::CardProcessorBRLMerchantAccountId,
6900
+ :credit_card => {
6901
+ :number => Braintree::Test::CreditCardNumbers::Visa,
6902
+ :expiration_date => "05/2009"
6903
+ },
6904
+ :amount => "100.01",
6905
+ :installments => {
6906
+ :count => 12,
6907
+ },
6908
+ :options => {
6909
+ :submit_for_settlement => true,
6910
+ },
6911
+ )
6912
+
6913
+ expect(result.success?).to eq(true)
6914
+ transaction = result.transaction
6915
+ expect(transaction.installment_count).to eq(12)
6916
+
6917
+ installments = transaction.installments
6918
+ expect(installments.map(&:id)).to match_array((1..12).map { |i| "#{transaction.id}_INST_#{i}" })
6919
+ expect(installments.map(&:amount)).to match_array([BigDecimal("8.33")] * 11 + [BigDecimal("8.38")])
6920
+ end
6921
+
6922
+ it "can refund a transaction with installments" do
6923
+ sale_result = Braintree::Transaction.create(
6924
+ :type => "sale",
6925
+ :merchant_account_id => SpecHelper::CardProcessorBRLMerchantAccountId,
6926
+ :credit_card => {
6927
+ :number => Braintree::Test::CreditCardNumbers::Visa,
6928
+ :expiration_date => "05/2009"
6929
+ },
6930
+ :amount => "100.01",
6931
+ :installments => {
6932
+ :count => 12,
6933
+ },
6934
+ :options => {
6935
+ :submit_for_settlement => true,
6936
+ },
6937
+ )
6938
+
6939
+ expect(sale_result.success?).to eq(true)
6940
+ sale_transaction = sale_result.transaction
6941
+
6942
+ refund_result = Braintree::Transaction.refund(sale_transaction.id, "49.99")
6943
+
6944
+ expect(refund_result.success?).to eq(true)
6945
+ refund_transaction = refund_result.transaction
6946
+ installments = refund_transaction.refunded_installments
6947
+
6948
+ (1..11).each do |i|
6949
+ installment = installments.find { |installment| installment.id == "#{sale_transaction.id}_INST_#{i}" }
6950
+
6951
+ expect(installment.amount).to eq(BigDecimal("8.33"))
6952
+ expect(installment.adjustments.map(&:amount)).to match_array([BigDecimal("-4.16")])
6953
+ expect(installment.adjustments.map(&:kind)).to match_array([Braintree::Transaction::Installment::Adjustment::Kind::Refund])
6954
+ end
6955
+
6956
+ installment = installments.find { |installment| installment.id == "#{sale_transaction.id}_INST_12" }
6957
+
6958
+ expect(installment.amount).to eq(BigDecimal("8.38"))
6959
+ expect(installment.adjustments.map(&:amount)).to match_array([BigDecimal("-4.23")])
6960
+ expect(installment.adjustments.map(&:kind)).to match_array([Braintree::Transaction::Installment::Adjustment::Kind::Refund])
6961
+ end
6962
+ end
6792
6963
  end
@@ -14,7 +14,8 @@ describe Braintree::Transaction do
14
14
  let(:plaid_nonce) { generate_valid_plaid_us_bank_account_nonce }
15
15
 
16
16
  context "nonce" do
17
- it "sale succeeds" do
17
+ # we are temporarily skipping this test until we have a more stable CI env
18
+ xit "sale succeeds" do
18
19
  result = Braintree::Transaction.create(
19
20
  :type => "sale",
20
21
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -41,7 +42,8 @@ describe Braintree::Transaction do
41
42
  end
42
43
 
43
44
  context "token" do
44
- it "payment_method#create then sale succeeds" do
45
+ # we are temporarily skipping this test until we have a more stable CI env
46
+ xit "payment_method#create then sale succeeds" do
45
47
  payment_method = Braintree::PaymentMethod.create(
46
48
  :payment_method_nonce => plaid_nonce,
47
49
  :customer_id => Braintree::Customer.create.customer.id,
@@ -84,7 +86,8 @@ describe Braintree::Transaction do
84
86
  transaction.us_bank_account_details.ach_mandate.accepted_at.should be_a Time
85
87
  end
86
88
 
87
- it "transaction#create store_in_vault then sale succeeds" do
89
+ # we are temporarily skipping this test until we have a more stable CI env
90
+ xit "transaction#create store_in_vault then sale succeeds" do
88
91
  result = Braintree::Transaction.create(
89
92
  :type => "sale",
90
93
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -233,7 +236,8 @@ describe Braintree::Transaction do
233
236
  let(:plaid_nonce) { generate_valid_plaid_us_bank_account_nonce }
234
237
 
235
238
  context "nonce" do
236
- it "sale succeeds" do
239
+ # we are temporarily skipping this test until we have a more stable CI env
240
+ xit "sale succeeds" do
237
241
  result = Braintree::Transaction.create(
238
242
  :type => "sale",
239
243
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -260,7 +264,8 @@ describe Braintree::Transaction do
260
264
  end
261
265
 
262
266
  context "token" do
263
- it "payment_method#create then sale succeeds" do
267
+ # we are temporarily skipping this test until we have a more stable CI env
268
+ xit "payment_method#create then sale succeeds" do
264
269
  result = Braintree::PaymentMethod.create(
265
270
  :payment_method_nonce => plaid_nonce,
266
271
  :customer_id => Braintree::Customer.create.customer.id,
@@ -305,7 +310,8 @@ describe Braintree::Transaction do
305
310
  transaction.us_bank_account_details.ach_mandate.accepted_at.should be_a Time
306
311
  end
307
312
 
308
- it "transaction#create store_in_vault then sale succeeds" do
313
+ # we are temporarily skipping this test until we have a more stable CI env
314
+ xit "transaction#create store_in_vault then sale succeeds" do
309
315
  result = Braintree::Transaction.create(
310
316
  :type => "sale",
311
317
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -39,6 +39,7 @@ unless defined?(SPEC_HELPER_LOADED)
39
39
  AnotherUsBankMerchantAccountId = "another_us_bank_merchant_account"
40
40
  AdyenMerchantAccountId = "adyen_ma"
41
41
  HiperBRLMerchantAccountId = "hiper_brl"
42
+ CardProcessorBRLMerchantAccountId = "card_processor_brl"
42
43
 
43
44
  TrialPlan = {
44
45
  :description => "Plan for integration tests -- with trial",
@@ -24,7 +24,7 @@ describe Braintree::CreditCard do
24
24
  :device_data,
25
25
  :payment_method_nonce,
26
26
  {:external_vault=>[:network_transaction_id]},
27
- {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type]},
27
+ {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type, :verification_currency_iso_code]},
28
28
  {:billing_address => [
29
29
  :company,
30
30
  :country_code_alpha2,
@@ -70,7 +70,7 @@ describe Braintree::CreditCard do
70
70
  :device_data,
71
71
  :payment_method_nonce,
72
72
  {:external_vault=>[:network_transaction_id]},
73
- {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type]},
73
+ {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type, :verification_currency_iso_code]},
74
74
  {:billing_address => [
75
75
  :company,
76
76
  :country_code_alpha2,
@@ -100,7 +100,7 @@ describe Braintree::Customer do
100
100
  :device_data,
101
101
  :payment_method_nonce,
102
102
  {:external_vault=>[:network_transaction_id]},
103
- {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type]},
103
+ {:options => [:make_default, :verification_merchant_account_id, :verify_card, :verification_amount, :venmo_sdk_session, :fail_on_duplicate_payment_method, :verification_account_type, :verification_currency_iso_code]},
104
104
  {:billing_address => [
105
105
  :company,
106
106
  :country_code_alpha2,
@@ -197,6 +197,7 @@ describe Braintree::Customer do
197
197
  :venmo_sdk_session,
198
198
  :fail_on_duplicate_payment_method,
199
199
  :verification_account_type,
200
+ :verification_currency_iso_code,
200
201
  :update_existing_token
201
202
  ]},
202
203
  {:billing_address => [
@@ -18,6 +18,35 @@ describe "Braintree::ResourceCollection" do
18
18
  end
19
19
  end
20
20
 
21
+ describe "#first" do
22
+ it 'returns nil with no results' do
23
+ values = %w(a b c d e)
24
+ collection = Braintree::ResourceCollection.new(:search_results => {:ids => [], :page_size => 2}) do |ids|
25
+ ids.map {|id| values[id] }
26
+ end
27
+
28
+ collection.first.should == nil
29
+ end
30
+
31
+ context 'with results' do
32
+ let(:collection) do
33
+ values = %w(a b c d e)
34
+
35
+ Braintree::ResourceCollection.new(:search_results => {:ids => [0,1,2,3,4], :page_size => 2}) do |ids|
36
+ ids.map {|id| values[id] }
37
+ end
38
+ end
39
+
40
+ it 'returns the first occourence' do
41
+ collection.first.should == 'a'
42
+ end
43
+
44
+ it 'returns the first N occourences' do
45
+ collection.first(4).should == ['a','b','c','d']
46
+ end
47
+ end
48
+ end
49
+
21
50
  describe "#ids" do
22
51
  it "returns a list of the resource collection ids" do
23
52
  collection = Braintree::ResourceCollection.new(:search_results => {:ids => [0,1,2,3,4], :page_size => 2})
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe Braintree::Transaction::Installment do
4
+ describe "inspect" do
5
+ it "assigns all fields" do
6
+ adjustment_attributes = {
7
+ :amount => "0.98",
8
+ :kind => "REFUND",
9
+ :projected_disbursement_date => "2020-01-03 01:02:03Z",
10
+ :actual_disbursement_date => "2020-01-04 01:02:03Z",
11
+ }
12
+ installment_attributes = {
13
+ :id => "abc123",
14
+ :amount => "1.23",
15
+ :projected_disbursement_date => "2020-01-01 01:02:03Z",
16
+ :actual_disbursement_date => "2020-01-02 01:02:03Z",
17
+ :adjustments => [adjustment_attributes],
18
+ }
19
+
20
+ installment = Braintree::Transaction::Installment.new(installment_attributes)
21
+
22
+ expect(installment.inspect).to eq('#<id: "abc123", amount: 0.123e1, projected_disbursement_date: "2020-01-01 01:02:03Z", actual_disbursement_date: "2020-01-02 01:02:03Z", adjustments: [#<amount: 0.98e0, kind: "REFUND", projected_disbursement_date: "2020-01-03 01:02:03Z", actual_disbursement_date: "2020-01-04 01:02:03Z">]>')
23
+ end
24
+ end
25
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-09 00:00:00.000000000 Z
11
+ date: 2021-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -157,6 +157,8 @@ files:
157
157
  - lib/braintree/transaction/customer_details.rb
158
158
  - lib/braintree/transaction/disbursement_details.rb
159
159
  - lib/braintree/transaction/google_pay_details.rb
160
+ - lib/braintree/transaction/installment.rb
161
+ - lib/braintree/transaction/installment/adjustment.rb
160
162
  - lib/braintree/transaction/local_payment_details.rb
161
163
  - lib/braintree/transaction/paypal_details.rb
162
164
  - lib/braintree/transaction/paypal_here_details.rb
@@ -279,6 +281,7 @@ files:
279
281
  - spec/unit/braintree/transaction/credit_card_details_spec.rb
280
282
  - spec/unit/braintree/transaction/customer_details_spec.rb
281
283
  - spec/unit/braintree/transaction/deposit_details_spec.rb
284
+ - spec/unit/braintree/transaction/installment_spec.rb
282
285
  - spec/unit/braintree/transaction/paypal_details_spec.rb
283
286
  - spec/unit/braintree/transaction_search_spec.rb
284
287
  - spec/unit/braintree/transaction_spec.rb