braintree 2.82.0 → 2.83.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
  SHA1:
3
- metadata.gz: de37c6678e279362737c8c278d58ebef4935302a
4
- data.tar.gz: 1ceaa6ef70f84c0d76bd200efb95b3221ada0521
3
+ metadata.gz: 37cea606be7947a8b853f64c671fdbf463b53a6f
4
+ data.tar.gz: 62c6fa628bcd6bef30444c9bd3949167ba89e994
5
5
  SHA512:
6
- metadata.gz: 33620a7bc3f8868a68af85b47761d51de73185d4586ee7a250c99cf503230327bfaafcc8edfe4c621c8df6dc6f4f0667831b5fd76fcacae3078e51111b4dc67e
7
- data.tar.gz: 68934f2a0e2f6a02cc1dc5a8768dd664f1e0f3522cb7e8ee6ed7855a65f012ac371a72e723b325ec8813dbd7c14041271f801a6acd8455b3c2b391de62b29f17
6
+ metadata.gz: f7112f55aed9b3218f0112ed9c5a07f82f523eba4ea6553c45495ef93860624b319a59b40b0e832d299b9ffea87bfefa9c69266fb271fb2c24987b07e79b2187
7
+ data.tar.gz: 3e8caab33783ba3d89b048b4208611e2506cf02837d8f35b52723ca34114cd7c76491315f2f14211ef06218ef041b5f68e5ff28fb48ba4fea34c302a538d6bec
data/braintree.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.license = "MIT"
10
10
  s.author = "Braintree"
11
11
  s.email = "code@getbraintree.com"
12
- s.homepage = "http://www.braintreepayments.com/"
12
+ s.homepage = "https://www.braintreepayments.com/"
13
13
  s.rubyforge_project = "braintree"
14
14
  s.has_rdoc = false
15
15
  s.files = Dir.glob ["README.rdoc", "LICENSE", "lib/**/*.{rb,crt}", "spec/**/*", "*.gemspec"]
@@ -425,7 +425,8 @@ module Braintree
425
425
  DescriptionIsTooLong = "95803"
426
426
  DiscountAmountFormatIsInvalid = "95804"
427
427
  DiscountAmountIsTooLarge = "95805"
428
- DiscountAmountMustBeGreaterThanZero = "95806"
428
+ DiscountAmountMustBeGreaterThanZero = "95806" # Deprecated as the amount may be zero. Use DiscountAmountCannotBeNegative.
429
+ DiscountAmountCannotBeNegative = "95806"
429
430
  KindIsInvalid = "95807"
430
431
  KindIsRequired = "95808"
431
432
  NameIsRequired = "95822"
@@ -445,7 +446,11 @@ module Braintree
445
446
  UnitOfMeasureIsTooLong = "95821"
446
447
  UnitTaxAmountFormatIsInvalid = "95824"
447
448
  UnitTaxAmountIsTooLarge = "95825"
448
- UnitTaxAmountMustBeGreaterThanZero = "95826"
449
+ UnitTaxAmountMustBeGreaterThanZero = "95826" # Deprecated as the amount may be zero. Use UnitTaxAmountCannotBeNegative.
450
+ UnitTaxAmountCannotBeNegative = "95826"
451
+ TaxAmountFormatIsInvalid = "95827"
452
+ TaxAmountIsTooLarge = "95828"
453
+ TaxAmountCannotBeNegative = "95829"
449
454
  end
450
455
 
451
456
  module Merchant
@@ -149,7 +149,7 @@ module Braintree
149
149
  :shipping_amount, :discount_amount, :ships_from_postal_code,
150
150
  :billing_address_id, :payment_method_nonce, :three_d_secure_token,
151
151
  :shared_payment_method_token, :shared_billing_address_id, :shared_customer_id, :shared_shipping_address_id, :shared_payment_method_nonce,
152
- {:line_items => [:quantity, :name, :description, :kind, :unit_amount, :unit_tax_amount, :total_amount, :discount_amount, :unit_of_measure, :product_code, :commodity_code, :url]},
152
+ {: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]},
153
153
  {:risk_data => [:customer_browser, :customer_ip]},
154
154
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
155
155
  {:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
@@ -9,6 +9,7 @@ module Braintree
9
9
  attr_reader :unit_tax_amount
10
10
  attr_reader :unit_of_measure
11
11
  attr_reader :discount_amount
12
+ attr_reader :tax_amount
12
13
  attr_reader :total_amount
13
14
  attr_reader :product_code
14
15
  attr_reader :commodity_code
@@ -21,6 +22,7 @@ module Braintree
21
22
  @unit_amount = Util.to_big_decimal(unit_amount)
22
23
  @unit_tax_amount = Util.to_big_decimal(unit_tax_amount)
23
24
  @discount_amount = Util.to_big_decimal(discount_amount)
25
+ @tax_amount = Util.to_big_decimal(tax_amount)
24
26
  @total_amount = Util.to_big_decimal(total_amount)
25
27
  end
26
28
 
@@ -30,5 +32,9 @@ module Braintree
30
32
  self.new *args
31
33
  end
32
34
  end
35
+
36
+ def self.find_all(*args)
37
+ Configuration.gateway.transaction_line_item.find_all(*args)
38
+ end
33
39
  end
34
40
  end
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 2
4
- Minor = 82
4
+ Minor = 83
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -51,6 +51,7 @@ module Braintree
51
51
  attr_reader :ideal_payment
52
52
  attr_reader :kind
53
53
  attr_reader :partner_merchant
54
+ attr_reader :source_merchant_id
54
55
  attr_reader :subscription
55
56
  attr_reader :timestamp
56
57
  attr_reader :transaction
@@ -7,6 +7,8 @@ module Braintree
7
7
  end
8
8
 
9
9
  def parse(signature_string, payload)
10
+ raise InvalidSignature, 'signature cannot be nil' if signature_string.nil?
11
+ raise InvalidSignature, 'payload cannot be nil' if payload.nil?
10
12
  if payload =~ /[^A-Za-z0-9+=\/\n]/
11
13
  raise InvalidSignature, "payload contains illegal characters"
12
14
  end
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  class WebhookTesting # :nodoc:
3
- def self.sample_notification(kind, id)
4
- Configuration.gateway.webhook_testing.sample_notification(kind, id)
3
+ def self.sample_notification(kind, id, source_merchant_id=nil)
4
+ Configuration.gateway.webhook_testing.sample_notification(kind, id, source_merchant_id)
5
5
  end
6
6
  end
7
7
  end
@@ -6,18 +6,23 @@ module Braintree
6
6
  @config.assert_has_access_token_or_keys
7
7
  end
8
8
 
9
- def sample_notification(kind, id)
10
- payload = Base64.encode64(_sample_xml(kind, id))
9
+ def sample_notification(kind, id, source_merchant_id=nil)
10
+ payload = Base64.encode64(_sample_xml(kind, id, source_merchant_id))
11
11
  signature_string = "#{@config.public_key}|#{Braintree::Digest.hexdigest(@config.private_key, payload)}"
12
12
 
13
13
  return {:bt_signature => signature_string, :bt_payload => payload}
14
14
  end
15
15
 
16
- def _sample_xml(kind, data)
16
+ def _sample_xml(kind, data, source_merchant_id=nil)
17
+ unless source_merchant_id.nil?
18
+ source_merchant_xml = "<source-merchant-id>#{source_merchant_id}</source-merchant-id>"
19
+ end
20
+
17
21
  <<-XML
18
22
  <notification>
19
23
  <timestamp type="datetime">#{Time.now.utc.iso8601}</timestamp>
20
24
  <kind>#{kind}</kind>
25
+ #{source_merchant_xml}
21
26
  <subject>
22
27
  #{_subject_sample_xml(kind, data)}
23
28
  </subject>
@@ -1395,14 +1395,14 @@ describe Braintree::PaymentMethod do
1395
1395
 
1396
1396
  context "payment method grant and revoke" do
1397
1397
  before(:each) do
1398
- partner_merchant_gateway = Braintree::Gateway.new(
1398
+ @partner_merchant_gateway = Braintree::Gateway.new(
1399
1399
  :merchant_id => "integration_merchant_public_id",
1400
1400
  :public_key => "oauth_app_partner_user_public_key",
1401
1401
  :private_key => "oauth_app_partner_user_private_key",
1402
1402
  :environment => Braintree::Configuration.environment,
1403
1403
  :logger => Logger.new("/dev/null")
1404
1404
  )
1405
- customer = partner_merchant_gateway.customer.create(
1405
+ customer = @partner_merchant_gateway.customer.create(
1406
1406
  :first_name => "Joe",
1407
1407
  :last_name => "Brown",
1408
1408
  :company => "ExampleCo",
@@ -1411,19 +1411,19 @@ describe Braintree::PaymentMethod do
1411
1411
  :fax => "614.555.5678",
1412
1412
  :website => "www.example.com"
1413
1413
  ).customer
1414
- @credit_card = partner_merchant_gateway.credit_card.create(
1414
+ @credit_card = @partner_merchant_gateway.credit_card.create(
1415
1415
  :customer_id => customer.id,
1416
1416
  :cardholder_name => "Adam Davis",
1417
1417
  :number => Braintree::Test::CreditCardNumbers::Visa,
1418
1418
  :expiration_date => "05/2009"
1419
1419
  ).credit_card
1420
1420
 
1421
- oauth_gateway = Braintree::Gateway.new(
1421
+ @oauth_gateway = Braintree::Gateway.new(
1422
1422
  :client_id => "client_id$#{Braintree::Configuration.environment}$integration_client_id",
1423
1423
  :client_secret => "client_secret$#{Braintree::Configuration.environment}$integration_client_secret",
1424
1424
  :logger => Logger.new("/dev/null")
1425
1425
  )
1426
- access_token = Braintree::OAuthTestHelper.create_token(oauth_gateway, {
1426
+ access_token = Braintree::OAuthTestHelper.create_token(@oauth_gateway, {
1427
1427
  :merchant_public_id => "integration_merchant_id",
1428
1428
  :scope => "grant_payment_method"
1429
1429
  }).credentials.access_token
@@ -1529,6 +1529,60 @@ describe Braintree::PaymentMethod do
1529
1529
  )
1530
1530
  result.should_not be_success
1531
1531
  end
1532
+
1533
+ it "revokes grants upon deletion if :revoke_all_grants is true" do
1534
+ customer_result = @partner_merchant_gateway.customer.create()
1535
+ token = @partner_merchant_gateway.payment_method.create({
1536
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
1537
+ :customer_id => customer_result.customer.id
1538
+ }).payment_method.token
1539
+
1540
+ code = Braintree::OAuthTestHelper.create_grant(@oauth_gateway, {
1541
+ :merchant_public_id => "integration_merchant_id",
1542
+ :scope => "grant_payment_method"
1543
+ })
1544
+ access_token_result = @oauth_gateway.oauth.create_token_from_code({
1545
+ :code => code,
1546
+ :scope => "grant_payment_method"
1547
+ }).credentials
1548
+
1549
+ access_token_gateway = Braintree::Gateway.new({
1550
+ :access_token => access_token_result.access_token
1551
+ })
1552
+
1553
+ grant_result = access_token_gateway.payment_method.grant(token, {
1554
+ :allow_vaulting => true,
1555
+ :include_billing_postal_code => true,
1556
+ })
1557
+
1558
+ grant_result.should be_success
1559
+
1560
+ delete_result = @partner_merchant_gateway.payment_method.delete(token, {
1561
+ :revoke_all_grants => true
1562
+ })
1563
+
1564
+ delete_result.should be_success
1565
+
1566
+ new_customer_result = Braintree::Customer.create({
1567
+ :first_name => "Joe",
1568
+ :last_name => "Brown",
1569
+ :company => "ExampleCo",
1570
+ :email => "joe@example.com",
1571
+ :phone => "312.555.1234",
1572
+ :fax => "614.555.5678",
1573
+ :website => "www.example.com"
1574
+ })
1575
+
1576
+ # Revocations don't happen immediately so we add this.
1577
+ sleep(6)
1578
+
1579
+ token_request = Braintree::PaymentMethod.create({
1580
+ :payment_method_nonce => grant_result.payment_method_nonce.nonce,
1581
+ :customer_id => new_customer_result.customer.id
1582
+ })
1583
+
1584
+ token_request.should_not be_success
1585
+ end
1532
1586
  end
1533
1587
  end
1534
1588
  end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+ require File.expand_path(File.dirname(__FILE__) + "/client_api/spec_helper")
3
+
4
+ describe Braintree::TransactionLineItem do
5
+ describe "self.find_all" do
6
+ it "returns line_items for the specified transaction" do
7
+ result = Braintree::Transaction.create(
8
+ :type => "sale",
9
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
10
+ :credit_card => {
11
+ :number => Braintree::Test::CreditCardNumbers::Visa,
12
+ :expiration_date => "05/2009"
13
+ },
14
+ :line_items => [
15
+ {
16
+ :quantity => "1.0232",
17
+ :name => "Name #1",
18
+ :kind => "debit",
19
+ :unit_amount => "45.1232",
20
+ :total_amount => "45.15",
21
+ },
22
+ ],
23
+ )
24
+ result.success?.should == true
25
+ transaction = result.transaction
26
+
27
+ line_items = Braintree::TransactionLineItem.find_all(transaction.id)
28
+
29
+ line_item = line_items[0]
30
+ line_item.quantity.should == BigDecimal.new("1.0232")
31
+ line_item.name.should == "Name #1"
32
+ line_item.kind.should == "debit"
33
+ line_item.unit_amount.should == BigDecimal.new("45.1232")
34
+ line_item.total_amount.should == BigDecimal.new("45.15")
35
+ end
36
+ end
37
+ end
38
+
@@ -2280,6 +2280,37 @@ describe Braintree::Transaction do
2280
2280
  line_item.total_amount.should == BigDecimal.new("45.15")
2281
2281
  end
2282
2282
 
2283
+ it "allows creation with single line item with zero amount fields and returns it" do
2284
+ result = Braintree::Transaction.create(
2285
+ :type => "sale",
2286
+ :amount => "45.15",
2287
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2288
+ :line_items => [
2289
+ {
2290
+ :quantity => "1.0232",
2291
+ :name => "Name #1",
2292
+ :kind => "debit",
2293
+ :unit_amount => "45.1232",
2294
+ :total_amount => "45.15",
2295
+ :unit_tax_amount => "0",
2296
+ :discount_amount => "0",
2297
+ :tax_amount => "0",
2298
+ },
2299
+ ],
2300
+ )
2301
+ result.success?.should == true
2302
+ result.transaction.line_items.length.should == 1
2303
+ line_item = result.transaction.line_items[0]
2304
+ line_item.quantity.should == BigDecimal.new("1.0232")
2305
+ line_item.name.should == "Name #1"
2306
+ line_item.kind.should == "debit"
2307
+ line_item.unit_amount.should == BigDecimal.new("45.1232")
2308
+ line_item.total_amount.should == BigDecimal.new("45.15")
2309
+ line_item.unit_tax_amount.should == BigDecimal.new("0")
2310
+ line_item.discount_amount.should == BigDecimal.new("0")
2311
+ line_item.tax_amount.should == BigDecimal.new("0")
2312
+ end
2313
+
2283
2314
  it "allows creation with single line item and returns it" do
2284
2315
  result = Braintree::Transaction.create(
2285
2316
  :type => "sale",
@@ -2295,6 +2326,7 @@ describe Braintree::Transaction do
2295
2326
  :unit_tax_amount => "1.23",
2296
2327
  :unit_of_measure => "gallon",
2297
2328
  :discount_amount => "1.02",
2329
+ :tax_amount => "4.50",
2298
2330
  :total_amount => "45.15",
2299
2331
  :product_code => "23434",
2300
2332
  :commodity_code => "9SAASSD8724",
@@ -2313,6 +2345,7 @@ describe Braintree::Transaction do
2313
2345
  line_item.unit_tax_amount.should == BigDecimal.new("1.23")
2314
2346
  line_item.unit_of_measure.should == "gallon"
2315
2347
  line_item.discount_amount.should == BigDecimal.new("1.02")
2348
+ line_item.tax_amount.should == BigDecimal.new("4.50")
2316
2349
  line_item.total_amount.should == BigDecimal.new("45.15")
2317
2350
  line_item.product_code.should == "23434"
2318
2351
  line_item.commodity_code.should == "9SAASSD8724"
@@ -2332,6 +2365,7 @@ describe Braintree::Transaction do
2332
2365
  :unit_amount => "45.1232",
2333
2366
  :unit_of_measure => "gallon",
2334
2367
  :discount_amount => "1.02",
2368
+ :tax_amount => "4.50",
2335
2369
  :total_amount => "45.15",
2336
2370
  :product_code => "23434",
2337
2371
  :commodity_code => "9SAASSD8724",
@@ -2342,6 +2376,7 @@ describe Braintree::Transaction do
2342
2376
  :kind => "credit",
2343
2377
  :unit_amount => "5",
2344
2378
  :unit_of_measure => "gallon",
2379
+ :tax_amount => "1.50",
2345
2380
  :total_amount => "10.1",
2346
2381
  },
2347
2382
  ],
@@ -2355,6 +2390,7 @@ describe Braintree::Transaction do
2355
2390
  line_item_1.unit_amount.should == BigDecimal.new("45.1232")
2356
2391
  line_item_1.unit_of_measure.should == "gallon"
2357
2392
  line_item_1.discount_amount.should == BigDecimal.new("1.02")
2393
+ line_item_1.tax_amount.should == BigDecimal.new("4.50")
2358
2394
  line_item_1.total_amount.should == BigDecimal.new("45.15")
2359
2395
  line_item_1.product_code.should == "23434"
2360
2396
  line_item_1.commodity_code.should == "9SAASSD8724"
@@ -2365,6 +2401,7 @@ describe Braintree::Transaction do
2365
2401
  line_item_2.unit_amount.should == BigDecimal.new("5")
2366
2402
  line_item_2.unit_of_measure.should == "gallon"
2367
2403
  line_item_2.total_amount.should == BigDecimal.new("10.1")
2404
+ line_item_2.tax_amount.should == BigDecimal.new("1.50")
2368
2405
  line_item_2.discount_amount.should == nil
2369
2406
  line_item_2.product_code.should == nil
2370
2407
  line_item_2.commodity_code.should == nil
@@ -2507,7 +2544,7 @@ describe Braintree::Transaction do
2507
2544
  result.errors.for(:transaction).for(:line_items).for(:index_1).on(:discount_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::DiscountAmountIsTooLarge
2508
2545
  end
2509
2546
 
2510
- it "handles validation error discount amount must be greater than zero" do
2547
+ it "handles validation error discount amount cannot be negative" do
2511
2548
  result = Braintree::Transaction.create(
2512
2549
  :type => "sale",
2513
2550
  :amount => "35.05",
@@ -2538,7 +2575,79 @@ describe Braintree::Transaction do
2538
2575
  ],
2539
2576
  )
2540
2577
  result.success?.should == false
2541
- result.errors.for(:transaction).for(:line_items).for(:index_1).on(:discount_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::DiscountAmountMustBeGreaterThanZero
2578
+ result.errors.for(:transaction).for(:line_items).for(:index_1).on(:discount_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::DiscountAmountCannotBeNegative
2579
+ end
2580
+
2581
+ it "handles validation error tax amount format is invalid" do
2582
+ result = Braintree::Transaction.create(
2583
+ :type => "sale",
2584
+ :amount => "35.05",
2585
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2586
+ :line_items => [
2587
+ {
2588
+ :quantity => "1.2322",
2589
+ :name => "Name #1",
2590
+ :kind => "debit",
2591
+ :unit_amount => "45.1232",
2592
+ :unit_of_measure => "gallon",
2593
+ :discount_amount => "1.02",
2594
+ :tax_amount => "$1.02",
2595
+ :total_amount => "45.15",
2596
+ :product_code => "23434",
2597
+ :commodity_code => "9SAASSD8724",
2598
+ },
2599
+ ],
2600
+ )
2601
+ result.success?.should == false
2602
+ result.errors.for(:transaction).for(:line_items).for(:index_0).on(:tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::TaxAmountFormatIsInvalid
2603
+ end
2604
+
2605
+ it "handles validation error tax amount is too large" do
2606
+ result = Braintree::Transaction.create(
2607
+ :type => "sale",
2608
+ :amount => "35.05",
2609
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2610
+ :line_items => [
2611
+ {
2612
+ :quantity => "1.2322",
2613
+ :name => "Name #1",
2614
+ :kind => "debit",
2615
+ :unit_amount => "45.1232",
2616
+ :unit_of_measure => "gallon",
2617
+ :discount_amount => "1.02",
2618
+ :tax_amount => "2147483648",
2619
+ :total_amount => "45.15",
2620
+ :product_code => "23434",
2621
+ :commodity_code => "9SAASSD8724",
2622
+ },
2623
+ ],
2624
+ )
2625
+ result.success?.should == false
2626
+ result.errors.for(:transaction).for(:line_items).for(:index_0).on(:tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::TaxAmountIsTooLarge
2627
+ end
2628
+
2629
+ it "handles validation error tax amount cannot be negative" do
2630
+ result = Braintree::Transaction.create(
2631
+ :type => "sale",
2632
+ :amount => "35.05",
2633
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
2634
+ :line_items => [
2635
+ {
2636
+ :quantity => "1.2322",
2637
+ :name => "Name #1",
2638
+ :kind => "debit",
2639
+ :unit_amount => "45.1232",
2640
+ :unit_of_measure => "gallon",
2641
+ :discount_amount => "1.02",
2642
+ :tax_amount => "-2",
2643
+ :total_amount => "45.15",
2644
+ :product_code => "23434",
2645
+ :commodity_code => "9SAASSD8724",
2646
+ },
2647
+ ],
2648
+ )
2649
+ result.success?.should == false
2650
+ result.errors.for(:transaction).for(:line_items).for(:index_0).on(:tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::TaxAmountCannotBeNegative
2542
2651
  end
2543
2652
 
2544
2653
  it "handles validation error kind is invalid" do
@@ -3185,7 +3294,7 @@ describe Braintree::Transaction do
3185
3294
  result.errors.for(:transaction).for(:line_items).for(:index_1).on(:unit_tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::UnitTaxAmountIsTooLarge
3186
3295
  end
3187
3296
 
3188
- it "handles validation error unit tax amount must be greater than zero" do
3297
+ it "handles validation error unit tax amount cannot be negative" do
3189
3298
  result = Braintree::Transaction.create(
3190
3299
  :type => "sale",
3191
3300
  :amount => "35.05",
@@ -3217,7 +3326,7 @@ describe Braintree::Transaction do
3217
3326
  ],
3218
3327
  )
3219
3328
  result.success?.should == false
3220
- result.errors.for(:transaction).for(:line_items).for(:index_1).on(:unit_tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::UnitTaxAmountMustBeGreaterThanZero
3329
+ result.errors.for(:transaction).for(:line_items).for(:index_1).on(:unit_tax_amount)[0].code.should == Braintree::ErrorCodes::TransactionLineItem::UnitTaxAmountCannotBeNegative
3221
3330
  end
3222
3331
 
3223
3332
  it "handles validation errors on line items structure" do
@@ -58,6 +58,29 @@ describe Braintree::WebhookNotification do
58
58
  notification.timestamp.should be_within(10).of(Time.now.utc)
59
59
  end
60
60
 
61
+ it "builds a sample notification with a source merchant ID" do
62
+ sample_notification = Braintree::WebhookTesting.sample_notification(
63
+ Braintree::WebhookNotification::Kind::SubscriptionWentPastDue,
64
+ "my_id",
65
+ "my_source_merchant_id"
66
+ )
67
+
68
+ notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
69
+
70
+ notification.source_merchant_id.should == "my_source_merchant_id"
71
+ end
72
+
73
+ it "doesn't include source merchant IDs if not supplied" do
74
+ sample_notification = Braintree::WebhookTesting.sample_notification(
75
+ Braintree::WebhookNotification::Kind::PartnerMerchantDeclined,
76
+ "my_id"
77
+ )
78
+
79
+ notification = Braintree::WebhookNotification.parse(sample_notification[:bt_signature], sample_notification[:bt_payload])
80
+
81
+ notification.source_merchant_id.should be_nil
82
+ end
83
+
61
84
  context "auth" do
62
85
  it "builds a sample notification for a status transitioned webhook" do
63
86
  sample_notification = Braintree::WebhookTesting.sample_notification(
@@ -400,6 +423,18 @@ describe Braintree::WebhookNotification do
400
423
  end
401
424
 
402
425
  describe "parse" do
426
+ it "raises InvalidSignature error when the signature is nil" do
427
+ expect do
428
+ Braintree::WebhookNotification.parse(nil, "payload")
429
+ end.to raise_error(Braintree::InvalidSignature, "signature cannot be nil")
430
+ end
431
+
432
+ it "raises InvalidSignature error when the payload is nil" do
433
+ expect do
434
+ Braintree::WebhookNotification.parse("signature", nil)
435
+ end.to raise_error(Braintree::InvalidSignature, "payload cannot be nil")
436
+ end
437
+
403
438
  it "raises InvalidSignature error when the signature is completely invalid" do
404
439
  sample_notification = Braintree::WebhookTesting.sample_notification(
405
440
  Braintree::WebhookNotification::Kind::SubscriptionWentPastDue,
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.82.0
4
+ version: 2.83.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-19 00:00:00.000000000 Z
11
+ date: 2018-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -214,6 +214,7 @@ files:
214
214
  - spec/integration/braintree/subscription_spec.rb
215
215
  - spec/integration/braintree/test/transaction_amounts_spec.rb
216
216
  - spec/integration/braintree/test_transaction_spec.rb
217
+ - spec/integration/braintree/transaction_line_item_spec.rb
217
218
  - spec/integration/braintree/transaction_search_spec.rb
218
219
  - spec/integration/braintree/transaction_spec.rb
219
220
  - spec/integration/braintree/transparent_redirect_spec.rb
@@ -275,7 +276,7 @@ files:
275
276
  - spec/unit/braintree/xml_spec.rb
276
277
  - spec/unit/braintree_spec.rb
277
278
  - spec/unit/spec_helper.rb
278
- homepage: http://www.braintreepayments.com/
279
+ homepage: https://www.braintreepayments.com/
279
280
  licenses:
280
281
  - MIT
281
282
  metadata: {}