braintree 1.0.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/LICENSE +22 -0
 - data/README.rdoc +62 -0
 - data/lib/braintree.rb +66 -0
 - data/lib/braintree/address.rb +122 -0
 - data/lib/braintree/base_module.rb +29 -0
 - data/lib/braintree/configuration.rb +99 -0
 - data/lib/braintree/credit_card.rb +231 -0
 - data/lib/braintree/credit_card_verification.rb +31 -0
 - data/lib/braintree/customer.rb +231 -0
 - data/lib/braintree/digest.rb +20 -0
 - data/lib/braintree/error_codes.rb +95 -0
 - data/lib/braintree/error_result.rb +39 -0
 - data/lib/braintree/errors.rb +29 -0
 - data/lib/braintree/http.rb +105 -0
 - data/lib/braintree/paged_collection.rb +55 -0
 - data/lib/braintree/ssl_expiration_check.rb +28 -0
 - data/lib/braintree/successful_result.rb +38 -0
 - data/lib/braintree/test/credit_card_numbers.rb +50 -0
 - data/lib/braintree/test/transaction_amounts.rb +10 -0
 - data/lib/braintree/transaction.rb +360 -0
 - data/lib/braintree/transaction/address_details.rb +15 -0
 - data/lib/braintree/transaction/credit_card_details.rb +22 -0
 - data/lib/braintree/transaction/customer_details.rb +13 -0
 - data/lib/braintree/transparent_redirect.rb +110 -0
 - data/lib/braintree/util.rb +94 -0
 - data/lib/braintree/validation_error.rb +15 -0
 - data/lib/braintree/validation_error_collection.rb +80 -0
 - data/lib/braintree/version.rb +9 -0
 - data/lib/braintree/xml.rb +12 -0
 - data/lib/braintree/xml/generator.rb +80 -0
 - data/lib/braintree/xml/libxml.rb +69 -0
 - data/lib/braintree/xml/parser.rb +93 -0
 - data/lib/ssl/securetrust_ca.crt +44 -0
 - data/lib/ssl/valicert_ca.crt +18 -0
 - data/spec/integration/braintree/address_spec.rb +352 -0
 - data/spec/integration/braintree/credit_card_spec.rb +676 -0
 - data/spec/integration/braintree/customer_spec.rb +664 -0
 - data/spec/integration/braintree/http_spec.rb +201 -0
 - data/spec/integration/braintree/test/transaction_amounts_spec.rb +29 -0
 - data/spec/integration/braintree/transaction_spec.rb +900 -0
 - data/spec/integration/spec_helper.rb +38 -0
 - data/spec/script/httpsd.rb +27 -0
 - data/spec/spec_helper.rb +41 -0
 - data/spec/unit/braintree/address_spec.rb +86 -0
 - data/spec/unit/braintree/configuration_spec.rb +190 -0
 - data/spec/unit/braintree/credit_card_spec.rb +137 -0
 - data/spec/unit/braintree/credit_card_verification_spec.rb +17 -0
 - data/spec/unit/braintree/customer_spec.rb +103 -0
 - data/spec/unit/braintree/digest_spec.rb +28 -0
 - data/spec/unit/braintree/error_result_spec.rb +42 -0
 - data/spec/unit/braintree/errors_spec.rb +81 -0
 - data/spec/unit/braintree/http_spec.rb +42 -0
 - data/spec/unit/braintree/paged_collection_spec.rb +128 -0
 - data/spec/unit/braintree/ssl_expiration_check_spec.rb +92 -0
 - data/spec/unit/braintree/successful_result_spec.rb +27 -0
 - data/spec/unit/braintree/transaction/credit_card_details_spec.rb +22 -0
 - data/spec/unit/braintree/transaction_spec.rb +136 -0
 - data/spec/unit/braintree/transparent_redirect_spec.rb +154 -0
 - data/spec/unit/braintree/util_spec.rb +142 -0
 - data/spec/unit/braintree/validation_error_collection_spec.rb +128 -0
 - data/spec/unit/braintree/validation_error_spec.rb +19 -0
 - data/spec/unit/braintree/xml/libxml_spec.rb +51 -0
 - data/spec/unit/braintree/xml_spec.rb +122 -0
 - data/spec/unit/spec_helper.rb +1 -0
 - metadata +118 -0
 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::CreditCardVerification do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "inspect" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "is better than the default inspect" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  verification = Braintree::CreditCardVerification._new(
         
     | 
| 
      
 7 
     | 
    
         
            +
                    :status => "verified",
         
     | 
| 
      
 8 
     | 
    
         
            +
                    :avs_error_response_code => "I",
         
     | 
| 
      
 9 
     | 
    
         
            +
                    :avs_postal_code_response_code => "I",
         
     | 
| 
      
 10 
     | 
    
         
            +
                    :avs_street_address_response_code => "I",
         
     | 
| 
      
 11 
     | 
    
         
            +
                    :cvv_response_code => "I"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  )
         
     | 
| 
      
 13 
     | 
    
         
            +
                  verification.inspect.should == %(#<Braintree::CreditCardVerification status: "verified", cvv_response_code: "I", avs_error_response_code: "I", avs_postal_code_response_code: "I", avs_street_address_response_code: "I">)
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,103 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::Customer do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "inspect" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "includes the id first" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  output = Braintree::Customer._new({:first_name => 'Dan', :id => '1234'}).inspect
         
     | 
| 
      
 7 
     | 
    
         
            +
                  output.should include("#<Braintree::Customer id: \"1234\",")
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
                
         
     | 
| 
      
 10 
     | 
    
         
            +
                it "includes all customer attributes" do
         
     | 
| 
      
 11 
     | 
    
         
            +
                  customer = Braintree::Customer._new(
         
     | 
| 
      
 12 
     | 
    
         
            +
                    :company => "Company",
         
     | 
| 
      
 13 
     | 
    
         
            +
                    :email => "e@mail.com",
         
     | 
| 
      
 14 
     | 
    
         
            +
                    :fax => "483-438-5821",
         
     | 
| 
      
 15 
     | 
    
         
            +
                    :first_name => "Patrick",
         
     | 
| 
      
 16 
     | 
    
         
            +
                    :last_name => "Smith",
         
     | 
| 
      
 17 
     | 
    
         
            +
                    :phone => "802-483-5932",
         
     | 
| 
      
 18 
     | 
    
         
            +
                    :website => "patrick.smith.com",
         
     | 
| 
      
 19 
     | 
    
         
            +
                    :created_at => Time.now,
         
     | 
| 
      
 20 
     | 
    
         
            +
                    :updated_at => Time.now
         
     | 
| 
      
 21 
     | 
    
         
            +
                  )
         
     | 
| 
      
 22 
     | 
    
         
            +
                  output = customer.inspect
         
     | 
| 
      
 23 
     | 
    
         
            +
                  output.should include(%q(company: "Company"))
         
     | 
| 
      
 24 
     | 
    
         
            +
                  output.should include(%q(email: "e@mail.com"))
         
     | 
| 
      
 25 
     | 
    
         
            +
                  output.should include(%q(fax: "483-438-5821"))
         
     | 
| 
      
 26 
     | 
    
         
            +
                  output.should include(%q(first_name: "Patrick"))
         
     | 
| 
      
 27 
     | 
    
         
            +
                  output.should include(%q(last_name: "Smith"))
         
     | 
| 
      
 28 
     | 
    
         
            +
                  output.should include(%q(phone: "802-483-5932"))
         
     | 
| 
      
 29 
     | 
    
         
            +
                  output.should include(%q(website: "patrick.smith.com"))
         
     | 
| 
      
 30 
     | 
    
         
            +
                  output.should include(%Q(created_at: #{customer.created_at.inspect}))
         
     | 
| 
      
 31 
     | 
    
         
            +
                  output.should include(%Q(updated_at: #{customer.updated_at.inspect}))
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
                
         
     | 
| 
      
 35 
     | 
    
         
            +
              describe "self.create" do
         
     | 
| 
      
 36 
     | 
    
         
            +
                it "raises an exception if hash includes an invalid key" do
         
     | 
| 
      
 37 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 38 
     | 
    
         
            +
                    Braintree::Customer.create(:first_name => "Joe", :invalid_key => "foo")
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end.to raise_error(ArgumentError, "invalid keys: invalid_key")
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
              
         
     | 
| 
      
 43 
     | 
    
         
            +
              describe "self.update" do
         
     | 
| 
      
 44 
     | 
    
         
            +
                it "raises an exception if hash includes an invalid key" do
         
     | 
| 
      
 45 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 46 
     | 
    
         
            +
                    Braintree::Customer.update("customer_id", :first_name => "Joe", :invalid_key => "foo")
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end.to raise_error(ArgumentError, "invalid keys: invalid_key")
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              describe "self.create_from_transparent_redirect" do
         
     | 
| 
      
 52 
     | 
    
         
            +
                it "raises an exception if the query string is forged" do
         
     | 
| 
      
 53 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 54 
     | 
    
         
            +
                    Braintree::Customer.create_from_transparent_redirect("forged=query_string")
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end.to raise_error(Braintree::ForgedQueryString)
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              describe "==" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                it "returns true when given a customer with the same id" do
         
     | 
| 
      
 61 
     | 
    
         
            +
                  first = Braintree::Customer._new(:id => 123)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  second = Braintree::Customer._new(:id => 123)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  
         
     | 
| 
      
 64 
     | 
    
         
            +
                  first.should == second
         
     | 
| 
      
 65 
     | 
    
         
            +
                  second.should == first
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                
         
     | 
| 
      
 68 
     | 
    
         
            +
                it "returns false when given a customer with a different id" do
         
     | 
| 
      
 69 
     | 
    
         
            +
                  first = Braintree::Customer._new(:id => 123)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  second = Braintree::Customer._new(:id => 124)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  
         
     | 
| 
      
 72 
     | 
    
         
            +
                  first.should_not == second
         
     | 
| 
      
 73 
     | 
    
         
            +
                  second.should_not == first
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
      
 76 
     | 
    
         
            +
                it "returns false when not given a customer" do
         
     | 
| 
      
 77 
     | 
    
         
            +
                  customer = Braintree::Customer._new(:id => 123)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  customer.should_not == "not a customer"
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
              end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
              describe "initialize" do
         
     | 
| 
      
 83 
     | 
    
         
            +
                it "converts payment method hashes into payment method objects" do
         
     | 
| 
      
 84 
     | 
    
         
            +
                  customer = Braintree::Customer._new(
         
     | 
| 
      
 85 
     | 
    
         
            +
                    :credit_cards => [
         
     | 
| 
      
 86 
     | 
    
         
            +
                      {:token => "pm1"},
         
     | 
| 
      
 87 
     | 
    
         
            +
                      {:token => "pm2"}
         
     | 
| 
      
 88 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 89 
     | 
    
         
            +
                  )
         
     | 
| 
      
 90 
     | 
    
         
            +
                  customer.credit_cards.size.should == 2
         
     | 
| 
      
 91 
     | 
    
         
            +
                  customer.credit_cards[0].token.should == "pm1"
         
     | 
| 
      
 92 
     | 
    
         
            +
                  customer.credit_cards[1].token.should == "pm2"
         
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
      
 94 
     | 
    
         
            +
              end
         
     | 
| 
      
 95 
     | 
    
         
            +
              
         
     | 
| 
      
 96 
     | 
    
         
            +
              describe "new" do
         
     | 
| 
      
 97 
     | 
    
         
            +
                it "is protected" do
         
     | 
| 
      
 98 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 99 
     | 
    
         
            +
                    Braintree::Customer.new
         
     | 
| 
      
 100 
     | 
    
         
            +
                  end.to raise_error(NoMethodError, /protected method .new/)
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::Digest do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "self.hexdigest" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "returns the sha1 hmac of the input string (test case 6 from RFC 2202)" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 7 
     | 
    
         
            +
                    original_key = Braintree::Configuration.private_key
         
     | 
| 
      
 8 
     | 
    
         
            +
                    Braintree::Configuration.private_key = "\xaa" * 80
         
     | 
| 
      
 9 
     | 
    
         
            +
                    data = "Test Using Larger Than Block-Size Key - Hash Key First"
         
     | 
| 
      
 10 
     | 
    
         
            +
                    Braintree::Digest.hexdigest(data).should == "aa4ae5e15272d00e95705637ce8a3b55ed402112"
         
     | 
| 
      
 11 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 12 
     | 
    
         
            +
                    Braintree::Configuration.private_key = original_key
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                it "returns the sha1 hmac of the input string (test case 7 from RFC 2202)" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 18 
     | 
    
         
            +
                    original_key = Braintree::Configuration.private_key
         
     | 
| 
      
 19 
     | 
    
         
            +
                    Braintree::Configuration.private_key = "\xaa" * 80
         
     | 
| 
      
 20 
     | 
    
         
            +
                    data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"
         
     | 
| 
      
 21 
     | 
    
         
            +
                    Braintree::Digest.hexdigest(data).should == "e8e99d0f45237d786d6bbaa7965c7808bbff1a91"
         
     | 
| 
      
 22 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 23 
     | 
    
         
            +
                    Braintree::Configuration.private_key = original_key
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::ErrorResult do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "initialize" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "initializes params and errors" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  errors = {
         
     | 
| 
      
 7 
     | 
    
         
            +
                    :scope => {
         
     | 
| 
      
 8 
     | 
    
         
            +
                      :errors => [{:code => "123", :message => "something is invalid", :attribute => "something"}]
         
     | 
| 
      
 9 
     | 
    
         
            +
                    }
         
     | 
| 
      
 10 
     | 
    
         
            +
                  }
         
     | 
| 
      
 11 
     | 
    
         
            +
                  result = Braintree::ErrorResult.new(:params => "params", :errors => errors)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  result.success?.should == false
         
     | 
| 
      
 13 
     | 
    
         
            +
                  result.params.should == "params"
         
     | 
| 
      
 14 
     | 
    
         
            +
                  result.errors.size.should == 1
         
     | 
| 
      
 15 
     | 
    
         
            +
                  result.errors.for(:scope)[0].message.should == "something is invalid"
         
     | 
| 
      
 16 
     | 
    
         
            +
                  result.errors.for(:scope)[0].attribute.should == "something"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  result.errors.for(:scope)[0].code.should == "123"
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                it "ignores data other than params and errors" do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # so that we can add more data into the response in the future without breaking the client lib
         
     | 
| 
      
 22 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 23 
     | 
    
         
            +
                    result = Braintree::ErrorResult.new(:params => "params", :errors => {:errors => []}, :extra => "is ignored")
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end.to_not raise_error
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              describe "inspect" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                it "shows errors 2 levels deep" do
         
     | 
| 
      
 30 
     | 
    
         
            +
                  errors = {
         
     | 
| 
      
 31 
     | 
    
         
            +
                    :level1 => {
         
     | 
| 
      
 32 
     | 
    
         
            +
                      :errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
         
     | 
| 
      
 33 
     | 
    
         
            +
                      :level2 => {
         
     | 
| 
      
 34 
     | 
    
         
            +
                        :errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
         
     | 
| 
      
 35 
     | 
    
         
            +
                      }
         
     | 
| 
      
 36 
     | 
    
         
            +
                    }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  }
         
     | 
| 
      
 38 
     | 
    
         
            +
                  result = Braintree::ErrorResult.new(:params => "params", :errors => errors)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  result.inspect.should == "#<Braintree::ErrorResult params:{...} errors:<level1:[(code1) message], level1/level2:[(code2) message2]>>"
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::Errors do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "for" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "accesses errors for the given scope" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 7 
     | 
    
         
            +
                    :level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
         
     | 
| 
      
 8 
     | 
    
         
            +
                  )
         
     | 
| 
      
 9 
     | 
    
         
            +
                  errors.for(:level1).size.should == 1
         
     | 
| 
      
 10 
     | 
    
         
            +
                  errors.for(:level1)[0].code.should == "code1"
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                it "returns nil if there are no errors at the given scope" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 15 
     | 
    
         
            +
                    :level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
         
     | 
| 
      
 16 
     | 
    
         
            +
                  )
         
     | 
| 
      
 17 
     | 
    
         
            +
                  errors.for(:no_errors_here).should == nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              describe "inspect" do
         
     | 
| 
      
 22 
     | 
    
         
            +
                it "is better than the default inspect" do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 24 
     | 
    
         
            +
                    :level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
         
     | 
| 
      
 25 
     | 
    
         
            +
                  )
         
     | 
| 
      
 26 
     | 
    
         
            +
                  errors.inspect.should == "#<Braintree::Errors level1:[(code1) message]>"
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                it "shows errors 2 levels deep" do
         
     | 
| 
      
 30 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 31 
     | 
    
         
            +
                    :level1 => {
         
     | 
| 
      
 32 
     | 
    
         
            +
                      :errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
         
     | 
| 
      
 33 
     | 
    
         
            +
                      :level2 => {
         
     | 
| 
      
 34 
     | 
    
         
            +
                        :errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
         
     | 
| 
      
 35 
     | 
    
         
            +
                      }
         
     | 
| 
      
 36 
     | 
    
         
            +
                    }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  )
         
     | 
| 
      
 38 
     | 
    
         
            +
                  errors.inspect.should == "#<Braintree::Errors level1:[(code1) message], level1/level2:[(code2) message2]>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it "shows errors 3 levels deep" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 43 
     | 
    
         
            +
                    :level1 => {
         
     | 
| 
      
 44 
     | 
    
         
            +
                      :errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
         
     | 
| 
      
 45 
     | 
    
         
            +
                      :level2 => {
         
     | 
| 
      
 46 
     | 
    
         
            +
                        :errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
         
     | 
| 
      
 47 
     | 
    
         
            +
                        :level3 => {
         
     | 
| 
      
 48 
     | 
    
         
            +
                          :errors => [{:code => "code3", :attribute => "attr3", :message => "message3"}],
         
     | 
| 
      
 49 
     | 
    
         
            +
                        }
         
     | 
| 
      
 50 
     | 
    
         
            +
                      }
         
     | 
| 
      
 51 
     | 
    
         
            +
                    }
         
     | 
| 
      
 52 
     | 
    
         
            +
                  )
         
     | 
| 
      
 53 
     | 
    
         
            +
                  errors.inspect.should == "#<Braintree::Errors level1:[(code1) message], level1/level2:[(code2) message2], level1/level2/level3:[(code3) message3]>"
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
              describe "size" do
         
     | 
| 
      
 58 
     | 
    
         
            +
                it "returns the number of validation errors at the first level if only has one level" do
         
     | 
| 
      
 59 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 60 
     | 
    
         
            +
                    :level1 => {:errors => [{:code => "1", :attribute => "attr", :message => "message"}]}
         
     | 
| 
      
 61 
     | 
    
         
            +
                  )
         
     | 
| 
      
 62 
     | 
    
         
            +
                  errors.size.should == 1
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                it "returns the total number of validation errors in the hierarchy" do
         
     | 
| 
      
 66 
     | 
    
         
            +
                  errors = Braintree::Errors.new(
         
     | 
| 
      
 67 
     | 
    
         
            +
                    :level1 => {
         
     | 
| 
      
 68 
     | 
    
         
            +
                      :errors => [{:code => "1", :attribute => "attr", :message => "message"}],
         
     | 
| 
      
 69 
     | 
    
         
            +
                      :level2 => {
         
     | 
| 
      
 70 
     | 
    
         
            +
                        :errors => [
         
     | 
| 
      
 71 
     | 
    
         
            +
                          {:code => "2", :attribute => "attr2", :message => "message2"},
         
     | 
| 
      
 72 
     | 
    
         
            +
                          {:code => "3", :attribute => "attr3", :message => "message3"}
         
     | 
| 
      
 73 
     | 
    
         
            +
                        ],
         
     | 
| 
      
 74 
     | 
    
         
            +
                      }
         
     | 
| 
      
 75 
     | 
    
         
            +
                    }
         
     | 
| 
      
 76 
     | 
    
         
            +
                  )
         
     | 
| 
      
 77 
     | 
    
         
            +
                  errors.size.should == 3
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
              end
         
     | 
| 
      
 80 
     | 
    
         
            +
            end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Braintree::Http do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "self._format_and_sanitize_body_for_log" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "adds [Braintree] before each line" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  input_xml = <<-END
         
     | 
| 
      
 7 
     | 
    
         
            +
            <customer>
         
     | 
| 
      
 8 
     | 
    
         
            +
              <first-name>Joe</first-name>
         
     | 
| 
      
 9 
     | 
    
         
            +
              <last-name>Doe</last-name>
         
     | 
| 
      
 10 
     | 
    
         
            +
            </customer>
         
     | 
| 
      
 11 
     | 
    
         
            +
            END
         
     | 
| 
      
 12 
     | 
    
         
            +
                  expected_xml = <<-END
         
     | 
| 
      
 13 
     | 
    
         
            +
            [Braintree] <customer>
         
     | 
| 
      
 14 
     | 
    
         
            +
            [Braintree]   <first-name>Joe</first-name>
         
     | 
| 
      
 15 
     | 
    
         
            +
            [Braintree]   <last-name>Doe</last-name>
         
     | 
| 
      
 16 
     | 
    
         
            +
            [Braintree] </customer>
         
     | 
| 
      
 17 
     | 
    
         
            +
            END
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Braintree::Http._format_and_sanitize_body_for_log(input_xml).should == expected_xml
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                
         
     | 
| 
      
 21 
     | 
    
         
            +
                it "sanitizes credit card number and cvv" do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  input_xml = <<-END
         
     | 
| 
      
 23 
     | 
    
         
            +
            <customer>
         
     | 
| 
      
 24 
     | 
    
         
            +
              <first-name>Joe</first-name>
         
     | 
| 
      
 25 
     | 
    
         
            +
              <last-name>Doe</last-name>
         
     | 
| 
      
 26 
     | 
    
         
            +
              <number>1234560000001234</number>
         
     | 
| 
      
 27 
     | 
    
         
            +
              <cvv>123</cvv>
         
     | 
| 
      
 28 
     | 
    
         
            +
            </customer>
         
     | 
| 
      
 29 
     | 
    
         
            +
                  END
         
     | 
| 
      
 30 
     | 
    
         
            +
                  
         
     | 
| 
      
 31 
     | 
    
         
            +
                  expected_xml = <<-END
         
     | 
| 
      
 32 
     | 
    
         
            +
            [Braintree] <customer>
         
     | 
| 
      
 33 
     | 
    
         
            +
            [Braintree]   <first-name>Joe</first-name>
         
     | 
| 
      
 34 
     | 
    
         
            +
            [Braintree]   <last-name>Doe</last-name>
         
     | 
| 
      
 35 
     | 
    
         
            +
            [Braintree]   <number>123456******1234</number>
         
     | 
| 
      
 36 
     | 
    
         
            +
            [Braintree]   <cvv>***</cvv>
         
     | 
| 
      
 37 
     | 
    
         
            +
            [Braintree] </customer>
         
     | 
| 
      
 38 
     | 
    
         
            +
            END
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Braintree::Http._format_and_sanitize_body_for_log(input_xml).should == expected_xml
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,128 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.dirname(__FILE__) + "/../spec_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "Braintree::PagedCollection" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "includes enumerable" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                collection = Braintree::PagedCollection.new(:items => ["a"])
         
     | 
| 
      
 6 
     | 
    
         
            +
                collection.detect { |item| item == "a" }.should == "a"
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              describe "[]" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                it "returns the element at the given index" do
         
     | 
| 
      
 11 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(:items => ["one", "two", "three"])
         
     | 
| 
      
 12 
     | 
    
         
            +
                  collection[0].should == "one"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  collection[2].should == "three"
         
     | 
| 
      
 14 
     | 
    
         
            +
                  collection[3].should == nil
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
              describe "each" do
         
     | 
| 
      
 19 
     | 
    
         
            +
                it "iterates over the contents" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  expected = ["apples", "bananas", "cherries"]
         
     | 
| 
      
 21 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 22 
     | 
    
         
            +
                    :items => expected
         
     | 
| 
      
 23 
     | 
    
         
            +
                  )
         
     | 
| 
      
 24 
     | 
    
         
            +
                  actual = []
         
     | 
| 
      
 25 
     | 
    
         
            +
                  collection.each do |item|
         
     | 
| 
      
 26 
     | 
    
         
            +
                    actual << item
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  actual.should == expected
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              describe "first" do
         
     | 
| 
      
 33 
     | 
    
         
            +
                it "returns the first element" do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 35 
     | 
    
         
            +
                    :items => ["apples", "bananas", "cherries"]
         
     | 
| 
      
 36 
     | 
    
         
            +
                  )
         
     | 
| 
      
 37 
     | 
    
         
            +
                  collection.first.should == "apples"
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              
         
     | 
| 
      
 41 
     | 
    
         
            +
              describe "initialize" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                it "initializes attributes as expected" do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 44 
     | 
    
         
            +
                    :current_page_number => 1,
         
     | 
| 
      
 45 
     | 
    
         
            +
                    :page_size => 2,
         
     | 
| 
      
 46 
     | 
    
         
            +
                    :total_items => 4,
         
     | 
| 
      
 47 
     | 
    
         
            +
                    :items => ["apples", "bananas", "cherries"]
         
     | 
| 
      
 48 
     | 
    
         
            +
                  )
         
     | 
| 
      
 49 
     | 
    
         
            +
                  collection.current_page_number.should == 1
         
     | 
| 
      
 50 
     | 
    
         
            +
                  collection.page_size.should == 2
         
     | 
| 
      
 51 
     | 
    
         
            +
                  collection.total_items.should == 4
         
     | 
| 
      
 52 
     | 
    
         
            +
                  collection.items.should == ["apples", "bananas", "cherries"]
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              describe "last_page?" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                it "returns true if the page is the last page" do
         
     | 
| 
      
 58 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 150)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  collection.last_page?.should == true
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                it "returns false if the page is not the last page" do
         
     | 
| 
      
 63 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 151)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  collection.last_page?.should == false
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
              end
         
     | 
| 
      
 67 
     | 
    
         
            +
              
         
     | 
| 
      
 68 
     | 
    
         
            +
              describe "next_page" do
         
     | 
| 
      
 69 
     | 
    
         
            +
                it "returns the next page of results" do
         
     | 
| 
      
 70 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 71 
     | 
    
         
            +
                      :current_page_number => 1,
         
     | 
| 
      
 72 
     | 
    
         
            +
                      :page_size => 1,
         
     | 
| 
      
 73 
     | 
    
         
            +
                      :total_items => 2
         
     | 
| 
      
 74 
     | 
    
         
            +
                    ) do |page_num|
         
     | 
| 
      
 75 
     | 
    
         
            +
                    "contents of page #{page_num}"
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end      
         
     | 
| 
      
 77 
     | 
    
         
            +
                  collection.next_page.should == "contents of page 2"
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
                
         
     | 
| 
      
 80 
     | 
    
         
            +
                it "returns nil if on last page" do
         
     | 
| 
      
 81 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 82 
     | 
    
         
            +
                      :current_page_number => 2,
         
     | 
| 
      
 83 
     | 
    
         
            +
                      :page_size => 2,
         
     | 
| 
      
 84 
     | 
    
         
            +
                      :total_items => 4
         
     | 
| 
      
 85 
     | 
    
         
            +
                    )      
         
     | 
| 
      
 86 
     | 
    
         
            +
                  collection.next_page.should == nil
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
              
         
     | 
| 
      
 90 
     | 
    
         
            +
              describe "next_page_number" do
         
     | 
| 
      
 91 
     | 
    
         
            +
                it "returns the next page number when not on the last page" do
         
     | 
| 
      
 92 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 93 
     | 
    
         
            +
                    :current_page_number => 2,
         
     | 
| 
      
 94 
     | 
    
         
            +
                    :page_size => 1,
         
     | 
| 
      
 95 
     | 
    
         
            +
                    :total_items => 50
         
     | 
| 
      
 96 
     | 
    
         
            +
                  )
         
     | 
| 
      
 97 
     | 
    
         
            +
                  collection.next_page_number.should == 3
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
                
         
     | 
| 
      
 100 
     | 
    
         
            +
                it "returns nil when on the last page" do
         
     | 
| 
      
 101 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 102 
     | 
    
         
            +
                    :current_page_number => 1,
         
     | 
| 
      
 103 
     | 
    
         
            +
                    :page_size => 1,
         
     | 
| 
      
 104 
     | 
    
         
            +
                    :total_items => 1
         
     | 
| 
      
 105 
     | 
    
         
            +
                  )
         
     | 
| 
      
 106 
     | 
    
         
            +
                  collection.next_page_number.should == nil      
         
     | 
| 
      
 107 
     | 
    
         
            +
                end
         
     | 
| 
      
 108 
     | 
    
         
            +
              end
         
     | 
| 
      
 109 
     | 
    
         
            +
              
         
     | 
| 
      
 110 
     | 
    
         
            +
              describe "total_pages" do
         
     | 
| 
      
 111 
     | 
    
         
            +
                it "calculates the total number of pages when total items is not evenly divisible by page size" do
         
     | 
| 
      
 112 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 113 
     | 
    
         
            +
                    :page_size => 5,
         
     | 
| 
      
 114 
     | 
    
         
            +
                    :total_items => 13
         
     | 
| 
      
 115 
     | 
    
         
            +
                  )
         
     | 
| 
      
 116 
     | 
    
         
            +
                  collection.total_pages.should == 3
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                it "calculates the total number of pages when total items is not evenly divisible by page size" do
         
     | 
| 
      
 120 
     | 
    
         
            +
                  collection = Braintree::PagedCollection.new(
         
     | 
| 
      
 121 
     | 
    
         
            +
                    :page_size => 5,
         
     | 
| 
      
 122 
     | 
    
         
            +
                    :total_items => 20
         
     | 
| 
      
 123 
     | 
    
         
            +
                  )
         
     | 
| 
      
 124 
     | 
    
         
            +
                  collection.total_pages.should == 4
         
     | 
| 
      
 125 
     | 
    
         
            +
                end
         
     | 
| 
      
 126 
     | 
    
         
            +
              end
         
     | 
| 
      
 127 
     | 
    
         
            +
              
         
     | 
| 
      
 128 
     | 
    
         
            +
            end
         
     |