braintree 2.100.0 → 2.101.0

Sign up to get free protection for your applications and to get access to all the features.
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