braintree 2.11.0 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/braintree.rb CHANGED
@@ -14,14 +14,13 @@ require "zlib"
14
14
 
15
15
  require "builder"
16
16
 
17
- module Braintree
18
- end
19
-
20
17
  require File.dirname(__FILE__) + "/braintree/exceptions"
18
+
21
19
  require File.dirname(__FILE__) + "/braintree/base_module"
22
20
  require File.dirname(__FILE__) + "/braintree/modification"
23
21
 
24
22
  require File.dirname(__FILE__) + "/braintree/add_on"
23
+ require File.dirname(__FILE__) + "/braintree/add_on_gateway"
25
24
  require File.dirname(__FILE__) + "/braintree/address/country_names"
26
25
  require File.dirname(__FILE__) + "/braintree/address"
27
26
  require File.dirname(__FILE__) + "/braintree/address_gateway"
@@ -36,11 +35,14 @@ require File.dirname(__FILE__) + "/braintree/customer_search"
36
35
  require File.dirname(__FILE__) + "/braintree/descriptor"
37
36
  require File.dirname(__FILE__) + "/braintree/digest"
38
37
  require File.dirname(__FILE__) + "/braintree/discount"
38
+ require File.dirname(__FILE__) + "/braintree/discount_gateway"
39
39
  require File.dirname(__FILE__) + "/braintree/error_codes"
40
40
  require File.dirname(__FILE__) + "/braintree/error_result"
41
41
  require File.dirname(__FILE__) + "/braintree/errors"
42
42
  require File.dirname(__FILE__) + "/braintree/gateway"
43
43
  require File.dirname(__FILE__) + "/braintree/http"
44
+ require File.dirname(__FILE__) + "/braintree/plan"
45
+ require File.dirname(__FILE__) + "/braintree/plan_gateway"
44
46
  require File.dirname(__FILE__) + "/braintree/settlement_batch_summary"
45
47
  require File.dirname(__FILE__) + "/braintree/settlement_batch_summary_gateway"
46
48
  require File.dirname(__FILE__) + "/braintree/resource_collection"
@@ -69,4 +71,3 @@ require File.dirname(__FILE__) + "/braintree/xml/generator"
69
71
  require File.dirname(__FILE__) + "/braintree/xml/libxml"
70
72
  require File.dirname(__FILE__) + "/braintree/xml/rexml"
71
73
  require File.dirname(__FILE__) + "/braintree/xml/parser"
72
-
@@ -1,4 +1,9 @@
1
1
  module Braintree
2
2
  class AddOn < Modification
3
+
4
+ # See http://www.braintreepayments.com/docs/ruby/add_ons/all
5
+ def self.all
6
+ Configuration.gateway.add_on.all
7
+ end
3
8
  end
4
9
  end
@@ -0,0 +1,16 @@
1
+ module Braintree
2
+ class AddOnGateway # :nodoc
3
+ def initialize(gateway)
4
+ @gateway = gateway
5
+ @config = gateway.config
6
+ end
7
+
8
+ def all
9
+ response = @config.http.get "/add_ons"
10
+ attributes_collection = response[:add_ons]
11
+ attributes_collection.map do |attributes|
12
+ AddOn._new(attributes)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,4 +1,9 @@
1
1
  module Braintree
2
2
  class Discount < Modification
3
+
4
+ # See http://www.braintreepayments.com/docs/ruby/discounts/all
5
+ def self.all
6
+ Configuration.gateway.discount.all
7
+ end
3
8
  end
4
9
  end
@@ -0,0 +1,16 @@
1
+ module Braintree
2
+ class DiscountGateway # :nodoc
3
+ def initialize(gateway)
4
+ @gateway = gateway
5
+ @config = gateway.config
6
+ end
7
+
8
+ def all
9
+ response = @config.http.get "/discounts"
10
+ attributes_collection = response[:discounts]
11
+ attributes_collection.map do |attributes|
12
+ Discount._new(attributes)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -158,6 +158,10 @@ module Braintree
158
158
  AmountMustBeGreaterThanZero = "81531"
159
159
  BillingAddressConflict = "91530"
160
160
  CannotBeVoided = "91504"
161
+ CannotCloneCredit = "91543"
162
+ CannotCloneTransactionWithVaultCreditCard = "91540"
163
+ CannotCloneUnsuccessfulTransaction = "91542"
164
+ CannotCloneVoiceAuthorizations = "91541"
161
165
  CannotRefundCredit = "91505"
162
166
  CannotRefundUnlessSettled = "91506"
163
167
  CannotRefundWithSuspendedMerchantAccount = "91538"
@@ -180,6 +184,8 @@ module Braintree
180
184
  PaymentMethodTokenIsInvalid = "91518"
181
185
  ProcessorAuthorizationCodeCannotBeSet = "91519"
182
186
  ProcessorAuthorizationCodeIsInvalid = "81520"
187
+ ProcessorDoesNotSupportCredits = "91546"
188
+ ProcessorDoesNotSupportVoiceAuthorizations = "91545"
183
189
  PurchaseOrderNumberIsTooLong = "91537"
184
190
  RefundAmountIsTooLarge = "91521"
185
191
  SettlementAmountIsTooLarge = "91522"
@@ -194,6 +200,7 @@ module Braintree
194
200
  UnsupportedVoiceAuthorization = "91539"
195
201
 
196
202
  module Options
203
+ SubmitForSettlementIsRequiredForCloning = "91544"
197
204
  VaultIsDisabled = "91525"
198
205
  end
199
206
  end
@@ -12,6 +12,10 @@ module Braintree
12
12
  end
13
13
  end
14
14
 
15
+ def add_on
16
+ AddOnGateway.new(self)
17
+ end
18
+
15
19
  def address
16
20
  AddressGateway.new(self)
17
21
  end
@@ -24,6 +28,14 @@ module Braintree
24
28
  CustomerGateway.new(self)
25
29
  end
26
30
 
31
+ def discount
32
+ DiscountGateway.new(self)
33
+ end
34
+
35
+ def plan
36
+ PlanGateway.new(self)
37
+ end
38
+
27
39
  def settlement_batch_summary
28
40
  SettlementBatchSummaryGateway.new(self)
29
41
  end
@@ -2,7 +2,17 @@ module Braintree
2
2
  class Modification # :nodoc:
3
3
  include BaseModule
4
4
 
5
- attr_reader :amount, :id, :number_of_billing_cycles, :quantity
5
+ attr_reader :amount
6
+ attr_reader :created_at
7
+ attr_reader :description
8
+ attr_reader :id
9
+ attr_reader :kind
10
+ attr_reader :merchant_id
11
+ attr_reader :name
12
+ attr_reader :never_expires
13
+ attr_reader :number_of_billing_cycles
14
+ attr_reader :quantity
15
+ attr_reader :updated_at
6
16
 
7
17
  class << self
8
18
  protected :new
@@ -0,0 +1,44 @@
1
+ module Braintree
2
+ # See http://www.braintreepayments.com/docs/ruby
3
+ class Plan
4
+ include BaseModule
5
+
6
+ attr_reader :id
7
+ attr_reader :merchant_id
8
+ attr_reader :billing_day_of_month
9
+ attr_reader :billing_frequency
10
+ attr_reader :currency_iso_code
11
+ attr_reader :description
12
+ attr_reader :discounts
13
+ attr_reader :name
14
+ attr_reader :number_of_billing_cycles
15
+ attr_reader :price
16
+ attr_reader :trial_duration
17
+ attr_reader :trial_duration_unit
18
+ attr_reader :trial_period
19
+ attr_reader :created_at
20
+ attr_reader :updated_at
21
+ attr_reader :add_ons
22
+
23
+ # See http://www.braintreepayments.com/docs/ruby/plans/all
24
+ def self.all
25
+ Configuration.gateway.plan.all
26
+ end
27
+
28
+ def initialize(gateway, attributes) # :nodoc:
29
+ @gateway = gateway
30
+ set_instance_variables_from_hash(attributes)
31
+ add_ons.map! { |attrs| AddOn._new(attrs) }
32
+ discounts.map! { |attrs| Discount._new(attrs) }
33
+ @price = Util.to_big_decimal(price)
34
+ end
35
+
36
+ class << self
37
+ protected :new
38
+ end
39
+
40
+ def self._new(*args)
41
+ self.new *args
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,16 @@
1
+ module Braintree
2
+ class PlanGateway # :nodoc:
3
+ def initialize(gateway)
4
+ @gateway = gateway
5
+ @config = gateway.config
6
+ end
7
+
8
+ def all
9
+ response = @config.http.get "/plans"
10
+ attributes_collection = response[:plans]
11
+ attributes_collection.map do |attributes|
12
+ Plan._new(@gateway, attributes)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -28,6 +28,7 @@ module Braintree
28
28
  attr_reader :number_of_billing_cycles, :billing_day_of_month
29
29
  attr_reader :add_ons, :discounts
30
30
  attr_reader :descriptor
31
+ attr_reader :current_billing_cycle
31
32
 
32
33
  # See http://www.braintreepayments.com/docs/ruby/subscriptions/cancel
33
34
  def self.cancel(subscription_id)
@@ -81,6 +81,14 @@ module Braintree
81
81
  return_object_or_raise(:transaction) { create(attributes) }
82
82
  end
83
83
 
84
+ def self.clone_transaction(transaction_id, attributes)
85
+ Configuration.gateway.transaction.clone_transaction(transaction_id, attributes)
86
+ end
87
+
88
+ def self.clone_transaction!(transaction_id, attributes)
89
+ return_object_or_raise(:transaction) { clone_transaction(transaction_id, attributes) }
90
+ end
91
+
84
92
  # Deprecated. Use Braintree::TransparentRedirect.confirm
85
93
  #
86
94
  # See http://www.braintreepayments.com/docs/ruby/transactions/create_tr
@@ -10,6 +10,11 @@ module Braintree
10
10
  _do_create "/transactions", :transaction => attributes
11
11
  end
12
12
 
13
+ def clone_transaction(transaction_id, attributes)
14
+ Util.verify_keys(TransactionGateway._clone_signature, attributes)
15
+ _do_create "/transactions/#{transaction_id}/clone", :transaction_clone => attributes
16
+ end
17
+
13
18
  # Deprecated
14
19
  def create_from_transparent_redirect(query_string)
15
20
  params = @gateway.transparent_redirect.parse_and_validate_query_string query_string
@@ -87,6 +92,10 @@ module Braintree
87
92
  end
88
93
  end
89
94
 
95
+ def self._clone_signature # :nodoc:
96
+ [:amount, {:options => [:submit_for_settlement]}]
97
+ end
98
+
90
99
  def self._create_signature # :nodoc:
91
100
  [
92
101
  :amount, :customer_id, :merchant_account_id, :order_id, :payment_method_token,
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 2
4
- Minor = 11
4
+ Minor = 12
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::AddOn do
4
+ describe "self.all" do
5
+ it "gets all add_ons" do
6
+ id = rand(36**8).to_s(36)
7
+
8
+ expected = {
9
+ :amount => "100.00",
10
+ :description => "some description",
11
+ :id => id,
12
+ :kind => "add_on",
13
+ :name => "ruby_add_on",
14
+ :never_expires => false,
15
+ :number_of_billing_cycles => 1
16
+ }
17
+
18
+ create_modification_for_tests(expected)
19
+
20
+ add_ons = Braintree::AddOn.all
21
+ add_on = add_ons.select { |add_on| add_on.id == id }.first
22
+
23
+ add_on.should_not be_nil
24
+ add_on.amount.should == BigDecimal.new(expected[:amount])
25
+ add_on.created_at.should_not be_nil
26
+ add_on.description.should == expected[:description]
27
+ add_on.kind.should == expected[:kind]
28
+ add_on.name.should == expected[:name]
29
+ add_on.never_expires.should == expected[:never_expires]
30
+ add_on.number_of_billing_cycles.should == expected[:number_of_billing_cycles]
31
+ add_on.updated_at.should_not be_nil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::Discount do
4
+ describe "self.all" do
5
+ it "gets all discounts" do
6
+ id = rand(36**8).to_s(36)
7
+
8
+ expected = {
9
+ :amount => "100.00",
10
+ :description => "some description",
11
+ :id => id,
12
+ :kind => "discount",
13
+ :name => "ruby_discount",
14
+ :never_expires => false,
15
+ :number_of_billing_cycles => 1
16
+ }
17
+
18
+ create_modification_for_tests(expected)
19
+
20
+ discounts = Braintree::Discount.all
21
+ discount = discounts.select { |discount| discount.id == id }.first
22
+
23
+ discount.should_not be_nil
24
+ discount.amount.should == BigDecimal.new(expected[:amount])
25
+ discount.created_at.should_not be_nil
26
+ discount.description.should == expected[:description]
27
+ discount.kind.should == expected[:kind]
28
+ discount.name.should == expected[:name]
29
+ discount.never_expires.should == expected[:never_expires]
30
+ discount.number_of_billing_cycles.should == expected[:number_of_billing_cycles]
31
+ discount.updated_at.should_not be_nil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::Plan do
4
+
5
+ describe "self.all" do
6
+ it "gets all plans" do
7
+ plan_token = "test_plan_#{rand(36**8).to_s(36)}"
8
+ attributes = {
9
+ :id => plan_token,
10
+ :billing_day_of_month => 1,
11
+ :billing_frequency => 1,
12
+ :currency_iso_code => "USD",
13
+ :description => "some description",
14
+ :name => "ruby_test plan",
15
+ :number_of_billing_cycles => 1,
16
+ :price => "1.00",
17
+ :trial_duration => 3,
18
+ :trial_duration_unit => "day",
19
+ :trial_period => true,
20
+ }
21
+ create_plan_for_tests(attributes)
22
+
23
+ add_on_name = "ruby_add_on"
24
+ discount_name = "ruby_discount"
25
+ create_modification_for_tests({ :kind => "add_on", :plan_id => plan_token, :amount => "1.00", :name => add_on_name })
26
+ create_modification_for_tests({ :kind => "discount", :plan_id => plan_token, :amount => "1.00", :name => discount_name })
27
+
28
+ plans = Braintree::Plan.all
29
+ plan = plans.select { |plan| plan.id == plan_token }.first
30
+ plan.should_not be_nil
31
+ plan.id.should == attributes[:id]
32
+ plan.billing_day_of_month.should == attributes[:billing_day_of_month]
33
+ plan.billing_frequency.should == attributes[:billing_frequency]
34
+ plan.currency_iso_code.should == attributes[:currency_iso_code]
35
+ plan.description.should == attributes[:description]
36
+ plan.name.should == attributes[:name]
37
+ plan.number_of_billing_cycles.should == attributes[:number_of_billing_cycles]
38
+ plan.price.should == Braintree::Util.to_big_decimal("1.00")
39
+ plan.trial_duration.should == attributes[:trial_duration]
40
+ plan.trial_duration_unit.should == attributes[:trial_duration_unit]
41
+ plan.trial_period.should == attributes[:trial_period]
42
+ plan.created_at.should_not be_nil
43
+ plan.updated_at.should_not be_nil
44
+ plan.add_ons.first.name.should == add_on_name
45
+ plan.discounts.first.name.should == discount_name
46
+ end
47
+ end
48
+
49
+ def create_plan_for_tests(attributes)
50
+ Braintree::Configuration.gateway.config.http.post "/plans/create_plan_for_tests", :plan => attributes
51
+ end
52
+ end
@@ -27,7 +27,7 @@ describe Braintree::SettlementBatchSummary do
27
27
  )
28
28
  SpecHelper.settle_transaction transaction.id
29
29
 
30
- result = Braintree::SettlementBatchSummary.generate(Time.now.strftime("%Y-%m-%d"))
30
+ result = Braintree::SettlementBatchSummary.generate(now_in_eastern)
31
31
  result.should be_success
32
32
  amex_records = result.settlement_batch_summary.records.select {|row| row[:card_type] == Braintree::CreditCard::CardType::AmEx }
33
33
  amex_records.first[:count].to_i.should >= 1
@@ -49,7 +49,7 @@ describe Braintree::SettlementBatchSummary do
49
49
  )
50
50
  SpecHelper.settle_transaction transaction.id
51
51
 
52
- result = Braintree::SettlementBatchSummary.generate(Time.now.strftime("%Y-%m-%d"), 'store_me')
52
+ result = Braintree::SettlementBatchSummary.generate(now_in_eastern, 'store_me')
53
53
  result.should be_success
54
54
 
55
55
  amex_records = result.settlement_batch_summary.records.select {|row| row[:store_me] == "1" }
@@ -591,6 +591,7 @@ describe Braintree::Subscription do
591
591
  subscription.paid_through_date.should match(date_format)
592
592
 
593
593
  subscription.failure_count.should == 0
594
+ subscription.current_billing_cycle.should == 1
594
595
  subscription.next_bill_amount.should == "12.34"
595
596
  subscription.next_billing_period_amount.should == "12.34"
596
597
  subscription.payment_method_token.should == @credit_card.token
@@ -1,6 +1,119 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
2
 
3
3
  describe Braintree::Transaction do
4
+ describe "self.clone_transaction" do
5
+ it "creates a new transaction from the card of the transaction to clone" do
6
+ result = Braintree::Transaction.sale(
7
+ :amount => "112.44",
8
+ :customer => {
9
+ :last_name => "Adama",
10
+ },
11
+ :credit_card => {
12
+ :number => "5105105105105100",
13
+ :expiration_date => "05/2012"
14
+ },
15
+ :billing => {
16
+ :country_name => "Botswana",
17
+ :country_code_alpha2 => "BW",
18
+ :country_code_alpha3 => "BWA",
19
+ :country_code_numeric => "072"
20
+ },
21
+ :shipping => {
22
+ :country_name => "Bhutan",
23
+ :country_code_alpha2 => "BT",
24
+ :country_code_alpha3 => "BTN",
25
+ :country_code_numeric => "064"
26
+ }
27
+ )
28
+ result.success?.should == true
29
+
30
+ clone_result = Braintree::Transaction.clone_transaction(result.transaction.id, :amount => "112.44", :options => {
31
+ :submit_for_settlement => false
32
+ })
33
+ clone_result.success?.should == true
34
+
35
+ transaction = clone_result.transaction
36
+
37
+ transaction.id.should_not == result.transaction.id
38
+ transaction.amount.should == BigDecimal.new("112.44")
39
+
40
+ transaction.billing_details.country_name.should == "Botswana"
41
+ transaction.billing_details.country_code_alpha2.should == "BW"
42
+ transaction.billing_details.country_code_alpha3.should == "BWA"
43
+ transaction.billing_details.country_code_numeric.should == "072"
44
+
45
+ transaction.shipping_details.country_name.should == "Bhutan"
46
+ transaction.shipping_details.country_code_alpha2.should == "BT"
47
+ transaction.shipping_details.country_code_alpha3.should == "BTN"
48
+ transaction.shipping_details.country_code_numeric.should == "064"
49
+
50
+ transaction.credit_card_details.masked_number.should == "510510******5100"
51
+ transaction.credit_card_details.expiration_date.should == "05/2012"
52
+
53
+ transaction.customer_details.last_name.should == "Adama"
54
+ transaction.status.should == Braintree::Transaction::Status::Authorized
55
+ end
56
+
57
+ it "submit for settlement option" do
58
+ result = Braintree::Transaction.sale(
59
+ :amount => "112.44",
60
+ :credit_card => {
61
+ :number => "5105105105105100",
62
+ :expiration_date => "05/2012"
63
+ }
64
+ )
65
+
66
+ result.success?.should be_true
67
+
68
+ clone_result = Braintree::Transaction.clone_transaction(result.transaction.id, :amount => "112.44", :options => {:submit_for_settlement => true})
69
+ clone_result.success?.should == true
70
+
71
+ clone_result.transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
72
+ end
73
+
74
+ it "handles validation errors" do
75
+ transaction = Braintree::Transaction.credit!(
76
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
77
+ :credit_card => {
78
+ :number => Braintree::Test::CreditCardNumbers::Visa,
79
+ :expiration_date => "05/2009"
80
+ }
81
+ )
82
+ result = Braintree::Transaction.clone_transaction(transaction.id, :amount => "112.44")
83
+ result.success?.should be_false
84
+
85
+ result.errors.for(:transaction).on(:base).first.code.should == Braintree::ErrorCodes::Transaction::CannotCloneCredit
86
+ end
87
+ end
88
+
89
+ describe "self.clone_transaction!" do
90
+ it "returns the transaction if valid" do
91
+ transaction = Braintree::Transaction.sale!(
92
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
93
+ :credit_card => {
94
+ :number => Braintree::Test::CreditCardNumbers::Visa,
95
+ :expiration_date => "05/2009"
96
+ }
97
+ )
98
+ clone_transaction = Braintree::Transaction.clone_transaction!(transaction.id, :amount => "112.44", :options => {:submit_for_settlement => false})
99
+ clone_transaction.id.should_not == transaction.id
100
+ end
101
+
102
+ it "raises a validationsfailed if invalid" do
103
+ transaction = Braintree::Transaction.sale!(
104
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
105
+ :credit_card => {
106
+ :number => Braintree::Test::CreditCardNumbers::Visa,
107
+ :expiration_date => "05/2009"
108
+ }
109
+ )
110
+ expect do
111
+ clone_transaction = Braintree::Transaction.clone_transaction!(transaction.id, :amount => "im not a number")
112
+ clone_transaction.id.should_not == transaction.id
113
+ end.to raise_error(Braintree::ValidationsFailed)
114
+ end
115
+ end
116
+
4
117
  describe "self.create" do
5
118
  it "returns a successful result if successful" do
6
119
  result = Braintree::Transaction.create(
@@ -17,4 +17,9 @@ unless defined?(INTEGRATION_SPEC_HELPER_LOADED)
17
17
  10.times { unless File.exists?(web_server_pid_file); sleep 1; end }
18
18
  Process.kill "INT", File.read(web_server_pid_file).to_i
19
19
  end
20
+
21
+ def create_modification_for_tests(attributes)
22
+ config = Braintree::Configuration.gateway.config
23
+ config.http.post "/modifications/create_modification_for_tests", :modification => attributes
24
+ end
20
25
  end
data/spec/spec_helper.rb CHANGED
@@ -26,6 +26,10 @@ unless defined?(SPEC_HELPER_LOADED)
26
26
  end
27
27
  end
28
28
 
29
+ def now_in_eastern
30
+ (Time.now.utc - 5*60*60).strftime("%Y-%m-%d")
31
+ end
32
+
29
33
  module SpecHelper
30
34
 
31
35
  DefaultMerchantAccountId = "sandbox_credit_card"
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::Modification do
4
+ it "converts string amount" do
5
+ Braintree::Modification._new(:amount => "100.00").amount.should == BigDecimal.new("100.00")
6
+ end
7
+ end
@@ -1,6 +1,14 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
2
 
3
3
  describe Braintree::Transaction do
4
+ describe "self.clone_transaction" do
5
+ it "raises an exception if hash includes an invalid key" do
6
+ expect do
7
+ Braintree::Transaction.clone_transaction("an_id", :amount => "10.00", :invalid_key => "foo")
8
+ end.to raise_error(ArgumentError, "invalid keys: invalid_key")
9
+ end
10
+ end
11
+
4
12
  describe "self.create" do
5
13
  it "raises an exception if hash includes an invalid key" do
6
14
  expect do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree
3
3
  version: !ruby/object:Gem::Version
4
- hash: 35
5
- prerelease: false
4
+ hash: 63
5
+ prerelease:
6
6
  segments:
7
7
  - 2
8
- - 11
8
+ - 12
9
9
  - 0
10
- version: 2.11.0
10
+ version: 2.12.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Braintree
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-24 00:00:00 -05:00
18
+ date: 2011-10-06 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -46,6 +46,7 @@ files:
46
46
  - README.rdoc
47
47
  - LICENSE
48
48
  - lib/braintree/add_on.rb
49
+ - lib/braintree/add_on_gateway.rb
49
50
  - lib/braintree/address/country_names.rb
50
51
  - lib/braintree/address.rb
51
52
  - lib/braintree/address_gateway.rb
@@ -61,6 +62,7 @@ files:
61
62
  - lib/braintree/descriptor.rb
62
63
  - lib/braintree/digest.rb
63
64
  - lib/braintree/discount.rb
65
+ - lib/braintree/discount_gateway.rb
64
66
  - lib/braintree/error_codes.rb
65
67
  - lib/braintree/error_result.rb
66
68
  - lib/braintree/errors.rb
@@ -68,6 +70,8 @@ files:
68
70
  - lib/braintree/gateway.rb
69
71
  - lib/braintree/http.rb
70
72
  - lib/braintree/modification.rb
73
+ - lib/braintree/plan.rb
74
+ - lib/braintree/plan_gateway.rb
71
75
  - lib/braintree/resource_collection.rb
72
76
  - lib/braintree/settlement_batch.rb
73
77
  - lib/braintree/settlement_batch_summary.rb
@@ -99,13 +103,16 @@ files:
99
103
  - lib/braintree/xml.rb
100
104
  - lib/braintree.rb
101
105
  - spec/hacks/tcp_socket.rb
106
+ - spec/integration/braintree/add_on_spec.rb
102
107
  - spec/integration/braintree/address_spec.rb
103
108
  - spec/integration/braintree/advanced_search_spec.rb
104
109
  - spec/integration/braintree/credit_card_spec.rb
105
110
  - spec/integration/braintree/customer_search_spec.rb
106
111
  - spec/integration/braintree/customer_spec.rb
112
+ - spec/integration/braintree/discount_spec.rb
107
113
  - spec/integration/braintree/error_codes_spec.rb
108
114
  - spec/integration/braintree/http_spec.rb
115
+ - spec/integration/braintree/plan_spec.rb
109
116
  - spec/integration/braintree/settlement_batch_summary_spec.rb
110
117
  - spec/integration/braintree/subscription_spec.rb
111
118
  - spec/integration/braintree/test/transaction_amounts_spec.rb
@@ -125,6 +132,7 @@ files:
125
132
  - spec/unit/braintree/error_result_spec.rb
126
133
  - spec/unit/braintree/errors_spec.rb
127
134
  - spec/unit/braintree/http_spec.rb
135
+ - spec/unit/braintree/modification_spec.rb
128
136
  - spec/unit/braintree/resource_collection_spec.rb
129
137
  - spec/unit/braintree/subscription_search_spec.rb
130
138
  - spec/unit/braintree/subscription_spec.rb
@@ -176,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
184
  requirements: []
177
185
 
178
186
  rubyforge_project: braintree
179
- rubygems_version: 1.3.7
187
+ rubygems_version: 1.6.2
180
188
  signing_key:
181
189
  specification_version: 3
182
190
  summary: Braintree Gateway Ruby Client Library