braintree 4.17.0 → 4.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/braintree/advanced_search.rb +1 -2
  3. data/lib/braintree/configuration.rb +1 -1
  4. data/lib/braintree/disbursement.rb +1 -1
  5. data/lib/braintree/dispute.rb +1 -0
  6. data/lib/braintree/error_codes.rb +4 -0
  7. data/lib/braintree/http.rb +2 -4
  8. data/lib/braintree/transaction/package_details.rb +16 -0
  9. data/lib/braintree/transaction.rb +10 -0
  10. data/lib/braintree/transaction_gateway.rb +21 -3
  11. data/lib/braintree/transaction_line_item.rb +11 -8
  12. data/lib/braintree/util.rb +1 -1
  13. data/lib/braintree/version.rb +1 -1
  14. data/lib/braintree/webhook_notification.rb +4 -3
  15. data/lib/braintree/webhook_testing_gateway.rb +78 -6
  16. data/lib/braintree/xml/parser.rb +2 -2
  17. data/lib/braintree.rb +1 -0
  18. data/spec/integration/braintree/address_spec.rb +3 -3
  19. data/spec/integration/braintree/advanced_search_spec.rb +3 -3
  20. data/spec/integration/braintree/client_api/client_token_spec.rb +0 -2
  21. data/spec/integration/braintree/client_api/spec_helper.rb +1 -1
  22. data/spec/integration/braintree/credit_card_spec.rb +11 -15
  23. data/spec/integration/braintree/credit_card_verification_spec.rb +2 -2
  24. data/spec/integration/braintree/customer_spec.rb +12 -12
  25. data/spec/integration/braintree/dispute_search_spec.rb +0 -1
  26. data/spec/integration/braintree/dispute_spec.rb +1 -1
  27. data/spec/integration/braintree/document_upload_spec.rb +1 -1
  28. data/spec/integration/braintree/http_spec.rb +0 -2
  29. data/spec/integration/braintree/oauth_spec.rb +1 -1
  30. data/spec/integration/braintree/package_tracking_spec.rb +111 -0
  31. data/spec/integration/braintree/payment_method_nonce_spec.rb +2 -2
  32. data/spec/integration/braintree/payment_method_spec.rb +12 -14
  33. data/spec/integration/braintree/payment_method_us_bank_account_spec.rb +3 -3
  34. data/spec/integration/braintree/paypal_account_spec.rb +6 -6
  35. data/spec/integration/braintree/plan_spec.rb +0 -1
  36. data/spec/integration/braintree/sepa_direct_debit_account_spec.rb +0 -2
  37. data/spec/integration/braintree/subscription_spec.rb +5 -6
  38. data/spec/integration/braintree/transaction_line_item_spec.rb +6 -0
  39. data/spec/integration/braintree/transaction_search_spec.rb +3 -7
  40. data/spec/integration/braintree/transaction_spec.rb +117 -49
  41. data/spec/unit/braintree/client_token_spec.rb +1 -1
  42. data/spec/unit/braintree/digest_spec.rb +0 -1
  43. data/spec/unit/braintree/error_result_spec.rb +1 -1
  44. data/spec/unit/braintree/package_tracking_spec.rb +74 -0
  45. data/spec/unit/braintree/paypal_account_spec.rb +1 -1
  46. data/spec/unit/braintree/transaction_gateway_spec.rb +3 -3
  47. data/spec/unit/braintree/transaction_spec.rb +2 -2
  48. data/spec/unit/braintree/webhook_notification_spec.rb +16 -0
  49. metadata +5 -2
@@ -2098,7 +2098,6 @@ describe Braintree::Transaction do
2098
2098
  end
2099
2099
 
2100
2100
  it "can create a transaction with a params nonce with PayPal account params" do
2101
- customer = Braintree::Customer.create!
2102
2101
  nonce = nonce_for_new_payment_method(
2103
2102
  :paypal_account => {
2104
2103
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2132,8 +2131,9 @@ describe Braintree::Transaction do
2132
2131
  meta_checkout_card_details.cardholder_name.should == "Meta Checkout Card Cardholder"
2133
2132
  meta_checkout_card_details.container_id.should == "container123"
2134
2133
  meta_checkout_card_details.customer_location.should == "US"
2135
- meta_checkout_card_details.expiration_date.should == "12/2024"
2136
- meta_checkout_card_details.expiration_year.should == "2024"
2134
+ next_year = Date.today().next_year().year.to_s
2135
+ meta_checkout_card_details.expiration_date.should == "12/".concat(next_year)
2136
+ meta_checkout_card_details.expiration_year.should == next_year
2137
2137
  meta_checkout_card_details.expiration_month.should == "12"
2138
2138
  meta_checkout_card_details.image_url.should == "https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=development"
2139
2139
  meta_checkout_card_details.is_network_tokenized.should == false
@@ -2161,8 +2161,9 @@ describe Braintree::Transaction do
2161
2161
  meta_checkout_token_details.cryptogram.should == "AlhlvxmN2ZKuAAESNFZ4GoABFA=="
2162
2162
  meta_checkout_token_details.customer_location.should == "US"
2163
2163
  meta_checkout_token_details.ecommerce_indicator.should == "07"
2164
- meta_checkout_token_details.expiration_date.should == "12/2024"
2165
- meta_checkout_token_details.expiration_year.should == "2024"
2164
+ next_year = Date.today().next_year().year.to_s
2165
+ meta_checkout_token_details.expiration_date.should == "12/".concat(next_year)
2166
+ meta_checkout_token_details.expiration_year.should == next_year
2166
2167
  meta_checkout_token_details.expiration_month.should == "12"
2167
2168
  meta_checkout_token_details.image_url.should == "https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=development"
2168
2169
  meta_checkout_token_details.is_network_tokenized.should == true
@@ -2172,7 +2173,6 @@ describe Braintree::Transaction do
2172
2173
  end
2173
2174
 
2174
2175
  it "can create a transaction with a fake apple pay nonce" do
2175
- customer = Braintree::Customer.create!
2176
2176
  result = Braintree::Transaction.create(
2177
2177
  :type => "sale",
2178
2178
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2201,7 +2201,6 @@ describe Braintree::Transaction do
2201
2201
  end
2202
2202
 
2203
2203
  it "can create a vaulted transaction with a fake apple pay nonce" do
2204
- customer = Braintree::Customer.create!
2205
2204
  result = Braintree::Transaction.create(
2206
2205
  :type => "sale",
2207
2206
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2223,7 +2222,6 @@ describe Braintree::Transaction do
2223
2222
  end
2224
2223
 
2225
2224
  it "can create a transaction with a fake google pay proxy card nonce" do
2226
- customer = Braintree::Customer.create!
2227
2225
  result = Braintree::Transaction.create(
2228
2226
  :type => "sale",
2229
2227
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2255,7 +2253,6 @@ describe Braintree::Transaction do
2255
2253
  end
2256
2254
 
2257
2255
  it "can create a vaulted transaction with a fake google pay proxy card nonce" do
2258
- customer = Braintree::Customer.create!
2259
2256
  result = Braintree::Transaction.create(
2260
2257
  :type => "sale",
2261
2258
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2280,7 +2277,6 @@ describe Braintree::Transaction do
2280
2277
  end
2281
2278
 
2282
2279
  it "can create a transaction with a fake google pay network token nonce" do
2283
- customer = Braintree::Customer.create!
2284
2280
  result = Braintree::Transaction.create(
2285
2281
  :type => "sale",
2286
2282
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2333,7 +2329,6 @@ describe Braintree::Transaction do
2333
2329
  end
2334
2330
 
2335
2331
  it "can create a transaction with an unknown nonce" do
2336
- customer = Braintree::Customer.create!
2337
2332
  result = Braintree::Transaction.create(
2338
2333
  :type => "sale",
2339
2334
  :amount => Braintree::Test::TransactionAmounts::Authorize,
@@ -2362,7 +2357,6 @@ describe Braintree::Transaction do
2362
2357
  end
2363
2358
 
2364
2359
  it "can create a transaction with a payee id" do
2365
- customer = Braintree::Customer.create!
2366
2360
  nonce = nonce_for_new_payment_method(
2367
2361
  :paypal_account => {
2368
2362
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2386,7 +2380,6 @@ describe Braintree::Transaction do
2386
2380
  end
2387
2381
 
2388
2382
  it "can create a transaction with a payee id in the options params" do
2389
- customer = Braintree::Customer.create!
2390
2383
  nonce = nonce_for_new_payment_method(
2391
2384
  :paypal_account => {
2392
2385
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2411,7 +2404,6 @@ describe Braintree::Transaction do
2411
2404
  end
2412
2405
 
2413
2406
  it "can create a transaction with a payee id in options.paypal" do
2414
- customer = Braintree::Customer.create!
2415
2407
  nonce = nonce_for_new_payment_method(
2416
2408
  :paypal_account => {
2417
2409
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2437,7 +2429,6 @@ describe Braintree::Transaction do
2437
2429
  end
2438
2430
 
2439
2431
  it "can create a transaction with a payee email" do
2440
- customer = Braintree::Customer.create!
2441
2432
  nonce = nonce_for_new_payment_method(
2442
2433
  :paypal_account => {
2443
2434
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2461,7 +2452,6 @@ describe Braintree::Transaction do
2461
2452
  end
2462
2453
 
2463
2454
  it "can create a transaction with a payee email in the options params" do
2464
- customer = Braintree::Customer.create!
2465
2455
  nonce = nonce_for_new_payment_method(
2466
2456
  :paypal_account => {
2467
2457
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2486,7 +2476,6 @@ describe Braintree::Transaction do
2486
2476
  end
2487
2477
 
2488
2478
  it "can create a transaction with a payee email in options.paypal" do
2489
- customer = Braintree::Customer.create!
2490
2479
  nonce = nonce_for_new_payment_method(
2491
2480
  :paypal_account => {
2492
2481
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2512,7 +2501,6 @@ describe Braintree::Transaction do
2512
2501
  end
2513
2502
 
2514
2503
  it "can create a transaction with a paypal custom field" do
2515
- customer = Braintree::Customer.create!
2516
2504
  nonce = nonce_for_new_payment_method(
2517
2505
  :paypal_account => {
2518
2506
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2538,7 +2526,6 @@ describe Braintree::Transaction do
2538
2526
  end
2539
2527
 
2540
2528
  it "can create a transaction with a paypal description" do
2541
- customer = Braintree::Customer.create!
2542
2529
  nonce = nonce_for_new_payment_method(
2543
2530
  :paypal_account => {
2544
2531
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2564,7 +2551,6 @@ describe Braintree::Transaction do
2564
2551
  end
2565
2552
 
2566
2553
  it "can create a transaction with STC supplementary data" do
2567
- customer = Braintree::Customer.create!
2568
2554
  nonce = nonce_for_new_payment_method(
2569
2555
  :paypal_account => {
2570
2556
  :consent_code => "PAYPAL_CONSENT_CODE",
@@ -2748,7 +2734,7 @@ describe Braintree::Transaction do
2748
2734
  },
2749
2735
  :three_d_secure_authentication_id => three_d_secure_authentication_id,
2750
2736
  :three_d_secure_pass_thru => {
2751
- :eci_flag => "02",
2737
+ :eci_flag => "05",
2752
2738
  :cavv => "some_cavv",
2753
2739
  :xid => "some_xid",
2754
2740
  :three_d_secure_version => "1.0.2",
@@ -2835,7 +2821,7 @@ describe Braintree::Transaction do
2835
2821
  :expiration_date => "12/12",
2836
2822
  },
2837
2823
  :three_d_secure_pass_thru => {
2838
- :eci_flag => "02",
2824
+ :eci_flag => "05",
2839
2825
  :cavv => "some_cavv",
2840
2826
  :xid => "some_xid",
2841
2827
  :three_d_secure_version => "1.0.2",
@@ -2860,7 +2846,7 @@ describe Braintree::Transaction do
2860
2846
  :expiration_date => "12/12",
2861
2847
  },
2862
2848
  :three_d_secure_pass_thru => {
2863
- :eci_flag => "02",
2849
+ :eci_flag => "05",
2864
2850
  :cavv => "some_cavv",
2865
2851
  :xid => "some_xid",
2866
2852
  :three_d_secure_version => "1.0.2",
@@ -2947,7 +2933,7 @@ describe Braintree::Transaction do
2947
2933
  :expiration_date => "12/12",
2948
2934
  },
2949
2935
  :three_d_secure_pass_thru => {
2950
- :eci_flag => "02",
2936
+ :eci_flag => "05",
2951
2937
  :cavv => "some_cavv",
2952
2938
  :xid => "some_xid",
2953
2939
  :three_d_secure_version => "invalid",
@@ -2971,7 +2957,7 @@ describe Braintree::Transaction do
2971
2957
  :expiration_date => "12/12",
2972
2958
  },
2973
2959
  :three_d_secure_pass_thru => {
2974
- :eci_flag => "02",
2960
+ :eci_flag => "05",
2975
2961
  :cavv => "some_cavv",
2976
2962
  :xid => "some_xid",
2977
2963
  :three_d_secure_version => "1.0.2",
@@ -2995,7 +2981,7 @@ describe Braintree::Transaction do
2995
2981
  :expiration_date => "12/12",
2996
2982
  },
2997
2983
  :three_d_secure_pass_thru => {
2998
- :eci_flag => "02",
2984
+ :eci_flag => "05",
2999
2985
  :cavv => "some_cavv",
3000
2986
  :xid => "some_xid",
3001
2987
  :three_d_secure_version => "1.0.2",
@@ -3019,7 +3005,7 @@ describe Braintree::Transaction do
3019
3005
  :expiration_date => "12/12",
3020
3006
  },
3021
3007
  :three_d_secure_pass_thru => {
3022
- :eci_flag => "02",
3008
+ :eci_flag => "05",
3023
3009
  :cavv => "some_cavv",
3024
3010
  :xid => "some_xid",
3025
3011
  :three_d_secure_version => "1.0.2",
@@ -3298,7 +3284,7 @@ describe Braintree::Transaction do
3298
3284
  )
3299
3285
 
3300
3286
  config = Braintree::Configuration.instantiate
3301
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3287
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3302
3288
  transaction = Braintree::Transaction.find(transaction.id)
3303
3289
 
3304
3290
  result = Braintree::Transaction.refund(
@@ -3388,7 +3374,7 @@ describe Braintree::Transaction do
3388
3374
  },
3389
3375
  )
3390
3376
  config = Braintree::Configuration.instantiate
3391
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3377
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3392
3378
  result = Braintree::Transaction.refund(transaction.id, :amount => "2046.00")
3393
3379
  expect(result.success?).to eq(false)
3394
3380
  expect(result.transaction.id).to match(/^\w{6,}$/)
@@ -3409,7 +3395,7 @@ describe Braintree::Transaction do
3409
3395
  },
3410
3396
  )
3411
3397
  config = Braintree::Configuration.instantiate
3412
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3398
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
3413
3399
  result = Braintree::Transaction.refund(transaction.id, :amount => "2009.00")
3414
3400
  expect(result.success?).to eq(false)
3415
3401
  expect(result.transaction.id).to match(/^\w{6,}$/)
@@ -4605,6 +4591,84 @@ describe Braintree::Transaction do
4605
4591
  expect(result.success?).to eq(false)
4606
4592
  expect(result.errors.for(:transaction).on(:line_items)[0].code).to eq(Braintree::ErrorCodes::Transaction::TooManyLineItems)
4607
4593
  end
4594
+
4595
+ context "UPC code and type" do
4596
+ let(:line_item) do
4597
+ {
4598
+ :quantity => "1",
4599
+ :name => "Name #1",
4600
+ :description => "Description #1",
4601
+ :kind => "debit",
4602
+ :unit_amount => "45.12",
4603
+ :unit_tax_amount => "1.23",
4604
+ :unit_of_measure => "gallon",
4605
+ :discount_amount => "1.02",
4606
+ :tax_amount => "4.50",
4607
+ :total_amount => "45.15",
4608
+ :product_code => "23434",
4609
+ :commodity_code => "9SAASSD8724",
4610
+ :url => "https://example.com/products/23434",
4611
+ :upc_code => "042100005264",
4612
+ :upc_type => "UPC-A",
4613
+ :image_url => "https://google.com/image.png",
4614
+ }
4615
+ end
4616
+
4617
+ it "accepts valid values" do
4618
+ result = Braintree::Transaction.create(
4619
+ :type => "sale",
4620
+ :amount => "45.15",
4621
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4622
+ :line_items => [line_item],
4623
+ )
4624
+ expect(result.success?).to eq(true)
4625
+ expect(result.transaction.line_items.length).to eq(1)
4626
+ line_item = result.transaction.line_items[0]
4627
+ expect(line_item.upc_code).to eq("042100005264")
4628
+ expect(line_item.upc_type).to eq("UPC-A")
4629
+ end
4630
+
4631
+ it "returns validation errors for invalid UPC code and type too long" do
4632
+ line_item[:upc_code] = "THISCODELONGERTHAN17CHARS"
4633
+ line_item[:upc_type] = "USB-C"
4634
+ result = Braintree::Transaction.create(
4635
+ :type => "sale",
4636
+ :amount => "45.15",
4637
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4638
+ :line_items => [line_item],
4639
+ )
4640
+
4641
+ expect(result.success?).to eq(false)
4642
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_code)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCCodeIsTooLong)
4643
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_type)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCTypeIsInvalid)
4644
+ end
4645
+
4646
+ it "returns UPC code missing error when code is not present" do
4647
+ line_item.delete(:upc_code)
4648
+ result = Braintree::Transaction.create(
4649
+ :type => "sale",
4650
+ :amount => "45.15",
4651
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4652
+ :line_items => [line_item],
4653
+ )
4654
+
4655
+ expect(result.success?).to eq(false)
4656
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_code)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCCodeIsMissing)
4657
+ end
4658
+
4659
+ it "returns UPC type missing error when type is not present" do
4660
+ line_item.delete(:upc_type)
4661
+ result = Braintree::Transaction.create(
4662
+ :type => "sale",
4663
+ :amount => "45.15",
4664
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4665
+ :line_items => [line_item],
4666
+ )
4667
+
4668
+ expect(result.success?).to eq(false)
4669
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_type)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCTypeIsMissing)
4670
+ end
4671
+ end
4608
4672
  end
4609
4673
 
4610
4674
  context "level 3 summary data" do
@@ -5820,7 +5884,7 @@ describe Braintree::Transaction do
5820
5884
  end
5821
5885
 
5822
5886
  context "Pinless debit transaction" do
5823
- xit "succesfully submits for settlement" do
5887
+ it "succesfully submits for settlement" do
5824
5888
  result = Braintree::Transaction.sale(
5825
5889
  :amount => Braintree::Test::TransactionAmounts::Authorize,
5826
5890
  :merchant_account_id => SpecHelper::PinlessDebitMerchantAccountId,
@@ -5831,10 +5895,28 @@ describe Braintree::Transaction do
5831
5895
  },
5832
5896
  )
5833
5897
  expect(result.success?).to be_truthy
5834
- expect(result.transaction.status).to eq(Braintree::Transaction::Status::SubmittedForSettlement)
5835
5898
  expect(result.transaction.debit_network).not_to be_nil
5836
5899
  end
5837
5900
  end
5901
+
5902
+ context "Process debit as credit" do
5903
+ it "succesfully completed pinless eligible transaction in signature" do
5904
+ result = Braintree::Transaction.sale(
5905
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5906
+ :merchant_account_id => SpecHelper::PinlessDebitMerchantAccountId,
5907
+ :currency_iso_code => "USD",
5908
+ :payment_method_nonce => Braintree::Test::Nonce::TransactablePinlessDebitVisa,
5909
+ :options => {
5910
+ :submit_for_settlement => true,
5911
+ :credit_card => {
5912
+ :process_debit_as_credit => true
5913
+ }
5914
+ },
5915
+ )
5916
+ expect(result.success?).to be_truthy
5917
+ expect(result.transaction.debit_network).to be_nil
5918
+ end
5919
+ end
5838
5920
  end
5839
5921
 
5840
5922
  describe "self.sale!" do
@@ -7158,7 +7240,7 @@ describe Braintree::Transaction do
7158
7240
  )
7159
7241
 
7160
7242
  config = Braintree::Configuration.instantiate
7161
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
7243
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
7162
7244
  Braintree::Transaction.find(transaction.id)
7163
7245
  end
7164
7246
 
@@ -7189,8 +7271,8 @@ describe Braintree::Transaction do
7189
7271
  )
7190
7272
 
7191
7273
  config = Braintree::Configuration.instantiate
7192
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
7193
- response = config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/escrow")
7274
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/settle")
7275
+ config.http.put("#{config.base_merchant_path}/transactions/#{transaction.id}/escrow")
7194
7276
  Braintree::Transaction.find(transaction.id)
7195
7277
  end
7196
7278
 
@@ -7739,20 +7821,6 @@ describe Braintree::Transaction do
7739
7821
  expect(adjustment_transaction.errors.for(:authorization_adjustment).on(:base).first.code).to eq(Braintree::ErrorCodes::Transaction::NoNetAmountToPerformAuthAdjustment)
7740
7822
  end
7741
7823
 
7742
- it "returns failure, when transaction status is not authorized" do
7743
- additional_params = {:options => {:submit_for_settlement => true}}
7744
- initial_transaction = Braintree::Transaction.sale(first_data_master_transaction_params.merge(additional_params))
7745
- expect(initial_transaction.success?).to eq(true)
7746
-
7747
- adjustment_transaction = Braintree::Transaction.adjust_authorization(
7748
- initial_transaction.transaction.id, "85.50"
7749
- )
7750
-
7751
- expect(adjustment_transaction.success?).to eq(false)
7752
- expect(adjustment_transaction.transaction.amount).to eq(BigDecimal("75.50"))
7753
- expect(adjustment_transaction.errors.for(:transaction).on(:base).first.code).to eq(Braintree::ErrorCodes::Transaction::TransactionMustBeInStateAuthorized)
7754
- end
7755
-
7756
7824
  it "returns failure, when transaction authorization type final or undefined" do
7757
7825
  additional_params = {:transaction_source => "recurring"}
7758
7826
  initial_transaction = Braintree::Transaction.sale(first_data_master_transaction_params.merge(additional_params))
@@ -14,7 +14,7 @@ module Braintree
14
14
 
15
15
  it "can't overwrite public_key, or created_at" do
16
16
  expect {
17
- client_token = Braintree::ClientToken.generate(
17
+ Braintree::ClientToken.generate(
18
18
  :public_key => "bad_key",
19
19
  :created_at => "bad_time",
20
20
  )
@@ -3,7 +3,6 @@ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
3
3
  describe Braintree::Digest do
4
4
  describe "self.hexdigest" do
5
5
  it "returns the sha1 hmac of the input string (test case 6 from RFC 2202)" do
6
- original_key = Braintree::Configuration.private_key
7
6
  private_key = "\xaa" * 80
8
7
  data = "Test Using Larger Than Block-Size Key - Hash Key First"
9
8
  expect(Braintree::Digest.hexdigest(private_key, data)).to eq("aa4ae5e15272d00e95705637ce8a3b55ed402112")
@@ -5,7 +5,7 @@ describe Braintree::ErrorResult do
5
5
  it "ignores data other than params, errors, and message" do
6
6
  # so that we can add more data into the response in the future without breaking the client lib
7
7
  expect do
8
- result = Braintree::ErrorResult.new(
8
+ Braintree::ErrorResult.new(
9
9
  :gateway,
10
10
  :params => "params",
11
11
  :errors => {:errors => []},
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "Package Tracking Unit Tests" do
4
+ describe "creates and validates requests" do
5
+ let(:gateway) do
6
+ config = Braintree::Configuration.new(
7
+ :merchant_id => "merchant_id",
8
+ :public_key => "public_key",
9
+ :private_key => "private_key",
10
+ )
11
+ Braintree::Gateway.new(config)
12
+ end
13
+
14
+ it "creates transaction gateway package tracking request signature" do
15
+ expect(Braintree::TransactionGateway._package_tracking_request_signature).to match(
16
+ [
17
+ :carrier,
18
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
19
+ :notify_payer, :tracking_number,
20
+ ],
21
+ )
22
+ end
23
+
24
+ it "raises an ArgumentError if transaction_id is an invalid format" do
25
+ expect do
26
+ Braintree::Transaction.package_tracking("invalid-transaction-id", {})
27
+ end.to raise_error(ArgumentError, "transaction_id is invalid")
28
+ end
29
+
30
+ it "raises an exception if attributes contain an invalid key" do
31
+ expect do
32
+ Braintree::Transaction.package_tracking("txn123", {:invalid_key => "random", :carrier => "UPS", :tracking_number => "123123"})
33
+ end.to raise_error(ArgumentError, "invalid keys: invalid_key")
34
+ end
35
+ end
36
+
37
+ describe "handles response" do
38
+ it "parses the packages response correctly" do
39
+ transaction = Braintree::Transaction._new(
40
+ :gateway,
41
+ :shipments => [
42
+ {:id => "id1", :carrier => "UPS", :tracking_number => "tracking_number_1", :paypal_tracking_id => "pp_tracking_number_1"},
43
+ {:id => "id2", :carrier => "FEDEX", :tracking_number => "tracking_number_2", :paypal_tracking_id => "pp_tracking_number_2"}
44
+ ],
45
+ )
46
+ expect(transaction.packages.size).to eq(2)
47
+ expect(transaction.packages[0].id).to eq("id1")
48
+ expect(transaction.packages[0].carrier).to eq("UPS")
49
+ expect(transaction.packages[0].tracking_number).to eq("tracking_number_1")
50
+ expect(transaction.packages[0].paypal_tracking_id).to eq("pp_tracking_number_1")
51
+
52
+ expect(transaction.packages[1].id).to eq("id2")
53
+ expect(transaction.packages[1].carrier).to eq("FEDEX")
54
+ expect(transaction.packages[1].tracking_number).to eq("tracking_number_2")
55
+ expect(transaction.packages[1].paypal_tracking_id).to eq("pp_tracking_number_2")
56
+ end
57
+
58
+ it "doesn't blow up if no shipments are present in the transaction response" do
59
+ transaction = Braintree::Transaction._new(
60
+ :gateway,
61
+ :shipments => [],
62
+ )
63
+ expect(transaction.packages.size).to eq(0)
64
+ end
65
+
66
+ it "doesn't blow up if shipments tag is not present in the transaction response" do
67
+ transaction = Braintree::Transaction._new(
68
+ :gateway,
69
+ {},
70
+ )
71
+ expect(transaction.packages.size).to eq(0)
72
+ end
73
+ end
74
+ end
@@ -4,7 +4,7 @@ describe Braintree::PayPalAccount do
4
4
  describe "self.create" do
5
5
  it "raises an exception if attributes contain an invalid key" do
6
6
  expect do
7
- result = Braintree::PayPalAccount.create(
7
+ Braintree::PayPalAccount.create(
8
8
  :invalid_key => "bad stuff",
9
9
  :options => {
10
10
  :invalid_option => "bad option",
@@ -41,7 +41,7 @@ describe Braintree::TransactionGateway do
41
41
  :ships_from_postal_code, :tax_amount, :tax_exempt, :three_d_secure_authentication_id,:three_d_secure_token, #Deprecated
42
42
  :transaction_source, :type, :venmo_sdk_payment_method_code, #Deprecated
43
43
  :sca_exemption, :currency_iso_code, :exchange_rate_quote_id,
44
- {: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]},
44
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
45
45
  {:risk_data => [:customer_browser, :customer_device_id, :customer_ip, :customer_location_zip, :customer_tenure]},
46
46
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}, {:network_tokenization_attributes => [:cryptogram, :ecommerce_indicator, :token_requestor_id]}]},
47
47
  {:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
@@ -81,7 +81,7 @@ describe Braintree::TransactionGateway do
81
81
  {:three_d_secure => [:required]},
82
82
  {:amex_rewards => [:request_id, :points, :currency_amount, :currency_iso_code]},
83
83
  {:venmo => [:profile_id]},
84
- {:credit_card => [:account_type]},
84
+ {:credit_card => [:account_type, :process_debit_as_credit]},
85
85
  ]
86
86
  },
87
87
  {:external_vault => [
@@ -137,7 +137,7 @@ describe Braintree::TransactionGateway do
137
137
  :discount_amount,
138
138
  :shipping_amount,
139
139
  :ships_from_postal_code,
140
- :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],
140
+ :line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url],
141
141
  ])
142
142
  end
143
143
  end
@@ -200,8 +200,8 @@ describe Braintree::Transaction do
200
200
  },
201
201
  )
202
202
 
203
- expect(transaction.three_d_secure_info.enrolled).to eq("Y")
204
203
  expect(transaction.three_d_secure_info.status).to eq("authenticate_successful")
204
+ expect(transaction.three_d_secure_info.enrolled).to eq("Y")
205
205
  expect(transaction.three_d_secure_info.liability_shifted).to eq(true)
206
206
  expect(transaction.three_d_secure_info.liability_shift_possible).to eq(true)
207
207
  end
@@ -258,7 +258,7 @@ describe Braintree::Transaction do
258
258
  end
259
259
 
260
260
  it "handles receiving custom as an empty string" do
261
- transaction = Braintree::Transaction._new(
261
+ Braintree::Transaction._new(
262
262
  :gateway,
263
263
  :custom => "\n ",
264
264
  )
@@ -168,6 +168,22 @@ describe Braintree::WebhookNotification do
168
168
  expect(dispute.kind).to eq(Braintree::Dispute::Kind::Chargeback)
169
169
  end
170
170
 
171
+ it "builds a sample notification for a dispute under_review webhook" do
172
+ sample_notification = Braintree::WebhookTesting.sample_notification(
173
+ Braintree::WebhookNotification::Kind::DisputeUnderReview,
174
+ dispute_id,
175
+ )
176
+
177
+ notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
178
+
179
+ expect(notification.kind).to eq(Braintree::WebhookNotification::Kind::DisputeUnderReview)
180
+
181
+ dispute = notification.dispute
182
+ expect(dispute.status).to eq(Braintree::Dispute::Status::UnderReview)
183
+ expect(dispute.id).to eq(dispute_id)
184
+ expect(dispute.kind).to eq(Braintree::Dispute::Kind::Chargeback)
185
+ end
186
+
171
187
  it "builds a sample notification for a dispute won webhook" do
172
188
  sample_notification = Braintree::WebhookTesting.sample_notification(
173
189
  Braintree::WebhookNotification::Kind::DisputeWon,
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: 4.17.0
4
+ version: 4.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-19 00:00:00.000000000 Z
11
+ date: 2024-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -181,6 +181,7 @@ files:
181
181
  - lib/braintree/transaction/local_payment_details.rb
182
182
  - lib/braintree/transaction/meta_checkout_card_details.rb
183
183
  - lib/braintree/transaction/meta_checkout_token_details.rb
184
+ - lib/braintree/transaction/package_details.rb
184
185
  - lib/braintree/transaction/payment_receipt.rb
185
186
  - lib/braintree/transaction/payment_receipt/card_present_data.rb
186
187
  - lib/braintree/transaction/payment_receipt/merchant_address.rb
@@ -250,6 +251,7 @@ files:
250
251
  - spec/integration/braintree/merchant_account_spec.rb
251
252
  - spec/integration/braintree/merchant_spec.rb
252
253
  - spec/integration/braintree/oauth_spec.rb
254
+ - spec/integration/braintree/package_tracking_spec.rb
253
255
  - spec/integration/braintree/payment_method_nonce_spec.rb
254
256
  - spec/integration/braintree/payment_method_spec.rb
255
257
  - spec/integration/braintree/payment_method_us_bank_account_spec.rb
@@ -311,6 +313,7 @@ files:
311
313
  - spec/unit/braintree/meta_checkout_token_details_spec.rb
312
314
  - spec/unit/braintree/meta_checkout_token_spec.rb
313
315
  - spec/unit/braintree/modification_spec.rb
316
+ - spec/unit/braintree/package_tracking_spec.rb
314
317
  - spec/unit/braintree/payment_method_customer_data_updated_metadata_spec.rb
315
318
  - spec/unit/braintree/payment_method_nonce_details_payer_info_spec.rb
316
319
  - spec/unit/braintree/payment_method_nonce_details_spec.rb