braintree 2.11.0 → 2.12.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.
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