braintree 2.100.0 → 2.101.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: ce8a0ffb1227a51cbb8d3f53339a7b9c6f4ea4cb934a1f8650fe0376394c5e3d
4
- data.tar.gz: b500561e20d50b0b30b816fe9152d2cf838555304a544508d800f4f8202e02c4
3
+ metadata.gz: 4a5d32a025ec741caa8fd1de8f33b64951f8e61cf6c16dbfd32b12ec0d88d81a
4
+ data.tar.gz: e7500376e7de67a7ebda3c275b22235dc298d386edec860994aa15c129807006
5
5
  SHA512:
6
- metadata.gz: d86f151ea614c6c8f5f1297873efa2c8a7e1f567bd05b06fbb9aa6216ef45ccd3b3d6aef0d40204028b05a7bd8fcfa010d9b3670fdd5a88babcc81fdfb7d3a48
7
- data.tar.gz: 70efed7f2733dd6055fc868ca7ff7bf104dcc550a6499c7fe10bb7c1f17f33e4c686eee676463af6bd4725d1a298816871418accba721ad840b6b1d8821006ca
6
+ metadata.gz: 5f8f63a4af2e318f9ac5b9fcbd88f8e7b185e61f9f0fa4e090a75a66ce0c534a50b712af237b8d22b0741319a2764a081991be0b7d8535ab4246858dd8150600
7
+ data.tar.gz: 23cc9b627afc2804750d41a64bbdae27a5ad68df550a7aaebc4c291b96dd31265569ed917cb980952a47190aee52c5d0a04192dbe5e72850eedb534a25419508
@@ -29,6 +29,10 @@ module Braintree
29
29
  @default
30
30
  end
31
31
 
32
+ def is_network_tokenized?
33
+ @is_network_tokenized
34
+ end
35
+
32
36
  def card_type
33
37
  virtual_card_type
34
38
  end
@@ -18,6 +18,10 @@ module Braintree
18
18
 
19
19
  def set_instance_variables_from_hash(hash)
20
20
  hash.each do |key, value|
21
+ if key == :global_id
22
+ instance_variable_set "@graphql_id", value
23
+ end
24
+
21
25
  instance_variable_set "@#{key}", value
22
26
  end
23
27
  end
@@ -22,6 +22,7 @@ module Braintree
22
22
  attr_reader :currency_iso_code
23
23
  attr_reader :cvv_response_code
24
24
  attr_reader :gateway_rejection_reason
25
+ attr_reader :graphql_id
25
26
  attr_reader :id
26
27
  attr_reader :merchant_account_id
27
28
  attr_reader :network_response_code
@@ -15,6 +15,7 @@ module Braintree
15
15
  attr_reader :email
16
16
  attr_reader :fax
17
17
  attr_reader :first_name
18
+ attr_reader :graphql_id
18
19
  attr_reader :id
19
20
  attr_reader :last_name
20
21
  attr_reader :masterpass_cards
@@ -12,6 +12,7 @@ module Braintree
12
12
  attr_reader :date_opened
13
13
  attr_reader :date_won
14
14
  attr_reader :evidence
15
+ attr_reader :graphql_id
15
16
  attr_reader :id
16
17
  attr_reader :kind
17
18
  attr_reader :merchant_account_id
@@ -323,29 +323,21 @@ module Braintree
323
323
  CannotUpdateTransactionDetailsNotSubmittedForSettlement = "915129"
324
324
  ChannelIsTooLong = "91550"
325
325
  CreditCardIsRequired = "91508"
326
- CustomFieldIsInvalid = "91526"
327
- CustomFieldIsTooLong = "81527"
328
326
  CustomerDefaultPaymentMethodCardTypeIsNotAccepted = "81509"
329
327
  CustomerDoesNotHaveCreditCard = "91511"
330
328
  CustomerIdIsInvalid = "91510"
329
+ CustomFieldIsInvalid = "91526"
330
+ CustomFieldIsTooLong = "81527"
331
+ DiscountAmountCannotBeNegative = "915160"
332
+ DiscountAmountFormatIsInvalid = "915159"
333
+ DiscountAmountIsTooLarge = "915161"
331
334
  FailedAuthAdjustmentAllowRetry = "95603"
332
335
  FailedAuthAdjustmentHardDecline = "95602"
333
336
  FinalAuthSubmitForSettlementForDifferentAmount = "95601"
334
337
  HasAlreadyBeenRefunded = "91512"
335
338
  IdealPaymentNotComplete = "815141"
336
- PaymentInstrumentWithExternalVaultIsInvalid = "915176"
337
- TooManyLineItems = "915157"
338
- LineItemsExpected = "915158"
339
- DiscountAmountFormatIsInvalid = "915159"
340
- DiscountAmountCannotBeNegative = "915160"
341
- DiscountAmountIsTooLarge = "915161"
342
- ShippingAmountFormatIsInvalid = "915162"
343
- ShippingAmountCannotBeNegative = "915163"
344
- ShippingAmountIsTooLarge = "915164"
345
- ShipsFromPostalCodeIsTooLong = "915165"
346
- ShipsFromPostalCodeIsInvalid = "915166"
347
- ShipsFromPostalCodeInvalidCharacters = "915167"
348
339
  IdealPaymentsCannotBeVaulted = "915150"
340
+ LineItemsExpected = "915158"
349
341
  MerchantAccountDoesNotMatch3DSecureMerchantAccount = "91584"
350
342
  MerchantAccountDoesNotMatchIdealPaymentMerchantAccount = "915143"
351
343
  MerchantAccountDoesNotSupportMOTO = "91558"
@@ -353,14 +345,12 @@ module Braintree
353
345
  MerchantAccountIdDoesNotMatchSubscription = "915180"
354
346
  MerchantAccountIdIsInvalid = "91513"
355
347
  MerchantAccountIsSuspended = "91514"
356
- OrderIdIsTooLong = "91501"
357
- OrderIdIsRequiredWithIdealPayment = "91502"
358
348
  OrderIdDoesNotMatchIdealPaymentOrderId = "91503"
359
- PayPalAuthExpired = "91579"
360
- PayPalNotEnabled = "91576"
361
- PayPalVaultRecordMissingData = "91583"
349
+ OrderIdIsRequiredWithIdealPayment = "91502"
350
+ OrderIdIsTooLong = "91501"
362
351
  PaymentInstrumentNotSupportedByMerchantAccount = "91577"
363
352
  PaymentInstrumentTypeIsNotAccepted = "915101"
353
+ PaymentInstrumentWithExternalVaultIsInvalid = "915176"
364
354
  PaymentMethodConflict = "91515"
365
355
  PaymentMethodConflictWithVenmoSDK = "91549"
366
356
  PaymentMethodDoesNotBelongToCustomer = "91516"
@@ -368,25 +358,28 @@ module Braintree
368
358
  PaymentMethodNonceCardTypeIsNotAccepted = "91567"
369
359
  PaymentMethodNonceConsumed = "91564"
370
360
  PaymentMethodNonceHasNoValidPaymentInstrumentType = "91569"
371
- UsBankAccountNonceMustBePlaidVerified = "915171"
372
- UsBankAccountNotVerified = "915172"
373
361
  PaymentMethodNonceLocked = "91566"
374
362
  PaymentMethodNonceUnknown = "91565"
375
363
  PaymentMethodTokenCardTypeIsNotAccepted = "91517"
376
364
  PaymentMethodTokenIsInvalid = "91518"
365
+ PayPalAuthExpired = "91579"
366
+ PayPalNotEnabled = "91576"
367
+ PayPalVaultRecordMissingData = "91583"
377
368
  ProcessorAuthorizationCodeCannotBeSet = "91519"
378
369
  ProcessorAuthorizationCodeIsInvalid = "81520"
379
370
  ProcessorDoesNotSupportAuths = "915104"
380
- ProcessorDoesNotSupportUpdatingOrderId = "915107"
381
- ProcessorDoesNotSupportUpdatingDescriptor = "915108"
382
- ProcessorDoesNotSupportUpdatingTransactionDetails = "915130"
383
371
  ProcessorDoesNotSupportCredits = "91546"
372
+ ProcessorDoesNotSupportMotoForCardType = "915195"
384
373
  ProcessorDoesNotSupportPartialSettlement = "915102"
374
+ ProcessorDoesNotSupportUpdatingDescriptor = "915108"
375
+ ProcessorDoesNotSupportUpdatingOrderId = "915107"
376
+ ProcessorDoesNotSupportUpdatingTransactionDetails = "915130"
385
377
  ProcessorDoesNotSupportVoiceAuthorizations = "91545"
386
- ProcessorDoesNotSupportMotoForCardType = "915195"
387
378
  PurchaseOrderNumberIsInvalid = "91548"
388
379
  PurchaseOrderNumberIsTooLong = "91537"
389
380
  RefundAmountIsTooLarge = "91521"
381
+ RefundAuthHardDeclined = "915200"
382
+ RefundAuthSoftDeclined = "915201"
390
383
  ServiceFeeAmountCannotBeNegative = "91554"
391
384
  ServiceFeeAmountFormatIsInvalid = "91555"
392
385
  ServiceFeeAmountIsTooLarge = "91556"
@@ -396,6 +389,12 @@ module Braintree
396
389
  SettlementAmountIsLessThanServiceFeeAmount = "91551"
397
390
  SettlementAmountIsTooLarge = "91522"
398
391
  ShippingAddressDoesntMatchCustomer = "91581"
392
+ ShippingAmountCannotBeNegative = "915163"
393
+ ShippingAmountFormatIsInvalid = "915162"
394
+ ShippingAmountIsTooLarge = "915164"
395
+ ShipsFromPostalCodeInvalidCharacters = "915167"
396
+ ShipsFromPostalCodeIsInvalid = "915166"
397
+ ShipsFromPostalCodeIsTooLong = "915165"
399
398
  SubMerchantAccountRequiresServiceFeeAmount = "91553"
400
399
  SubscriptionDoesNotBelongToCustomer = "91529"
401
400
  SubscriptionIdIsInvalid = "91528"
@@ -404,21 +403,28 @@ module Braintree
404
403
  TaxAmountFormatIsInvalid = "81535"
405
404
  TaxAmountIsTooLarge = "81536"
406
405
  ThreeDSecureAuthenticationFailed = "81571"
407
- ThreeDSecureTokenIsInvalid = "91568"
408
- ThreeDSecureTransactionDataDoesntMatchVerify = "91570"
409
- ThreeDSecureEciFlagIsRequired = "915113"
410
- ThreeDSecureCavvIsRequired = "915116"
411
- ThreeDSecureXidIsRequired = "915115"
412
- ThreeDSecureEciFlagIsInvalid = "915114"
413
- ThreeDSecureThreeDSecureVersionIsInvalid = "915119"
406
+ ThreeDSecureAuthenticationIdDoesntMatchNonceThreeDSecureAuthentication = "915198"
407
+ ThreeDSecureAuthenticationIdIsInvalid = "915196"
408
+ ThreeDSecureAuthenticationIdWithThreeDSecurePassThruIsInvalid = "915199"
414
409
  ThreeDSecureAuthenticationResponseIsInvalid = "915120"
415
- ThreeDSecureDirectoryResponseIsInvalid = "915121"
416
410
  ThreeDSecureCavvAlgorithmIsInvalid = "915122"
411
+ ThreeDSecureCavvIsRequired = "915116"
412
+ ThreeDSecureDirectoryResponseIsInvalid = "915121"
413
+ ThreeDSecureEciFlagIsInvalid = "915114"
414
+ ThreeDSecureEciFlagIsRequired = "915113"
417
415
  ThreeDSecureMerchantAccountDoesNotSupportCardType = "915131"
416
+ ThreeDSecureThreeDSecureVersionIsInvalid = "915119"
417
+ ThreeDSecureTokenIsInvalid = "91568"
418
+ ThreeDSecureTransactionDataDoesntMatchVerify = "91570"
419
+ ThreeDSecureTransactionPaymentMethodDoesntMatchThreeDSecureAuthenticationPaymentMethod = "915197"
420
+ ThreeDSecureXidIsRequired = "915115"
421
+ TooManyLineItems = "915157"
422
+ TransactionSourceIsInvalid = "915133"
418
423
  TypeIsInvalid = "91523"
419
424
  TypeIsRequired = "91524"
420
425
  UnsupportedVoiceAuthorization = "91539"
421
- TransactionSourceIsInvalid = "915133"
426
+ UsBankAccountNonceMustBePlaidVerified = "915171"
427
+ UsBankAccountNotVerified = "915172"
422
428
 
423
429
  module Options
424
430
  SubmitForSettlementIsRequiredForCloning = "91544"
@@ -19,10 +19,16 @@ module Braintree
19
19
  request['variables'] = variables
20
20
 
21
21
  response = _http_do Net::HTTP::Post, @config.graphql_base_url, request.to_json, nil, graphql_connection, @graphql_headers
22
- data = JSON.parse(response.body, :symbolize_names => true)
22
+ data = _parse_response(response)
23
23
  Util.raise_exception_for_graphql_error(data)
24
24
 
25
25
  data
26
26
  end
27
+
28
+ def _parse_response(response)
29
+ body = response.body
30
+ body = Zlib::GzipReader.new(StringIO.new(body)).read if response.header['Content-Encoding'] == "gzip"
31
+ JSON.parse(body, :symbolize_names => true)
32
+ end
27
33
  end
28
34
  end
@@ -178,6 +178,7 @@ module Braintree
178
178
  options << :fail_on_duplicate_payment_method
179
179
  signature << :customer_id
180
180
  signature << :paypal_refresh_token
181
+ # NEXT_MAJOR_VERSION remove this from the signature
181
182
  signature << :paypal_vault_without_upgrade
182
183
  when :update
183
184
  billing_address_params << {:options => [:update_existing]}
@@ -11,6 +11,7 @@ module Braintree
11
11
  attr_reader :eci_flag
12
12
  attr_reader :three_d_secure_version
13
13
  attr_reader :ds_transaction_id
14
+ attr_reader :three_d_secure_authentication_id
14
15
 
15
16
  alias_method :liability_shifted?, :liability_shifted
16
17
  alias_method :liability_shift_possible?, :liability_shift_possible
@@ -30,6 +31,7 @@ module Braintree
30
31
  :eci_flag,
31
32
  :three_d_secure_version,
32
33
  :ds_transaction_id,
34
+ :three_d_secure_authentication_id,
33
35
  ]
34
36
 
35
37
  formatted_attrs = attr_order.map do |attr|
@@ -119,6 +119,7 @@ module Braintree
119
119
  attr_reader :facilitated_details
120
120
  attr_reader :facilitator_details
121
121
  attr_reader :gateway_rejection_reason
122
+ attr_reader :graphql_id
122
123
  attr_reader :id
123
124
  # NEXT_MAJOR_VERSION Remove this class as legacy Ideal has been removed/disabled in the Braintree Gateway
124
125
  # DEPRECATED If you're looking to accept iDEAL as a payment method contact accounts@braintreepayments.com for a solution.
@@ -32,6 +32,10 @@ module Braintree
32
32
  @card_type = @virtual_card_type
33
33
  @last_4 = @virtual_card_last_4
34
34
  end
35
+
36
+ def is_network_tokenized?
37
+ @is_network_tokenized
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -188,7 +188,7 @@ module Braintree
188
188
  :purchase_order_number, :recurring, :transaction_source, :shipping_address_id, :type, :tax_amount, :tax_exempt,
189
189
  :venmo_sdk_payment_method_code, :device_session_id, :service_fee_amount, :device_data, :fraud_merchant_id,
190
190
  :shipping_amount, :discount_amount, :ships_from_postal_code,
191
- :billing_address_id, :payment_method_nonce, :three_d_secure_token,
191
+ :billing_address_id, :payment_method_nonce, :three_d_secure_token, :three_d_secure_authentication_id,
192
192
  :shared_payment_method_token, :shared_billing_address_id, :shared_customer_id, :shared_shipping_address_id, :shared_payment_method_nonce,
193
193
  {: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]},
194
194
  {:risk_data => [:customer_browser, :customer_ip]},
@@ -263,6 +263,13 @@ module Braintree
263
263
  [
264
264
  :order_id,
265
265
  {:descriptor => [:name, :phone, :url]},
266
+ :purchase_order_number,
267
+ :tax_amount,
268
+ :tax_exempt,
269
+ :discount_amount,
270
+ :shipping_amount,
271
+ :ships_from_postal_code,
272
+ :line_items => [:commodity_code, :description, :discount_amount, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :url, :tax_amount],
266
273
  ]
267
274
  end
268
275
 
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 2
4
- Minor = 100
4
+ Minor = 101
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -56,83 +56,93 @@ def nonce_for_paypal_account(paypal_account_details)
56
56
  end
57
57
 
58
58
  def generate_non_plaid_us_bank_account_nonce(account_number="1000000000")
59
- raw_client_token = Braintree::ClientToken.generate
60
- client_token = decode_client_token(raw_client_token)
61
-
62
- url = client_token["braintree_api"]["url"] + "/tokens"
63
- token = client_token["braintree_api"]["access_token"]
64
- payload = {
65
- :type => "us_bank_account",
66
- :billing_address => {
67
- :street_address => "123 Ave",
68
- :region => "CA",
69
- :locality => "San Francisco",
70
- :postal_code => "94112"
71
- },
72
- :account_type => "checking",
73
- :routing_number => "021000021",
74
- :account_number => account_number,
75
- :first_name => "John",
76
- :last_name => "Doe",
77
- :ownership_type => "personal",
78
- :ach_mandate => {
79
- :text => "cl mandate text"
59
+ definition = <<-GRAPHQL
60
+ mutation TokenizeUsBankAccount($input: TokenizeUsBankAccountInput!) {
61
+ tokenizeUsBankAccount(input: $input) {
62
+ paymentMethod {
63
+ id
80
64
  }
81
65
  }
66
+ }
67
+ GRAPHQL
68
+ variables = {
69
+ input: {
70
+ usBankAccount: {
71
+ achMandate: "cl mandate text",
72
+ routingNumber: "021000021",
73
+ accountNumber: account_number,
74
+ accountType: "CHECKING",
75
+ individualOwner: {
76
+ firstName: "John",
77
+ lastName: "Doe",
78
+ },
79
+ billingAddress: {
80
+ streetAddress: "123 Ave",
81
+ city: "San Francisco",
82
+ state: "CA",
83
+ zipCode: "94112"
84
+ }
85
+ }
86
+ }
87
+ }
88
+ response = Braintree::GraphQLClient.new(Braintree::Configuration.instantiate).query(definition, variables)
82
89
 
83
- json = _cosmos_post(token, url, payload)
84
- json["data"]["id"]
90
+ response[:data][:tokenizeUsBankAccount][:paymentMethod][:id]
85
91
  end
86
92
 
87
93
  def generate_valid_plaid_us_bank_account_nonce
88
94
  raw_client_token = Braintree::ClientToken.generate
89
95
  client_token = decode_client_token(raw_client_token)
90
96
 
91
- url = client_token["braintree_api"]["url"] + "/tokens"
92
- token = client_token["braintree_api"]["access_token"]
93
- payload = {
94
- :type => "plaid_public_token",
95
- :public_token => "good",
96
- :account_id => "plaid_account_id",
97
- :ownership_type => "business",
98
- :business_name => "PayPal, Inc.",
99
- :billing_address => {
100
- :street_address => "123 Ave",
101
- :region => "CA",
102
- :locality => "San Francisco",
103
- :postal_code => "94112"
104
- },
105
- :ach_mandate => {
106
- :text => "cl mandate text"
97
+ url = client_token["graphQL"]["url"]
98
+ date = client_token["graphQL"]["date"]
99
+ token = client_token["authorizationFingerprint"]
100
+
101
+ definition = <<-GRAPHQL
102
+ mutation TokenizeUsBankLogin($input: TokenizeUsBankLoginInput!) {
103
+ tokenizeUsBankLogin(input: $input) {
104
+ paymentMethod {
105
+ id
106
+ }
107
+ }
108
+ }
109
+ GRAPHQL
110
+ variables = {
111
+ input: {
112
+ usBankLogin: {
113
+ achMandate: "cl mandate text",
114
+ publicToken: "good",
115
+ accountId: "plaid_account_id",
116
+ accountType: "CHECKING",
117
+ businessOwner: {
118
+ businessName: "PayPal, Inc."
119
+ },
120
+ billingAddress: {
121
+ streetAddress: "123 Ave",
122
+ city: "San Francisco",
123
+ state: "CA",
124
+ zipCode: "94112"
125
+ }
126
+ }
107
127
  }
108
128
  }
109
-
110
- json = _cosmos_post(token, url, payload)
111
- json["data"]["id"]
112
- end
113
-
114
- def generate_valid_ideal_payment_nonce(amount = Braintree::Test::TransactionAmounts::Authorize)
115
- raw_client_token = Braintree::ClientToken.generate(:merchant_account_id => "ideal_merchant_account")
116
- client_token = decode_client_token(raw_client_token)
117
- client = ClientApiHttp.new(
118
- Braintree::Configuration.instantiate,
119
- :authorization_fingerprint => client_token["authorizationFingerprint"],
120
- )
121
- config = JSON.parse(client.get_configuration.body)
122
-
123
- token = client_token["braintree_api"]["access_token"]
124
- url = client_token["braintree_api"]["url"] + "/ideal-payments"
125
129
  payload = {
126
- :issuer => "RABONL2U",
127
- :order_id => SpecHelper::DefaultOrderId,
128
- :amount => amount,
129
- :currency => "EUR",
130
- :redirect_url => "https://braintree-api.com",
131
- :route_id => config["ideal"]["routeId"]
130
+ query: definition,
131
+ variables: variables
132
132
  }
133
+ uri = URI::parse(url)
134
+ connection = Net::HTTP.new(uri.host, uri.port)
135
+ connection.use_ssl = false
136
+ response = connection.start do |http|
137
+ request = Net::HTTP::Post.new(uri.path)
138
+ request["Content-Type"] = "application/json"
139
+ request["Braintree-Version"] = date
140
+ request["Authorization"] = "Bearer #{token}"
141
+ request.body = payload.to_json
142
+ http.request(request)
143
+ end
133
144
 
134
- json = _cosmos_post(token, url, payload)
135
- json["data"]["id"]
145
+ JSON.parse(response.body)[:data][:tokenizeUsBankLogin][:paymentMethod][:id]
136
146
  end
137
147
 
138
148
  def sample(arr)
@@ -146,23 +156,6 @@ def generate_invalid_us_bank_account_nonce
146
156
  nonce += "_xxx"
147
157
  end
148
158
 
149
- def _cosmos_post(token, url, payload)
150
- uri = URI::parse(url)
151
- connection = Net::HTTP.new(uri.host, uri.port)
152
- connection.use_ssl = true
153
- connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
154
- resp = connection.start do |http|
155
- request = Net::HTTP::Post.new(uri.path)
156
- request["Content-Type"] = "application/json"
157
- request["Braintree-Version"] = "2016-10-07"
158
- request["Authorization"] = "Bearer #{token}"
159
- request.body = payload.to_json
160
- http.request(request)
161
- end
162
-
163
- JSON.parse(resp.body)
164
- end
165
-
166
159
  class ClientApiHttp
167
160
  attr_reader :config, :options
168
161
 
@@ -246,6 +246,7 @@ describe Braintree::CreditCard do
246
246
  three_d_secure_info.eci_flag.should == "05"
247
247
  three_d_secure_info.three_d_secure_version.should == "1.0.2"
248
248
  three_d_secure_info.ds_transaction_id.should == nil
249
+ three_d_secure_info.three_d_secure_authentication_id.should_not be_nil
249
250
  end
250
251
 
251
252
  it "adds credit card with billing address to customer" do
@@ -1274,7 +1275,7 @@ describe Braintree::CreditCard do
1274
1275
  Braintree::CreditCard.create!(
1275
1276
  :customer_id => customer.id,
1276
1277
  :number => Braintree::Test::CreditCardNumbers::Visa,
1277
- :expiration_date => "01/2015"
1278
+ :expiration_date => "01/#{Time.now.year - 3}"
1278
1279
  )
1279
1280
  end
1280
1281
 
@@ -161,6 +161,7 @@ describe Braintree::CreditCardVerification, "search" do
161
161
  found_verification = Braintree::CreditCardVerification.find(credit_card_verification.id)
162
162
 
163
163
  found_verification.should == credit_card_verification
164
+ found_verification.graphql_id.should_not be_nil
164
165
  end
165
166
 
166
167
  it "raises a NotFoundError exception if verification cannot be found" do
@@ -889,6 +889,7 @@ describe Braintree::Customer do
889
889
 
890
890
  customer = Braintree::Customer.find(result.customer.id)
891
891
  customer.id.should == result.customer.id
892
+ customer.graphql_id.should_not be_nil
892
893
  customer.first_name.should == "Joe"
893
894
  customer.last_name.should == "Cool"
894
895
  end
@@ -1015,6 +1016,7 @@ describe Braintree::Customer do
1015
1016
  android_pay_card.should be_a Braintree::AndroidPayCard
1016
1017
  android_pay_card.token.should_not be_nil
1017
1018
  android_pay_card.expiration_year.should_not be_nil
1019
+ android_pay_card.is_network_tokenized?.should == false
1018
1020
  end
1019
1021
 
1020
1022
  it "returns associated android pay network tokens" do
@@ -1030,6 +1032,7 @@ describe Braintree::Customer do
1030
1032
  android_pay_card.should be_a Braintree::AndroidPayCard
1031
1033
  android_pay_card.token.should_not be_nil
1032
1034
  android_pay_card.expiration_year.should_not be_nil
1035
+ android_pay_card.is_network_tokenized?.should == true
1033
1036
  end
1034
1037
 
1035
1038
  it "returns associated amex express checkout cards" do
@@ -74,7 +74,7 @@ describe Braintree::Dispute, "search" do
74
74
  ]
75
75
  end
76
76
 
77
- expect(collection.disputes.count).to eq(2)
77
+ expect(collection.disputes.count).to be >= 2
78
78
  dispute = collection.disputes.first
79
79
  end
80
80
 
@@ -186,6 +186,7 @@ describe Braintree::Dispute do
186
186
  dispute.amount_disputed.should == 31.0
187
187
  dispute.amount_won.should == 0.0
188
188
  dispute.id.should == "open_dispute"
189
+ dispute.graphql_id.should_not be_nil
189
190
  dispute.status.should == Braintree::Dispute::Status::Open
190
191
  dispute.transaction.amount.should == 31.0
191
192
  dispute.transaction.id.should == "open_disputed_transaction"
@@ -84,10 +84,14 @@ describe Braintree::PaymentMethodNonce do
84
84
  end
85
85
 
86
86
  it "return paypal details if details exist" do
87
- result = Braintree::PaymentMethodNonce.find("fake-google-pay-paypal-nonce")
88
-
87
+ result = Braintree::PaymentMethodNonce.find("fake-paypal-one-time-nonce")
89
88
  nonce = result.payment_method_nonce
90
89
 
90
+ nonce.details.fetch(:cobranded_card_label).should_not be_nil
91
+ nonce.details.fetch(:shipping_option_id).should_not be_nil
92
+ nonce.details.fetch(:billing_address).fetch(:recipient_name).should_not be_nil
93
+ nonce.details.fetch(:shipping_address).fetch(:recipient_name).should_not be_nil
94
+
91
95
  nonce.details.fetch(:payer_info).fetch(:first_name).should_not be_nil
92
96
  nonce.details.fetch(:payer_info).fetch(:last_name).should_not be_nil
93
97
  nonce.details.fetch(:payer_info).fetch(:email).should_not be_nil
@@ -121,6 +121,7 @@ describe Braintree::PaymentMethod do
121
121
  android_pay_card.expiration_year.to_i.should > 0
122
122
  android_pay_card.default.should == true
123
123
  android_pay_card.image_url.should =~ /android_pay/
124
+ android_pay_card.is_network_tokenized?.should == false
124
125
  android_pay_card.source_card_type.should == Braintree::CreditCard::CardType::Discover
125
126
  android_pay_card.source_card_last_4.should == "1111"
126
127
  android_pay_card.google_transaction_id.should == "google_transaction_id"
@@ -148,6 +149,7 @@ describe Braintree::PaymentMethod do
148
149
  android_pay_card.expiration_year.to_i.should > 0
149
150
  android_pay_card.default.should == true
150
151
  android_pay_card.image_url.should =~ /android_pay/
152
+ android_pay_card.is_network_tokenized?.should == true
151
153
  android_pay_card.source_card_type.should == Braintree::CreditCard::CardType::MasterCard
152
154
  android_pay_card.source_card_last_4.should == "4444"
153
155
  android_pay_card.google_transaction_id.should == "google_transaction_id"
@@ -727,24 +729,6 @@ describe Braintree::PaymentMethod do
727
729
  found_paypal_account.payer_id.should_not be_nil
728
730
  end
729
731
 
730
- it "creates a billing agreement payment method from a refresh token without upgrading" do
731
- customer = Braintree::Customer.create.customer
732
- result = Braintree::PaymentMethod.create(
733
- :customer_id => customer.id,
734
- :paypal_refresh_token => "some_future_payment_token",
735
- :paypal_vault_without_upgrade => true,
736
- )
737
-
738
- result.should be_success
739
- result.payment_method.should be_a(Braintree::PayPalAccount)
740
- result.payment_method.billing_agreement_id.should be_nil
741
- token = result.payment_method.token
742
-
743
- found_paypal_account = Braintree::PayPalAccount.find(token)
744
- found_paypal_account.should_not be_nil
745
- found_paypal_account.billing_agreement_id.should be_nil
746
- end
747
-
748
732
  it "does not create a payment method from an unvalidated onetime paypal account nonce" do
749
733
  customer = Braintree::Customer.create.customer
750
734
  nonce = nonce_for_paypal_account(:access_token => "PAYPAL_ACCESS_TOKEN")
@@ -1017,6 +1001,7 @@ describe Braintree::PaymentMethod do
1017
1001
  android_pay_card.expiration_year.to_i.should > 0
1018
1002
  android_pay_card.default.should == true
1019
1003
  android_pay_card.image_url.should =~ /android_pay/
1004
+ android_pay_card.is_network_tokenized?.should == false
1020
1005
  android_pay_card.source_card_type.should == Braintree::CreditCard::CardType::Discover
1021
1006
  android_pay_card.source_card_last_4.should == "1111"
1022
1007
  android_pay_card.google_transaction_id.should == "google_transaction_id"
@@ -1044,6 +1029,7 @@ describe Braintree::PaymentMethod do
1044
1029
  android_pay_card.expiration_year.to_i.should > 0
1045
1030
  android_pay_card.default.should == true
1046
1031
  android_pay_card.image_url.should =~ /android_pay/
1032
+ android_pay_card.is_network_tokenized?.should == true
1047
1033
  android_pay_card.source_card_type.should == Braintree::CreditCard::CardType::MasterCard
1048
1034
  android_pay_card.source_card_last_4.should == "4444"
1049
1035
  android_pay_card.google_transaction_id.should == "google_transaction_id"
@@ -1706,6 +1706,7 @@ describe Braintree::Transaction do
1706
1706
  android_pay_details.expiration_year.to_i.should > 0
1707
1707
  android_pay_details.google_transaction_id.should == "google_transaction_id"
1708
1708
  android_pay_details.image_url.should_not be_nil
1709
+ android_pay_details.is_network_tokenized?.should == false
1709
1710
  android_pay_details.token.should be_nil
1710
1711
  android_pay_details.prepaid.should_not be_nil
1711
1712
  android_pay_details.healthcare.should_not be_nil
@@ -1737,6 +1738,7 @@ describe Braintree::Transaction do
1737
1738
  android_pay_details.expiration_year.to_i.should > 0
1738
1739
  android_pay_details.google_transaction_id.should == "google_transaction_id"
1739
1740
  android_pay_details.image_url.should_not be_nil
1741
+ android_pay_details.is_network_tokenized?.should == false
1740
1742
  android_pay_details.token.should_not be_nil
1741
1743
  end
1742
1744
 
@@ -1759,6 +1761,7 @@ describe Braintree::Transaction do
1759
1761
  android_pay_details.expiration_month.to_i.should > 0
1760
1762
  android_pay_details.expiration_year.to_i.should > 0
1761
1763
  android_pay_details.google_transaction_id.should == "google_transaction_id"
1764
+ android_pay_details.is_network_tokenized?.should == true
1762
1765
  end
1763
1766
 
1764
1767
  it "can create a transaction with a fake amex express checkout card nonce" do
@@ -2085,6 +2088,7 @@ describe Braintree::Transaction do
2085
2088
 
2086
2089
  result = Braintree::Transaction.create(
2087
2090
  :type => "sale",
2091
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2088
2092
  :amount => Braintree::Test::TransactionAmounts::Authorize,
2089
2093
  :credit_card => {
2090
2094
  :number => Braintree::Test::CreditCardNumbers::Visa,
@@ -2121,7 +2125,8 @@ describe Braintree::Transaction do
2121
2125
  result.transaction.gateway_rejection_reason.should == Braintree::Transaction::GatewayRejectionReason::ThreeDSecure
2122
2126
  end
2123
2127
 
2124
- it "can create a transaction without a three_d_secure token" do
2128
+
2129
+ it "can create a transaction without a three_d_secure_authentication_id" do
2125
2130
  result = Braintree::Transaction.create(
2126
2131
  :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2127
2132
  :type => "sale",
@@ -2134,41 +2139,174 @@ describe Braintree::Transaction do
2134
2139
  result.success?.should == true
2135
2140
  end
2136
2141
 
2137
- it "returns an error if sent a nil three_d_secure token" do
2138
- result = Braintree::Transaction.create(
2139
- :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2140
- :type => "sale",
2141
- :amount => Braintree::Test::TransactionAmounts::Authorize,
2142
- :credit_card => {
2142
+ context "with three_d_secure_authentication_id" do
2143
+ it "can create a transaction with a three_d_secure_authentication_id" do
2144
+ three_d_secure_authentication_id = SpecHelper.create_3ds_verification(
2145
+ SpecHelper::ThreeDSecureMerchantAccountId,
2143
2146
  :number => Braintree::Test::CreditCardNumbers::Visa,
2144
- :expiration_date => "12/12",
2145
- },
2146
- :three_d_secure_token => nil
2147
- )
2148
- result.success?.should == false
2149
- result.errors.for(:transaction).on(:three_d_secure_token)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTokenIsInvalid
2147
+ :expiration_month => "12",
2148
+ :expiration_year => "2022"
2149
+ )
2150
+
2151
+ result = Braintree::Transaction.create(
2152
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2153
+ :type => "sale",
2154
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2155
+ :credit_card => {
2156
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2157
+ :expiration_date => "12/22",
2158
+ },
2159
+ :three_d_secure_authentication_id => three_d_secure_authentication_id
2160
+ )
2161
+
2162
+ result.success?.should == true
2163
+ end
2164
+ it "returns an error if sent a nil three_d_secure_authentication_id" do
2165
+ result = Braintree::Transaction.create(
2166
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2167
+ :type => "sale",
2168
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2169
+ :credit_card => {
2170
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2171
+ :expiration_date => "12/12",
2172
+ },
2173
+ :three_d_secure_authentication_id => nil
2174
+ )
2175
+ result.success?.should == false
2176
+ result.errors.for(:transaction).on(:three_d_secure_authentication_id)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureAuthenticationIdIsInvalid
2177
+ end
2178
+ it "returns an error if merchant_account in the payment_method does not match with 3ds data" do
2179
+ three_d_secure_authentication_id = SpecHelper.create_3ds_verification(
2180
+ SpecHelper::ThreeDSecureMerchantAccountId,
2181
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2182
+ :expiration_month => "12",
2183
+ :expiration_year => "2012"
2184
+ )
2185
+
2186
+ result = Braintree::Transaction.create(
2187
+ :type => "sale",
2188
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2189
+ :credit_card => {
2190
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
2191
+ :expiration_date => "12/12",
2192
+ },
2193
+ :three_d_secure_authentication_id => three_d_secure_authentication_id
2194
+ )
2195
+ result.success?.should == false
2196
+ result.errors.for(:transaction).on(:three_d_secure_authentication_id)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTransactionPaymentMethodDoesntMatchThreeDSecureAuthenticationPaymentMethod
2197
+ end
2198
+ it "returns an error if 3ds lookup data does not match txn data" do
2199
+ three_d_secure_authentication_id = SpecHelper.create_3ds_verification(
2200
+ SpecHelper::ThreeDSecureMerchantAccountId,
2201
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2202
+ :expiration_month => "12",
2203
+ :expiration_year => "2012"
2204
+ )
2205
+
2206
+ result = Braintree::Transaction.create(
2207
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2208
+ :type => "sale",
2209
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2210
+ :credit_card => {
2211
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
2212
+ :expiration_date => "12/12",
2213
+ },
2214
+ :three_d_secure_authentication_id => three_d_secure_authentication_id
2215
+ )
2216
+ result.success?.should == false
2217
+ result.errors.for(:transaction).on(:three_d_secure_authentication_id)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTransactionPaymentMethodDoesntMatchThreeDSecureAuthenticationPaymentMethod
2218
+ end
2219
+ it "returns an error if three_d_secure_authentication_id is supplied with three_d_secure_pass_thru" do
2220
+ three_d_secure_authentication_id = SpecHelper.create_3ds_verification(
2221
+ SpecHelper::ThreeDSecureMerchantAccountId,
2222
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2223
+ :expiration_month => "12",
2224
+ :expiration_year => "2012"
2225
+ )
2226
+ result = Braintree::Transaction.create(
2227
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2228
+ :type => "sale",
2229
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2230
+ :credit_card => {
2231
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2232
+ :expiration_date => "12/12",
2233
+ },
2234
+ :three_d_secure_authentication_id => three_d_secure_authentication_id,
2235
+ :three_d_secure_pass_thru => {
2236
+ :eci_flag => "02",
2237
+ :cavv => "some_cavv",
2238
+ :xid => "some_xid",
2239
+ :three_d_secure_version => "1.0.2",
2240
+ :authentication_response => "Y",
2241
+ :directory_response => "Y",
2242
+ :cavv_algorithm => "2",
2243
+ :ds_transaction_id => "some_ds_id",
2244
+ }
2245
+ )
2246
+ result.success?.should == false
2247
+ result.errors.for(:transaction).on(:three_d_secure_authentication_id)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureAuthenticationIdWithThreeDSecurePassThruIsInvalid
2248
+ end
2150
2249
  end
2151
2250
 
2152
- it "returns an error if 3ds lookup data does not match txn data" do
2153
- three_d_secure_token = SpecHelper.create_3ds_verification(
2154
- SpecHelper::ThreeDSecureMerchantAccountId,
2155
- :number => Braintree::Test::CreditCardNumbers::Visa,
2156
- :expiration_month => "12",
2157
- :expiration_year => "2012"
2158
- )
2251
+ context "with three_d_secure_token" do
2252
+ it "can create a transaction with a three_d_secure token" do
2253
+ three_d_secure_token = SpecHelper.create_3ds_verification(
2254
+ SpecHelper::ThreeDSecureMerchantAccountId,
2255
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2256
+ :expiration_month => "12",
2257
+ :expiration_year => "2012"
2258
+ )
2159
2259
 
2160
- result = Braintree::Transaction.create(
2161
- :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2162
- :type => "sale",
2163
- :amount => Braintree::Test::TransactionAmounts::Authorize,
2164
- :credit_card => {
2165
- :number => Braintree::Test::CreditCardNumbers::MasterCard,
2166
- :expiration_date => "12/12",
2167
- },
2168
- :three_d_secure_token => three_d_secure_token
2169
- )
2170
- result.success?.should == false
2171
- result.errors.for(:transaction).on(:three_d_secure_token)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTransactionDataDoesntMatchVerify
2260
+ result = Braintree::Transaction.create(
2261
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2262
+ :type => "sale",
2263
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2264
+ :credit_card => {
2265
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2266
+ :expiration_date => "12/12",
2267
+ },
2268
+ :three_d_secure_token => three_d_secure_token
2269
+ )
2270
+
2271
+ result.success?.should == true
2272
+ end
2273
+
2274
+ it "returns an error if sent a nil three_d_secure token" do
2275
+ result = Braintree::Transaction.create(
2276
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2277
+ :type => "sale",
2278
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2279
+ :credit_card => {
2280
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2281
+ :expiration_date => "12/12",
2282
+ },
2283
+ :three_d_secure_token => nil
2284
+ )
2285
+ result.success?.should == false
2286
+ result.errors.for(:transaction).on(:three_d_secure_token)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTokenIsInvalid
2287
+ end
2288
+
2289
+ it "returns an error if 3ds lookup data does not match txn data" do
2290
+ three_d_secure_token = SpecHelper.create_3ds_verification(
2291
+ SpecHelper::ThreeDSecureMerchantAccountId,
2292
+ :number => Braintree::Test::CreditCardNumbers::Visa,
2293
+ :expiration_month => "12",
2294
+ :expiration_year => "2012"
2295
+ )
2296
+
2297
+ result = Braintree::Transaction.create(
2298
+ :merchant_account_id => SpecHelper::ThreeDSecureMerchantAccountId,
2299
+ :type => "sale",
2300
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
2301
+ :credit_card => {
2302
+ :number => Braintree::Test::CreditCardNumbers::MasterCard,
2303
+ :expiration_date => "12/12",
2304
+ },
2305
+ :three_d_secure_token => three_d_secure_token
2306
+ )
2307
+ result.success?.should == false
2308
+ result.errors.for(:transaction).on(:three_d_secure_token)[0].code.should == Braintree::ErrorCodes::Transaction::ThreeDSecureTransactionDataDoesntMatchVerify
2309
+ end
2172
2310
  end
2173
2311
 
2174
2312
  it "can create a transaction with a three_d_secure_pass_thru" do
@@ -2632,6 +2770,36 @@ describe Braintree::Transaction do
2632
2770
  result.success?.should == false
2633
2771
  result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::CannotRefundUnlessSettled
2634
2772
  end
2773
+
2774
+ it "handles soft declined refund authorizations" do
2775
+ transaction = Braintree::Transaction.sale!(
2776
+ :amount => "9000.00",
2777
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2778
+ :options => {
2779
+ :submit_for_settlement => true
2780
+ }
2781
+ )
2782
+ config = Braintree::Configuration.instantiate
2783
+ response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
2784
+ result = Braintree::Transaction.refund(transaction.id, :amount => "2046.00")
2785
+ result.success?.should == false
2786
+ result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::RefundAuthSoftDeclined
2787
+ end
2788
+
2789
+ it "handles hard declined refund authorizations" do
2790
+ transaction = Braintree::Transaction.sale!(
2791
+ :amount => "9000.00",
2792
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2793
+ :options => {
2794
+ :submit_for_settlement => true
2795
+ }
2796
+ )
2797
+ config = Braintree::Configuration.instantiate
2798
+ response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
2799
+ result = Braintree::Transaction.refund(transaction.id, :amount => "2009.00")
2800
+ result.success?.should == false
2801
+ result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::RefundAuthHardDeclined
2802
+ end
2635
2803
  end
2636
2804
 
2637
2805
  context "handling errors" do
@@ -5088,6 +5256,71 @@ describe Braintree::Transaction do
5088
5256
  result.errors.for(:transaction).on(:amount)[0].code.should == Braintree::ErrorCodes::Transaction::SettlementAmountIsLessThanServiceFeeAmount
5089
5257
  end
5090
5258
  end
5259
+
5260
+ it "succeeds when level 2 data is provided" do
5261
+ result = Braintree::Transaction.sale(
5262
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5263
+ :merchant_account_id => SpecHelper::FakeAmexDirectMerchantAccountId,
5264
+ :credit_card => {
5265
+ :number => Braintree::Test::CreditCardNumbers::AmexPayWithPoints::Success,
5266
+ :expiration_date => "05/2009"
5267
+ },
5268
+ :options => {
5269
+ :amex_rewards => {
5270
+ :request_id => "ABC123",
5271
+ :points => "1000",
5272
+ :currency_amount => "10.00",
5273
+ :currency_iso_code => "USD"
5274
+ }
5275
+ }
5276
+ )
5277
+ result.success?.should == true
5278
+
5279
+ result = Braintree::Transaction.submit_for_settlement(result.transaction.id, nil, :tax_amount => "2.00", :tax_exempt => false, :purchase_order_number => "0Rd3r#")
5280
+ result.success?.should == true
5281
+ result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
5282
+ end
5283
+
5284
+ it "succeeds when level 3 data is provided" do
5285
+ result = Braintree::Transaction.sale(
5286
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5287
+ :merchant_account_id => SpecHelper::FakeAmexDirectMerchantAccountId,
5288
+ :credit_card => {
5289
+ :number => Braintree::Test::CreditCardNumbers::AmexPayWithPoints::Success,
5290
+ :expiration_date => "05/2009"
5291
+ },
5292
+ :options => {
5293
+ :amex_rewards => {
5294
+ :request_id => "ABC123",
5295
+ :points => "1000",
5296
+ :currency_amount => "10.00",
5297
+ :currency_iso_code => "USD"
5298
+ }
5299
+ }
5300
+ )
5301
+ result.success?.should == true
5302
+
5303
+ result = Braintree::Transaction.submit_for_settlement(
5304
+ result.transaction.id,
5305
+ nil,
5306
+ :discount_amount => "2.00",
5307
+ :shipping_amount => "1.23",
5308
+ :ships_from_postal_code => "90210",
5309
+ :line_items => [
5310
+ {
5311
+ :quantity => 1,
5312
+ :unit_amount => 1,
5313
+ :name => "New line item",
5314
+ :kind => "debit",
5315
+ :total_amount => "18.00",
5316
+ :discount_amount => "12.00",
5317
+ :tax_amount => "0",
5318
+ },
5319
+ ]
5320
+ )
5321
+ result.success?.should == true
5322
+ result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
5323
+ end
5091
5324
  end
5092
5325
 
5093
5326
  describe "self.submit_for_settlement!" do
@@ -5884,6 +6117,7 @@ describe Braintree::Transaction do
5884
6117
  created_transaction = result.transaction
5885
6118
  found_transaction = Braintree::Transaction.find(created_transaction.id)
5886
6119
  found_transaction.should == created_transaction
6120
+ found_transaction.graphql_id.should_not be_nil
5887
6121
  end
5888
6122
 
5889
6123
  it "finds the vaulted transaction with the given id" do
@@ -110,7 +110,7 @@ unless defined?(SPEC_HELPER_LOADED)
110
110
  def self.create_3ds_verification(merchant_account_id, params)
111
111
  config = Braintree::Configuration.instantiate
112
112
  response = config.http.post("#{config.base_merchant_path}/three_d_secure/create_verification/#{merchant_account_id}", :three_d_secure_verification => params)
113
- response[:three_d_secure_verification][:three_d_secure_token]
113
+ response[:three_d_secure_verification][:three_d_secure_authentication_id]
114
114
  end
115
115
 
116
116
  def self.create_merchant(params={})
@@ -12,6 +12,7 @@ describe Braintree::ThreeDSecureInfo do
12
12
  :eci_flag => "06",
13
13
  :three_d_secure_version => "1.0.2",
14
14
  :ds_transaction_id => "dstrxid",
15
+ :three_d_secure_authentication_id => "auth_id",
15
16
  )
16
17
  }
17
18
 
@@ -26,12 +27,13 @@ describe Braintree::ThreeDSecureInfo do
26
27
  three_d_secure_info.eci_flag.should == "06"
27
28
  three_d_secure_info.three_d_secure_version.should == "1.0.2"
28
29
  three_d_secure_info.ds_transaction_id.should == "dstrxid"
30
+ three_d_secure_info.three_d_secure_authentication_id.should == "auth_id"
29
31
  end
30
32
  end
31
33
 
32
34
  describe "inspect" do
33
35
  it "prints the attributes" do
34
- three_d_secure_info.inspect.should == %(#<ThreeDSecureInfo enrolled: "Y", liability_shifted: true, liability_shift_possible: true, status: "authenticate_successful", cavv: "cavvvalue", xid: "xidvalue", eci_flag: "06", three_d_secure_version: "1.0.2", ds_transaction_id: "dstrxid">)
36
+ three_d_secure_info.inspect.should == %(#<ThreeDSecureInfo enrolled: "Y", liability_shifted: true, liability_shift_possible: true, status: "authenticate_successful", cavv: "cavvvalue", xid: "xidvalue", eci_flag: "06", three_d_secure_version: "1.0.2", ds_transaction_id: "dstrxid", three_d_secure_authentication_id: "auth_id">)
35
37
  end
36
38
  end
37
39
 
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: 2.100.0
4
+ version: 2.101.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-28 00:00:00.000000000 Z
11
+ date: 2020-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -320,7 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
320
  - !ruby/object:Gem::Version
321
321
  version: '0'
322
322
  requirements: []
323
- rubygems_version: 3.0.6
323
+ rubygems_version: 3.1.2
324
324
  signing_key:
325
325
  specification_version: 4
326
326
  summary: Braintree Gateway Ruby Client Library