braintree 2.38.0 → 2.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/README.rdoc +1 -1
  2. data/lib/braintree.rb +3 -0
  3. data/lib/braintree/apple_pay_card.rb +1 -1
  4. data/lib/braintree/coinbase_account.rb +20 -0
  5. data/lib/braintree/customer.rb +3 -2
  6. data/lib/braintree/error_codes.rb +49 -1
  7. data/lib/braintree/payment_method_gateway.rb +4 -0
  8. data/lib/braintree/subscription.rb +9 -0
  9. data/lib/braintree/subscription/status_details.rb +13 -0
  10. data/lib/braintree/test/nonce.rb +1 -0
  11. data/lib/braintree/transaction.rb +2 -0
  12. data/lib/braintree/transaction/apple_pay_details.rb +1 -1
  13. data/lib/braintree/transaction/coinbase_details.rb +13 -0
  14. data/lib/braintree/version.rb +1 -1
  15. data/spec/httpsd.pid +1 -1
  16. data/spec/integration/braintree/coinbase_spec.rb +31 -0
  17. data/spec/integration/braintree/customer_spec.rb +1 -0
  18. data/spec/integration/braintree/http_spec.rb +1 -1
  19. data/spec/integration/braintree/payment_method_spec.rb +1 -0
  20. data/spec/integration/braintree/subscription_spec.rb +12 -8
  21. data/spec/integration/braintree/test_transaction_spec.rb +1 -1
  22. data/spec/integration/braintree/transaction_spec.rb +15 -14
  23. data/spec/integration/braintree/transparent_redirect_spec.rb +8 -0
  24. data/spec/spec_helper.rb +13 -3
  25. data/spec/unit/braintree/address_spec.rb +2 -2
  26. data/spec/unit/braintree/credit_card_spec.rb +2 -2
  27. data/spec/unit/braintree/customer_spec.rb +2 -2
  28. data/spec/unit/braintree/digest_spec.rb +3 -3
  29. data/spec/unit/braintree/payment_method_spec.rb +2 -2
  30. data/spec/unit/braintree/subscription_spec.rb +2 -2
  31. data/spec/unit/braintree/transaction_spec.rb +2 -2
  32. data/spec/unit/braintree/transparent_redirect_spec.rb +3 -3
  33. data/spec/unit/braintree/util_spec.rb +1 -1
  34. data/spec/unit/braintree/webhook_notification_spec.rb +16 -11
  35. metadata +143 -135
  36. checksums.yaml +0 -7
@@ -67,7 +67,7 @@ Otherwise, we recommend using the non-bang methods.
67
67
 
68
68
  == More Information
69
69
 
70
- * Documentation[http://www.braintreepayments.com/docs/ruby]
70
+ * Documentation[https://developers.braintreepayments.com/ruby/sdk/server/overview]
71
71
 
72
72
  == Tests
73
73
 
@@ -29,6 +29,7 @@ require "braintree/advanced_search"
29
29
  require "braintree/apple_pay_card"
30
30
  require "braintree/client_token"
31
31
  require "braintree/client_token_gateway"
32
+ require "braintree/coinbase_account"
32
33
  require "braintree/configuration"
33
34
  require "braintree/credit_card"
34
35
  require "braintree/credit_card_gateway"
@@ -71,6 +72,7 @@ require "braintree/sepa_bank_account_gateway"
71
72
  require "braintree/sha256_digest"
72
73
  require "braintree/signature_service"
73
74
  require "braintree/subscription"
75
+ require "braintree/subscription/status_details"
74
76
  require "braintree/subscription_gateway"
75
77
  require "braintree/subscription_search"
76
78
  require "braintree/successful_result"
@@ -84,6 +86,7 @@ require "braintree/transaction"
84
86
  require "braintree/test_transaction"
85
87
  require "braintree/transaction/address_details"
86
88
  require "braintree/transaction/apple_pay_details"
89
+ require "braintree/transaction/coinbase_details"
87
90
  require "braintree/transaction/credit_card_details"
88
91
  require "braintree/transaction/customer_details"
89
92
  require "braintree/transaction/disbursement_details"
@@ -13,7 +13,7 @@ module Braintree
13
13
 
14
14
  attr_reader :token, :card_type, :last_4, :default, :image_url,
15
15
  :created_at, :updated_at, :subscriptions, :expiration_month,
16
- :expiration_year, :expired
16
+ :expiration_year, :expired, :payment_instrument_name
17
17
 
18
18
 
19
19
  def initialize(gateway, attributes) # :nodoc:
@@ -0,0 +1,20 @@
1
+ module Braintree
2
+ class CoinbaseAccount
3
+ include BaseModule # :nodoc:
4
+
5
+ attr_reader :token, :user_id, :user_email, :user_name, :subscriptions, :created_at, :updated_at, :default
6
+ def initialize(gateway, attributes) # :nodoc:
7
+ @gateway = gateway
8
+ set_instance_variables_from_hash(attributes)
9
+ @subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(@gateway, subscription_hash) }
10
+ end
11
+
12
+ class << self
13
+ protected :new
14
+ end
15
+
16
+ def self._new(*args) # :nodoc:
17
+ self.new *args
18
+ end
19
+ end
20
+ end
@@ -4,7 +4,7 @@ module Braintree
4
4
  include BaseModule
5
5
 
6
6
  attr_reader :addresses, :company, :created_at, :credit_cards, :email, :fax, :first_name, :id, :last_name,
7
- :phone, :updated_at, :website, :custom_fields, :paypal_accounts, :apple_pay_cards
7
+ :phone, :updated_at, :website, :custom_fields, :paypal_accounts, :apple_pay_cards, :coinbase_accounts
8
8
 
9
9
  # See http://www.braintreepayments.com/docs/ruby/customers/search
10
10
  def self.all
@@ -108,6 +108,7 @@ module Braintree
108
108
  set_instance_variables_from_hash(attributes)
109
109
  @credit_cards = (@credit_cards || []).map { |pm| CreditCard._new gateway, pm }
110
110
  @paypal_accounts = (@paypal_accounts || []).map { |pm| PayPalAccount._new gateway, pm }
111
+ @coinbase_accounts = (@coinbase_accounts || []).map { |pm| CoinbaseAccount._new gateway, pm }
111
112
  @apple_pay_cards = (@apple_pay_cards || []).map { |pm| ApplePayCard._new gateway, pm }
112
113
  @addresses = (@addresses || []).map { |addr| Address._new gateway, addr }
113
114
  @custom_fields = attributes[:custom_fields].is_a?(Hash) ? attributes[:custom_fields] : {}
@@ -143,7 +144,7 @@ module Braintree
143
144
 
144
145
  # Returns the customer's payment methods
145
146
  def payment_methods
146
- @credit_cards.dup + @paypal_accounts.dup + @apple_pay_cards.dup
147
+ @credit_cards.dup + @paypal_accounts.dup + @apple_pay_cards.dup + @coinbase_accounts.dup
147
148
  end
148
149
 
149
150
  def inspect # :nodoc:
@@ -52,6 +52,10 @@ module Braintree
52
52
  MerchantKeysAlreadyConfigured = "93515"
53
53
  MerchantKeysNotConfigured = "93516"
54
54
  CertificateInvalid = "93517"
55
+ CertificateMismatch = "93519"
56
+ InvalidToken = "83520"
57
+ PrivateKeyMismatch = "93521"
58
+ KeyMismatchStoringCertificate = "93522"
55
59
  end
56
60
 
57
61
  # See http://www.braintreepayments.com/docs/ruby/credit_cards/validations
@@ -81,6 +85,7 @@ module Braintree
81
85
  NumberLengthIsInvalid = "81716"
82
86
  NumberMustBeTestNumber = "81717"
83
87
  PaymentMethodConflict = "81725"
88
+ PaymentMethodIsNotACreditCard = "91738"
84
89
  PaymentMethodNonceCardTypeIsNotAccepted = "91734"
85
90
  PaymentMethodNonceConsumed = "91731"
86
91
  PaymentMethodNonceLocked = "91733"
@@ -96,8 +101,11 @@ module Braintree
96
101
  module Options
97
102
  UseBillingForShippingDisabled = "91572"
98
103
  UpdateExistingTokenIsInvalid = "91723"
99
- VerificationMerchantAccountIdIsInvalid = "91728"
100
104
  UpdateExistingTokenNotAllowed = "91729"
105
+ VerificationMerchantAccountIdIsInvalid = "91728"
106
+ VerificationAmountCannotBeNegative = "91739"
107
+ VerificationAmountFormatIsInvalid = "91740"
108
+ VerificationAmountNotSupportedByProcessor = "91741"
101
109
  end
102
110
  end
103
111
 
@@ -143,6 +151,32 @@ module Braintree
143
151
  PayPalAccountsAreNotAccepted = "82904"
144
152
  PayPalCommunicationError = "92910"
145
153
  TokenIsInUse = "92906"
154
+ AuthExpired = "92911"
155
+ CannotHaveFundingSourceWithoutAccessToken = "92912"
156
+ InvalidFundingSourceSelection = "92913"
157
+ CannotUpdatePayPalAccountUsingPaymentMethodNonce = "92914"
158
+ end
159
+
160
+ module SEPABankAccount
161
+ IBANIsRequired = "93001"
162
+ BICIsRequired = "93002"
163
+ AccountHolderNameIsRequired = "93003"
164
+ end
165
+
166
+ module SEPAMandate
167
+ AccountHolderNameIsRequired = "83301"
168
+ BICIsRequired = "83302"
169
+ IBANIsRequired = "83303"
170
+ TypeIsRequired = "93304"
171
+ IBANInvalidCharacter = "83305"
172
+ BICInvalidCharacter = "83306"
173
+ BICLengthIsInvalid = "83307"
174
+ BICUnsupportedCountry = "83308"
175
+ IBANUnsupportedCountry = "83309"
176
+ IBANInvalidFormat = "83310"
177
+ LocaleIsUnsupported = "93311"
178
+ BillingAddressIsInvalid = "93312"
179
+ TypeIsInvalid = "93313"
146
180
  end
147
181
 
148
182
  # See http://www.braintreepayments.com/docs/ruby/subscriptions/validations
@@ -260,6 +294,7 @@ module Braintree
260
294
  PaymentMethodTokenCardTypeIsNotAccepted = "91517"
261
295
  PaymentMethodTokenIsInvalid = "91518"
262
296
  PaymentInstrumentNotSupportedByMerchantAccount = "91577"
297
+ PayPalAuthExpired = "91579"
263
298
  PayPalNotEnabled = "91576"
264
299
  ProcessorAuthorizationCodeCannotBeSet = "91519"
265
300
  ProcessorAuthorizationCodeIsInvalid = "81520"
@@ -273,8 +308,10 @@ module Braintree
273
308
  ServiceFeeAmountIsTooLarge = "91556"
274
309
  ServiceFeeAmountNotAllowedOnMasterMerchantAccount = "91557"
275
310
  ServiceFeeIsNotAllowedOnCredits = "91552"
311
+ ServiceFeeNotAcceptedForPayPal = "91578"
276
312
  SettlementAmountIsLessThanServiceFeeAmount = "91551"
277
313
  SettlementAmountIsTooLarge = "91522"
314
+ ShippingAddressDoesntMatchCustomer = "91581"
278
315
  SubMerchantAccountRequiresServiceFeeAmount = "91553"
279
316
  SubscriptionDoesNotBelongToCustomer = "91529"
280
317
  SubscriptionIdIsInvalid = "91528"
@@ -292,15 +329,22 @@ module Braintree
292
329
  module Options
293
330
  SubmitForSettlementIsRequiredForCloning = "91544"
294
331
  VaultIsDisabled = "91525"
332
+
333
+ module PayPal
334
+ CustomFieldTooLong = "91580"
335
+ end
295
336
  end
296
337
 
297
338
  module Industry
339
+ IndustryTypeIsInvalid = "93401"
340
+
298
341
  module Lodging
299
342
  EmptyData = "93402"
300
343
  FolioNumberIsInvalid = "93403"
301
344
  CheckInDateIsInvalid = "93404"
302
345
  CheckOutDateIsInvalid = "93405"
303
346
  CheckOutDateMustFollowCheckInDate = "93406"
347
+ UnknownDataField = "93407"
304
348
  end
305
349
 
306
350
  module TravelCruise
@@ -435,14 +479,18 @@ module Braintree
435
479
  ProxyMerchantDoesNotExist = "92805"
436
480
  VerifyCardRequiresCustomerId = "92802"
437
481
  UnsupportedVersion = "92806"
482
+ MerchantAccountDoesNotExist = "92807"
438
483
  end
439
484
 
440
485
  module PaymentMethod
486
+ PaymentMethodNonceConsumed = "93106"
441
487
  CustomerIdIsInvalid = "93105"
442
488
  CustomerIdIsRequired = "93104"
443
489
  NonceIsInvalid = "93102"
444
490
  NonceIsRequired = "93103"
445
491
  PaymentMethodParamsAreRequired = "93101"
492
+ PaymentMethodNonceUnknown = "93108"
493
+ PaymentMethodNonceLocked = "93109"
446
494
  CannotForwardPaymentMethodType = "93107"
447
495
  end
448
496
 
@@ -16,6 +16,8 @@ module Braintree
16
16
  SuccessfulResult.new(:payment_method => CreditCard._new(@gateway, response[:credit_card]))
17
17
  elsif response[:paypal_account]
18
18
  SuccessfulResult.new(:payment_method => PayPalAccount._new(@gateway, response[:paypal_account]))
19
+ elsif response[:coinbase_account]
20
+ SuccessfulResult.new(:payment_method => CoinbaseAccount._new(@gateway, response[:coinbase_account]))
19
21
  elsif response[:sepa_bank_account]
20
22
  SuccessfulResult.new(:payment_method => SEPABankAccount._new(@gateway, response[:sepa_bank_account]))
21
23
  elsif response[:apple_pay_card]
@@ -40,6 +42,8 @@ module Braintree
40
42
  CreditCard._new(@gateway, response[:credit_card])
41
43
  elsif response.has_key?(:paypal_account)
42
44
  PayPalAccount._new(@gateway, response[:paypal_account])
45
+ elsif response[:coinbase_account]
46
+ SuccessfulResult.new(:payment_method => CoinbaseAccount._new(@gateway, response[:coinbase_account]))
43
47
  elsif response.has_key?(:sepa_bank_account)
44
48
  SEPABankAccount._new(@gateway, response[:sepa_bank_account])
45
49
  elsif response.has_key?(:apple_pay_card)
@@ -3,6 +3,13 @@ module Braintree
3
3
  class Subscription
4
4
  include BaseModule
5
5
 
6
+ module Source
7
+ Api = "api"
8
+ ControlPanel = "control_panel"
9
+ Recurring = "recurring"
10
+ Unrecognized = "unrecognized"
11
+ end
12
+
6
13
  module Status
7
14
  Active = 'Active'
8
15
  Canceled = 'Canceled'
@@ -30,6 +37,7 @@ module Braintree
30
37
  attr_reader :descriptor
31
38
  attr_reader :current_billing_cycle
32
39
  attr_reader :updated_at, :created_at
40
+ attr_reader :status_history
33
41
 
34
42
  # See http://www.braintreepayments.com/docs/ruby/subscriptions/cancel
35
43
  def self.cancel(subscription_id)
@@ -77,6 +85,7 @@ module Braintree
77
85
  transactions.map! { |attrs| Transaction._new(gateway, attrs) }
78
86
  add_ons.map! { |attrs| AddOn._new(attrs) }
79
87
  discounts.map! { |attrs| Discount._new(attrs) }
88
+ @status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
80
89
  end
81
90
 
82
91
  def next_bill_amount
@@ -0,0 +1,13 @@
1
+ module Braintree
2
+ class Subscription
3
+ class StatusDetails # :nodoc:
4
+ include BaseModule
5
+
6
+ attr_reader :balance, :price, :status, :subscription_source, :timestamp, :user
7
+
8
+ def initialize(attributes)
9
+ set_instance_variables_from_hash attributes unless attributes.nil?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -9,6 +9,7 @@ module Braintree
9
9
  ApplePayMasterCard = "fake-apple-pay-mastercard-nonce"
10
10
  ApplePayAmEx = "fake-apple-pay-amex-nonce"
11
11
  AbstractTransactable = "fake-abstract-transactable-nonce"
12
+ Coinbase = "fake-coinbase-nonce"
12
13
  end
13
14
  end
14
15
  end
@@ -83,6 +83,7 @@ module Braintree
83
83
  attr_reader :billing_details, :shipping_details
84
84
  attr_reader :paypal_details
85
85
  attr_reader :apple_pay_details
86
+ attr_reader :coinbase_details
86
87
  attr_reader :plan_id
87
88
  # The authorization code from the processor.
88
89
  attr_reader :processor_authorization_code
@@ -246,6 +247,7 @@ module Braintree
246
247
  @descriptor = Descriptor.new(@descriptor)
247
248
  @paypal_details = PayPalDetails.new(@paypal)
248
249
  @apple_pay_details = ApplePayDetails.new(@apple_pay)
250
+ @coinbase_details = CoinbaseDetails.new(@coinbase_account)
249
251
  disputes.map! { |attrs| Dispute._new(attrs) } if disputes
250
252
  @custom_fields = attributes[:custom_fields].is_a?(Hash) ? attributes[:custom_fields] : {}
251
253
  add_ons.map! { |attrs| AddOn._new(attrs) } if add_ons
@@ -4,7 +4,7 @@ module Braintree
4
4
  include BaseModule
5
5
 
6
6
  attr_reader :card_type, :last_4, :expiration_month, :expiration_year,
7
- :cardholder_name
7
+ :cardholder_name, :payment_instrument_name
8
8
 
9
9
  def initialize(attributes)
10
10
  set_instance_variables_from_hash attributes unless attributes.nil?
@@ -0,0 +1,13 @@
1
+ module Braintree
2
+ class Transaction
3
+ class CoinbaseDetails
4
+ include BaseModule
5
+
6
+ attr_reader :user_id, :user_name, :user_email, :token
7
+
8
+ def initialize(attributes)
9
+ set_instance_variables_from_hash attributes unless attributes.nil?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 2
4
- Minor = 38
4
+ Minor = 39
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -1 +1 @@
1
- 8692
1
+ 26274
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "Coinbase" do
4
+
5
+ def assert_valid_coinbase_attrs(account_or_details)
6
+ [:user_id, :user_name, :user_email].each do |attr|
7
+ [nil,""].should_not include(account_or_details.send(attr))
8
+ end
9
+ end
10
+
11
+ it "works for transaction#create" do
12
+ result = Braintree::Transaction.sale(:payment_method_nonce => Braintree::Test::Nonce::Coinbase, :amount => "0.02")
13
+ result.should be_success
14
+ assert_valid_coinbase_attrs(result.transaction.coinbase_details)
15
+ end
16
+
17
+ it "works for vaulting" do
18
+ customer = Braintree::Customer.create!
19
+ vaulted = Braintree::PaymentMethod.create(:customer_id => customer.id, :payment_method_nonce => Braintree::Test::Nonce::Coinbase).payment_method
20
+ assert_valid_coinbase_attrs(vaulted)
21
+
22
+ found = Braintree::PaymentMethod.find(vaulted.token).payment_method
23
+ assert_valid_coinbase_attrs(found)
24
+ end
25
+
26
+ it "is returned on Customers" do
27
+ customer = Braintree::Customer.create!(:payment_method_nonce => Braintree::Test::Nonce::Coinbase)
28
+ customer.payment_methods.should == customer.coinbase_accounts
29
+ assert_valid_coinbase_attrs(customer.coinbase_accounts[0])
30
+ end
31
+ end
@@ -756,6 +756,7 @@ describe Braintree::Customer do
756
756
  apple_pay_card.should be_a Braintree::ApplePayCard
757
757
  apple_pay_card.token.should_not be_nil
758
758
  apple_pay_card.expiration_year.should_not be_nil
759
+ apple_pay_card.payment_instrument_name.should == "AmEx 41002"
759
760
  end
760
761
 
761
762
  it "works for a blank customer" do
@@ -216,7 +216,7 @@ describe Braintree::Http do
216
216
  context = OpenSSL::X509::StoreContext.new(OpenSSL::X509::Store.new)
217
217
  expect do
218
218
  Braintree::Configuration.instantiate.http._verify_ssl_certificate(true, context)
219
- end.to_not raise_error(OpenSSL::SSL::SSLError)
219
+ end.to_not raise_error
220
220
  output.string.should == ""
221
221
  ensure
222
222
  Braintree::Configuration.logger = old_logger
@@ -86,6 +86,7 @@ describe Braintree::PaymentMethod do
86
86
  apple_pay_card.should_not be_nil
87
87
  apple_pay_card.token.should == token
88
88
  apple_pay_card.card_type.should == Braintree::ApplePayCard::CardType::AmEx
89
+ apple_pay_card.payment_instrument_name.should == "AmEx 41002"
89
90
  apple_pay_card.default.should == true
90
91
  apple_pay_card.image_url.should =~ /apple_pay/
91
92
  apple_pay_card.expiration_month.to_i.should > 0
@@ -38,6 +38,10 @@ describe Braintree::Subscription do
38
38
  result.subscription.next_bill_amount.should == "12.34"
39
39
  result.subscription.next_billing_period_amount.should == "12.34"
40
40
  result.subscription.payment_method_token.should == @credit_card.token
41
+
42
+ result.subscription.status_history.first.price.should == "12.34"
43
+ result.subscription.status_history.first.status.should == Braintree::Subscription::Status::Active
44
+ result.subscription.status_history.first.subscription_source.should == Braintree::Subscription::Source::Api
41
45
  end
42
46
 
43
47
  it "returns a transaction with billing period populated" do
@@ -305,7 +309,7 @@ describe Braintree::Subscription do
305
309
  :price => Braintree::Test::TransactionAmounts::Decline
306
310
  )
307
311
 
308
- result.success?.should be_false
312
+ result.success?.should be(false)
309
313
  result.transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
310
314
  result.message.should == "Do Not Honor"
311
315
  end
@@ -417,14 +421,14 @@ describe Braintree::Subscription do
417
421
  add_ons.first.amount.should == BigDecimal.new("10.00")
418
422
  add_ons.first.quantity.should == 1
419
423
  add_ons.first.number_of_billing_cycles.should be_nil
420
- add_ons.first.never_expires?.should be_true
424
+ add_ons.first.never_expires?.should be(true)
421
425
  add_ons.first.current_billing_cycle.should == 0
422
426
 
423
427
  add_ons.last.id.should == "increase_20"
424
428
  add_ons.last.amount.should == BigDecimal.new("20.00")
425
429
  add_ons.last.quantity.should == 1
426
430
  add_ons.last.number_of_billing_cycles.should be_nil
427
- add_ons.last.never_expires?.should be_true
431
+ add_ons.last.never_expires?.should be(true)
428
432
  add_ons.last.current_billing_cycle.should == 0
429
433
 
430
434
  subscription.discounts.size.should == 2
@@ -434,14 +438,14 @@ describe Braintree::Subscription do
434
438
  discounts.first.amount.should == BigDecimal.new("11.00")
435
439
  discounts.first.quantity.should == 1
436
440
  discounts.first.number_of_billing_cycles.should be_nil
437
- discounts.first.never_expires?.should be_true
441
+ discounts.first.never_expires?.should be(true)
438
442
  discounts.first.current_billing_cycle.should == 0
439
443
 
440
444
  discounts.last.id.should == "discount_7"
441
445
  discounts.last.amount.should == BigDecimal.new("7.00")
442
446
  discounts.last.quantity.should == 1
443
447
  discounts.last.number_of_billing_cycles.should be_nil
444
- discounts.last.never_expires?.should be_true
448
+ discounts.last.never_expires?.should be(true)
445
449
  discounts.last.current_billing_cycle.should == 0
446
450
  end
447
451
 
@@ -481,7 +485,7 @@ describe Braintree::Subscription do
481
485
  add_ons.first.amount.should == BigDecimal.new("50.00")
482
486
  add_ons.first.quantity.should == 2
483
487
  add_ons.first.number_of_billing_cycles.should == 5
484
- add_ons.first.never_expires?.should be_false
488
+ add_ons.first.never_expires?.should be(false)
485
489
  add_ons.first.current_billing_cycle.should == 0
486
490
 
487
491
  add_ons.last.id.should == "increase_20"
@@ -501,7 +505,7 @@ describe Braintree::Subscription do
501
505
  discounts.last.amount.should == BigDecimal.new("15.00")
502
506
  discounts.last.quantity.should == 3
503
507
  discounts.last.number_of_billing_cycles.should be_nil
504
- discounts.last.never_expires?.should be_true
508
+ discounts.last.never_expires?.should be(true)
505
509
  discounts.last.current_billing_cycle.should == 0
506
510
  end
507
511
 
@@ -947,7 +951,7 @@ describe Braintree::Subscription do
947
951
 
948
952
  result.success?.should == true
949
953
  result.subscription.number_of_billing_cycles.should == nil
950
- result.subscription.never_expires?.should be_true
954
+ result.subscription.never_expires?.should be(true)
951
955
  end
952
956
  end
953
957