braintree 4.24.0 → 4.26.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.
- checksums.yaml +4 -4
- data/lib/braintree/apple_pay_card.rb +1 -0
- data/lib/braintree/bin_data.rb +2 -1
- data/lib/braintree/credit_card.rb +6 -5
- data/lib/braintree/customer_session_gateway.rb +194 -0
- data/lib/braintree/error_codes.rb +41 -0
- data/lib/braintree/error_result.rb +1 -1
- data/lib/braintree/errors.rb +2 -1
- data/lib/braintree/gateway.rb +8 -0
- data/lib/braintree/google_pay_card.rb +1 -0
- data/lib/braintree/graphql/enums/recommendations.rb +7 -0
- data/lib/braintree/graphql/enums/recommended_payment_option.rb +8 -0
- data/lib/braintree/graphql/inputs/create_customer_session_input.rb +35 -0
- data/lib/braintree/graphql/inputs/customer_recommendations_input.rb +41 -0
- data/lib/braintree/graphql/inputs/customer_session_input.rb +39 -0
- data/lib/braintree/graphql/inputs/phone_input.rb +32 -0
- data/lib/braintree/graphql/inputs/update_customer_session_input.rb +37 -0
- data/lib/braintree/graphql/types/customer_recommendations_payload.rb +32 -0
- data/lib/braintree/graphql/types/payment_options.rb +33 -0
- data/lib/braintree/graphql/unions/customer_recommendations.rb +34 -0
- data/lib/braintree/graphql_client.rb +16 -0
- data/lib/braintree/meta_checkout_card.rb +6 -5
- data/lib/braintree/meta_checkout_token.rb +6 -5
- data/lib/braintree/paypal_payment_resource.rb +22 -0
- data/lib/braintree/paypal_payment_resource_gateway.rb +36 -0
- data/lib/braintree/successful_result.rb +2 -0
- data/lib/braintree/test/credit_card.rb +1 -0
- data/lib/braintree/transaction/apple_pay_details.rb +1 -0
- data/lib/braintree/transaction/credit_card_details.rb +12 -10
- data/lib/braintree/transaction/google_pay_details.rb +11 -10
- data/lib/braintree/transaction/meta_checkout_card_details.rb +5 -2
- data/lib/braintree/transaction/meta_checkout_token_details.rb +6 -2
- data/lib/braintree/transaction/visa_checkout_card_details.rb +5 -2
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/visa_checkout_card.rb +5 -5
- data/lib/braintree.rb +13 -0
- data/spec/integration/braintree/credit_card_spec.rb +12 -0
- data/spec/integration/braintree/credit_card_verification_spec.rb +24 -0
- data/spec/integration/braintree/customer_session_spec.rb +143 -0
- data/spec/integration/braintree/customer_spec.rb +22 -6
- data/spec/integration/braintree/payment_method_nonce_spec.rb +11 -0
- data/spec/integration/braintree/paypal_payment_resource_spec.rb +141 -0
- data/spec/integration/braintree/transaction_spec.rb +15 -0
- data/spec/unit/braintree/apple_pay_card_spec.rb +1 -0
- data/spec/unit/braintree/credit_card_spec.rb +5 -0
- data/spec/unit/braintree/customer_session_gateway_spec.rb +120 -0
- data/spec/unit/braintree/google_pay_card_spec.rb +8 -0
- data/spec/unit/braintree/graphql/create_customer_session_input_spec.rb +81 -0
- data/spec/unit/braintree/graphql/customer_recommendations_input_spec.rb +110 -0
- data/spec/unit/braintree/graphql/customer_session_input_spec.rb +81 -0
- data/spec/unit/braintree/graphql/phone_input_spec.rb +51 -0
- data/spec/unit/braintree/graphql/update_customer_session_input_spec.rb +93 -0
- data/spec/unit/braintree/graphql_client_spec.rb +37 -0
- data/spec/unit/braintree/meta_checkout_card_spec.rb +53 -51
- data/spec/unit/braintree/meta_checkout_token_spec.rb +3 -1
- data/spec/unit/braintree/payment_method_nonce_spec.rb +4 -1
- data/spec/unit/braintree/paypal_payment_resource_spec.rb +125 -0
- data/spec/unit/braintree/transaction/apple_pay_details_spec.rb +8 -0
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +2 -1
- data/spec/unit/braintree/transaction/google_pay_details_spec.rb +8 -0
- data/spec/unit/braintree/transaction/meta_checkout_card_details_spec.rb +8 -0
- data/spec/unit/braintree/transaction/meta_checkout_token_details_spec.rb +8 -0
- data/spec/unit/braintree/transaction/visa_checkout_card_details_spec.rb +8 -0
- data/spec/unit/braintree/transaction_spec.rb +2 -0
- data/spec/unit/braintree/visa_checkout_card_spec.rb +8 -0
- data/spec/unit/credit_card_details_spec.rb +8 -0
- metadata +33 -2
| @@ -0,0 +1,93 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Braintree::UpdateCustomerSessionInput do
         | 
| 5 | 
            +
              let(:input_data) do
         | 
| 6 | 
            +
              {
         | 
| 7 | 
            +
                merchant_account_id: "merchant-account-id",
         | 
| 8 | 
            +
                session_id: "session-id",
         | 
| 9 | 
            +
                customer: {email: "test@example.com"}
         | 
| 10 | 
            +
              }
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
              describe "#initialize" do
         | 
| 13 | 
            +
                it "initializes with attributes" do
         | 
| 14 | 
            +
                  input = Braintree::UpdateCustomerSessionInput.new(input_data)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  expect(input.attrs).to eq(input_data.keys)
         | 
| 17 | 
            +
                  expect(input.merchant_account_id).to eq("merchant-account-id")
         | 
| 18 | 
            +
                  expect(input.session_id).to eq("session-id")
         | 
| 19 | 
            +
                  expect(input.customer).to be_a(Braintree::CustomerSessionInput)
         | 
| 20 | 
            +
                  expect(input.customer.email).to eq("test@example.com")
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it "disallows nil session id" do
         | 
| 24 | 
            +
                  attributes = {
         | 
| 25 | 
            +
                    merchant_account_id: "merchant-account-id",
         | 
| 26 | 
            +
                  }
         | 
| 27 | 
            +
                  expect do
         | 
| 28 | 
            +
                    Braintree::UpdateCustomerSessionInput.new(attributes)
         | 
| 29 | 
            +
                  end.to raise_error(ArgumentError, "Expected hash to contain a :session_id")
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                it "handles nil customer" do
         | 
| 33 | 
            +
                  attributes = {
         | 
| 34 | 
            +
                    merchant_account_id: "merchant-account-id",
         | 
| 35 | 
            +
                    session_id: "session-id",
         | 
| 36 | 
            +
                  }
         | 
| 37 | 
            +
                  input = Braintree::UpdateCustomerSessionInput.new(attributes)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  expect(input.customer).to be_nil
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
             | 
| 44 | 
            +
              describe "#inspect" do
         | 
| 45 | 
            +
                  it "returns a string representation of the object" do
         | 
| 46 | 
            +
                    input = Braintree::UpdateCustomerSessionInput.new(input_data)
         | 
| 47 | 
            +
                    expected_string = "#<Braintree::UpdateCustomerSessionInput merchant_account_id:\"merchant-account-id\" session_id:\"session-id\" customer:#<Braintree::CustomerSessionInput email:\"test@example.com\">>"
         | 
| 48 | 
            +
                    expect(input.inspect).to eq(expected_string)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  it "handles nil values" do
         | 
| 53 | 
            +
                    attributes = {
         | 
| 54 | 
            +
                      merchant_account_id: "merchant-account-id",
         | 
| 55 | 
            +
                      session_id: "session-id",
         | 
| 56 | 
            +
                    }
         | 
| 57 | 
            +
                    input = Braintree::UpdateCustomerSessionInput.new(attributes)
         | 
| 58 | 
            +
                    expected_string = "#<Braintree::UpdateCustomerSessionInput merchant_account_id:\"merchant-account-id\" session_id:\"session-id\">"
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    expect(input.inspect).to eq(expected_string)
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              describe "#to_graphql_variables" do
         | 
| 66 | 
            +
                it "converts the input to graphql variables" do
         | 
| 67 | 
            +
                  input = Braintree::UpdateCustomerSessionInput.new(input_data)
         | 
| 68 | 
            +
                  expected_variables = {
         | 
| 69 | 
            +
                    "merchantAccountId" => "merchant-account-id",
         | 
| 70 | 
            +
                    "sessionId" => "session-id",
         | 
| 71 | 
            +
                    "customer" => {"email" => "test@example.com"},
         | 
| 72 | 
            +
                  }
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  expect(input.to_graphql_variables).to eq(expected_variables)
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                it "handles nil values" do
         | 
| 78 | 
            +
                  attributes = {
         | 
| 79 | 
            +
                    merchant_account_id: "merchant-account-id",
         | 
| 80 | 
            +
                    session_id: "session-id",
         | 
| 81 | 
            +
                  }
         | 
| 82 | 
            +
                  input = Braintree::UpdateCustomerSessionInput.new(attributes)
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  expected_variables = {
         | 
| 85 | 
            +
                    "merchantAccountId" => "merchant-account-id",
         | 
| 86 | 
            +
                    "sessionId" => "session-id",
         | 
| 87 | 
            +
                  }
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  expect(input.to_graphql_variables).to eq(expected_variables)
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::GraphQLClient do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              describe ".get_validation_errors" do
         | 
| 6 | 
            +
                it "returns nil if no errors" do
         | 
| 7 | 
            +
                  expect(Braintree::GraphQLClient.get_validation_errors({})).to be_nil
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                it "returns nil if errors is not an array" do
         | 
| 11 | 
            +
                  expect(Braintree::GraphQLClient.get_validation_errors({:errors => "string"})).to be_nil
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                it "returns validation errors" do
         | 
| 15 | 
            +
                  response = {
         | 
| 16 | 
            +
                    :errors => [
         | 
| 17 | 
            +
                      {:message => "Invalid input", :extensions => {:legacyCode => "81803"}},
         | 
| 18 | 
            +
                      {:message => "Another error", :extensions => {:legacyCode => "91903"}}
         | 
| 19 | 
            +
                    ]
         | 
| 20 | 
            +
                  }
         | 
| 21 | 
            +
                  expected_errors = {
         | 
| 22 | 
            +
                    :errors => [
         | 
| 23 | 
            +
                      {:attribute => "", :code => "81803", :message => "Invalid input"},
         | 
| 24 | 
            +
                      {:attribute => "", :code => "91903", :message => "Another error"}
         | 
| 25 | 
            +
                    ]
         | 
| 26 | 
            +
                  }
         | 
| 27 | 
            +
                  expect(Braintree::GraphQLClient.get_validation_errors(response)).to eq(expected_errors)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
                it "handles missing legacyCode" do
         | 
| 32 | 
            +
                  response = {:errors => [{:message => "Invalid input"}]}
         | 
| 33 | 
            +
                  expected_errors = {:errors => [{:attribute => "", :code => nil, :message => "Invalid input"}]}
         | 
| 34 | 
            +
                  expect(Braintree::GraphQLClient.get_validation_errors(response)).to eq(expected_errors)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| @@ -1,60 +1,62 @@ | |
| 1 1 | 
             
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe Braintree::MetaCheckoutCard do
         | 
| 4 | 
            -
             | 
| 4 | 
            +
              let(:attributes) do {
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                 | 
| 25 | 
            -
             | 
| 6 | 
            +
                :bin => "abc1234",
         | 
| 7 | 
            +
                :card_type => "Visa",
         | 
| 8 | 
            +
                :cardholder_name => "Meta Checkout Card CardHolder",
         | 
| 9 | 
            +
                :commercial => "NO",
         | 
| 10 | 
            +
                :container_id => "a-container-id",
         | 
| 11 | 
            +
                :country_of_issuance => "US",
         | 
| 12 | 
            +
                :created_at => "2023-05-05T21:28:37Z",
         | 
| 13 | 
            +
                :debit => "NO",
         | 
| 14 | 
            +
                :durbin_regulated => "NO",
         | 
| 15 | 
            +
                :expiration_month => "05",
         | 
| 16 | 
            +
                :expiration_year => "2024",
         | 
| 17 | 
            +
                :healthcare => "NO",
         | 
| 18 | 
            +
                :last_4 => "1234",
         | 
| 19 | 
            +
                :payroll => "NO",
         | 
| 20 | 
            +
                :prepaid => "NO",
         | 
| 21 | 
            +
                :prepaid_reloadable => "NO",
         | 
| 22 | 
            +
                :token => "token1",
         | 
| 23 | 
            +
                :unique_number_identifier => "abc1234",
         | 
| 24 | 
            +
                :updated_at => "2023-05-05T21:28:37Z"
         | 
| 25 | 
            +
              }
         | 
| 26 | 
            +
              end
         | 
| 26 27 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 28 | 
            +
              describe "unit tests" do
         | 
| 29 | 
            +
                it "initializes with the correct attributes" do
         | 
| 30 | 
            +
                  card = Braintree::MetaCheckoutCard._new(:gateway, attributes)
         | 
| 30 31 |  | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 32 | 
            +
                  card.bin.should == "abc1234"
         | 
| 33 | 
            +
                  card.card_type.should == "Visa"
         | 
| 34 | 
            +
                  card.cardholder_name.should == "Meta Checkout Card CardHolder"
         | 
| 35 | 
            +
                  card.commercial == "NO"
         | 
| 36 | 
            +
                  card.container_id.should == "a-container-id"
         | 
| 37 | 
            +
                  card.country_of_issuance == "US"
         | 
| 38 | 
            +
                  card.created_at == "2023-05-05T21:28:37Z"
         | 
| 39 | 
            +
                  card.debit == "NO"
         | 
| 40 | 
            +
                  card.expiration_month.should == "05"
         | 
| 41 | 
            +
                  card.expiration_year.should == "2024"
         | 
| 42 | 
            +
                  card.healthcare == "NO"
         | 
| 43 | 
            +
                  card.last_4.should == "1234"
         | 
| 44 | 
            +
                  card.payroll == "NO"
         | 
| 45 | 
            +
                  card.prepaid == "NO"
         | 
| 46 | 
            +
                  card.prepaid_reloadable == "NO"
         | 
| 47 | 
            +
                  card.token == "token1"
         | 
| 48 | 
            +
                  card.unique_number_identifier == "abc1234"
         | 
| 49 | 
            +
                  card.updated_at == "2023-05-05T21:28:37Z"
         | 
| 50 | 
            +
                end
         | 
| 49 51 |  | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 52 | 
            +
                it "sets expiration date correctly" do
         | 
| 53 | 
            +
                  card = Braintree::MetaCheckoutCard._new(:gateway, attributes)
         | 
| 54 | 
            +
                  card.expiration_date.should == "05/2024"
         | 
| 55 | 
            +
                end
         | 
| 54 56 |  | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
                    end
         | 
| 57 | 
            +
                it "masks the card number correctly" do
         | 
| 58 | 
            +
                  card = Braintree::MetaCheckoutCard._new(:gateway, attributes)
         | 
| 59 | 
            +
                  card.masked_number.should == "abc1234******1234"
         | 
| 59 60 | 
             
                end
         | 
| 60 | 
            -
            end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
            end
         | 
| @@ -17,6 +17,7 @@ describe Braintree::MetaCheckoutToken do | |
| 17 17 | 
             
                    :last_4 => "1234",
         | 
| 18 18 | 
             
                    :payroll => "NO",
         | 
| 19 19 | 
             
                    :prepaid => "NO",
         | 
| 20 | 
            +
                    :prepaid_reloadable => "NO",
         | 
| 20 21 | 
             
                    :token => "token1",
         | 
| 21 22 | 
             
                    :unique_number_identifier => "abc1234",
         | 
| 22 23 | 
             
                    :updated_at => "2023-05-05T21:28:37Z",
         | 
| @@ -40,6 +41,7 @@ describe Braintree::MetaCheckoutToken do | |
| 40 41 | 
             
                        card.debit == "NO"
         | 
| 41 42 | 
             
                        card.payroll == "NO"
         | 
| 42 43 | 
             
                        card.prepaid == "NO"
         | 
| 44 | 
            +
                        card.prepaid_reloadable == "NO"
         | 
| 43 45 | 
             
                        card.healthcare == "NO"
         | 
| 44 46 | 
             
                        card.token == "token1"
         | 
| 45 47 | 
             
                        card.unique_number_identifier == "abc1234"
         | 
| @@ -60,4 +62,4 @@ describe Braintree::MetaCheckoutToken do | |
| 60 62 | 
             
                        card.masked_number.should == "abc1234******1234"
         | 
| 61 63 | 
             
                    end
         | 
| 62 64 | 
             
                end
         | 
| 63 | 
            -
            end
         | 
| 65 | 
            +
            end
         | 
| @@ -15,7 +15,8 @@ describe Braintree::PaymentMethodNonce do | |
| 15 15 | 
             
                    :liability_shifted => false
         | 
| 16 16 | 
             
                  },
         | 
| 17 17 | 
             
                  :bin_data => {
         | 
| 18 | 
            -
                    :country_of_issuance => "USA"
         | 
| 18 | 
            +
                    :country_of_issuance => "USA",
         | 
| 19 | 
            +
                    :prepaid_reloadable => "Yes"
         | 
| 19 20 | 
             
                  },
         | 
| 20 21 | 
             
                )
         | 
| 21 22 | 
             
              }
         | 
| @@ -29,6 +30,8 @@ describe Braintree::PaymentMethodNonce do | |
| 29 30 | 
             
                  expect(payment_method_nonce.three_d_secure_info.liability_shift_possible).to be false
         | 
| 30 31 | 
             
                  expect(payment_method_nonce.three_d_secure_info.liability_shifted).to be false
         | 
| 31 32 | 
             
                  expect(payment_method_nonce.bin_data.country_of_issuance).to eq("USA")
         | 
| 33 | 
            +
                  expect(payment_method_nonce.bin_data.prepaid_reloadable).to eq("Yes")
         | 
| 34 | 
            +
             | 
| 32 35 | 
             
                end
         | 
| 33 36 | 
             
              end
         | 
| 34 37 |  | 
| @@ -0,0 +1,125 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::PayPalPaymentResource do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              describe "#update" do
         | 
| 6 | 
            +
                it "successfully updates a paypal payment request" do
         | 
| 7 | 
            +
                    paypal_payment_resource_request = {
         | 
| 8 | 
            +
                            :amount => 55.00,
         | 
| 9 | 
            +
                            :amount_breakdown => {
         | 
| 10 | 
            +
                                :discount => 15_00,
         | 
| 11 | 
            +
                                :handling => 0,
         | 
| 12 | 
            +
                                :insurance => 5_00,
         | 
| 13 | 
            +
                                :item_total => 45_00,
         | 
| 14 | 
            +
                                :shipping => 10_00,
         | 
| 15 | 
            +
                                :shipping_discount => 0,
         | 
| 16 | 
            +
                                :tax_total => 10_00
         | 
| 17 | 
            +
                            },
         | 
| 18 | 
            +
                            :currency_iso_code => "USD",
         | 
| 19 | 
            +
                            :description => "This is a test",
         | 
| 20 | 
            +
                            :custom_field => "0437",
         | 
| 21 | 
            +
                            :line_items => [{
         | 
| 22 | 
            +
                                :description => "Shoes",
         | 
| 23 | 
            +
                                :image_url => "https://example.com/products/23434/pic.png",
         | 
| 24 | 
            +
                                :kind => "debit",
         | 
| 25 | 
            +
                                :name => "Name #1",
         | 
| 26 | 
            +
                                :product_code => "23434",
         | 
| 27 | 
            +
                                :quantity => 1_00,
         | 
| 28 | 
            +
                                :total_amount => 45_00,
         | 
| 29 | 
            +
                                :unit_amount => 45_00,
         | 
| 30 | 
            +
                                :unit_tax_amount => 10_00,
         | 
| 31 | 
            +
                                :url =>  "https://example.com/products/23434",
         | 
| 32 | 
            +
                                }],
         | 
| 33 | 
            +
                            :order_id => "order-123456789",
         | 
| 34 | 
            +
                            :payee_email => "bt_buyer_us@paypal.com",
         | 
| 35 | 
            +
                            :payment_method_nonce => "1234",
         | 
| 36 | 
            +
                            :shipping => {
         | 
| 37 | 
            +
                                :country_name => "United States",
         | 
| 38 | 
            +
                                :country_code_alpha2 => "US",
         | 
| 39 | 
            +
                                :country_code_alpha3 => "USA",
         | 
| 40 | 
            +
                                :country_code_numeric => "484",
         | 
| 41 | 
            +
                                :extended_address => "Apt. #1",
         | 
| 42 | 
            +
                                :first_name => "John",
         | 
| 43 | 
            +
                                :international_phone => {
         | 
| 44 | 
            +
                                    :country_code => "1",
         | 
| 45 | 
            +
                                    :national_number => "4081111111",
         | 
| 46 | 
            +
                                },
         | 
| 47 | 
            +
                                :last_name => "Doe",
         | 
| 48 | 
            +
                                :locality => "Chicago",
         | 
| 49 | 
            +
                                :postal_code => "60618",
         | 
| 50 | 
            +
                                :region => "IL",
         | 
| 51 | 
            +
                                :street_address => "123 Division Street",
         | 
| 52 | 
            +
                            },
         | 
| 53 | 
            +
                            :shipping_options => [{
         | 
| 54 | 
            +
                                :amount => "10.00",
         | 
| 55 | 
            +
                                :id => "option1",
         | 
| 56 | 
            +
                                :label => "fast",
         | 
| 57 | 
            +
                                :selected => true,
         | 
| 58 | 
            +
                                :type =>  "SHIPPING"
         | 
| 59 | 
            +
                            }]
         | 
| 60 | 
            +
                }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    unknown_response = {:payment_method_nonce => {}}
         | 
| 63 | 
            +
                    http_instance = double(:put => unknown_response)
         | 
| 64 | 
            +
                    allow(Braintree::Http).to receive(:new).and_return(http_instance)
         | 
| 65 | 
            +
                    result = Braintree::PayPalPaymentResource.update(paypal_payment_resource_request)
         | 
| 66 | 
            +
                    expect(result).to be_success
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
                it "should match the update signature" do
         | 
| 69 | 
            +
                    expect(Braintree::PayPalPaymentResourceGateway._update_signature).to match([
         | 
| 70 | 
            +
                        :amount,
         | 
| 71 | 
            +
                        {:amount_breakdown => [
         | 
| 72 | 
            +
                            :discount,
         | 
| 73 | 
            +
                            :handling,
         | 
| 74 | 
            +
                            :insurance,
         | 
| 75 | 
            +
                            :item_total,
         | 
| 76 | 
            +
                            :shipping,
         | 
| 77 | 
            +
                            :shipping_discount,
         | 
| 78 | 
            +
                            :tax_total
         | 
| 79 | 
            +
                        ]},
         | 
| 80 | 
            +
                        :currency_iso_code,
         | 
| 81 | 
            +
                        :custom_field,
         | 
| 82 | 
            +
                        :description,
         | 
| 83 | 
            +
                        {:line_items => [
         | 
| 84 | 
            +
                            :description,
         | 
| 85 | 
            +
                            :image_url,
         | 
| 86 | 
            +
                            :kind,
         | 
| 87 | 
            +
                            :name,
         | 
| 88 | 
            +
                            :product_code,
         | 
| 89 | 
            +
                            :quantity,
         | 
| 90 | 
            +
                            :total_amount,
         | 
| 91 | 
            +
                            :unit_amount,
         | 
| 92 | 
            +
                            :unit_tax_amount,
         | 
| 93 | 
            +
                            :url,
         | 
| 94 | 
            +
                            ]},
         | 
| 95 | 
            +
                        :order_id,
         | 
| 96 | 
            +
                        :payee_email,
         | 
| 97 | 
            +
                        :payment_method_nonce,
         | 
| 98 | 
            +
                        {:shipping => [
         | 
| 99 | 
            +
                            :country_name,
         | 
| 100 | 
            +
                            :country_code_alpha2,
         | 
| 101 | 
            +
                            :country_code_alpha3,
         | 
| 102 | 
            +
                            :country_code_numeric,
         | 
| 103 | 
            +
                            :extended_address,
         | 
| 104 | 
            +
                            :first_name,
         | 
| 105 | 
            +
                            {:international_phone => [
         | 
| 106 | 
            +
                                :country_code,
         | 
| 107 | 
            +
                                :national_number]},
         | 
| 108 | 
            +
                            :last_name,
         | 
| 109 | 
            +
                            :locality,
         | 
| 110 | 
            +
                            :postal_code,
         | 
| 111 | 
            +
                            :region,
         | 
| 112 | 
            +
                            :street_address,
         | 
| 113 | 
            +
                        ]},
         | 
| 114 | 
            +
                        {:shipping_options => [
         | 
| 115 | 
            +
                            :amount,
         | 
| 116 | 
            +
                            :id,
         | 
| 117 | 
            +
                            :label,
         | 
| 118 | 
            +
                            :selected,
         | 
| 119 | 
            +
                            :type
         | 
| 120 | 
            +
                        ]},
         | 
| 121 | 
            +
                    ],
         | 
| 122 | 
            +
                    )
         | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::ApplePayDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::ApplePayDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -24,6 +24,7 @@ describe Braintree::Transaction::CreditCardDetails do | |
| 24 24 | 
             
                    :customer_location => "US",
         | 
| 25 25 | 
             
                    :healthcare => "No",
         | 
| 26 26 | 
             
                    :prepaid => "Yes",
         | 
| 27 | 
            +
                    :prepaid_reloadable => "Yes",
         | 
| 27 28 | 
             
                    :durbin_regulated => "No",
         | 
| 28 29 | 
             
                    :debit => "Yes",
         | 
| 29 30 | 
             
                    :commercial => "Unknown",
         | 
| @@ -34,7 +35,7 @@ describe Braintree::Transaction::CreditCardDetails do | |
| 34 35 | 
             
                    :image_url => "example.com/visa.png",
         | 
| 35 36 | 
             
                    :unique_number_identifier => "abc123",
         | 
| 36 37 | 
             
                  )
         | 
| 37 | 
            -
                  expect(details.inspect).to eq(%(#<token: "token", bin: "123456", last_4: "6789", card_type: "Visa",  | 
| 38 | 
            +
                  expect(details.inspect).to eq(%(#<token: "token", bin: "123456", last_4: "6789", card_type: "Visa", commercial: "Unknown", country_of_issuance: "Lilliput", customer_location: "US", debit: "Yes", durbin_regulated: "No", expiration_date: "05/2012", healthcare: "No", image_url: "example.com/visa.png", issuing_bank: "Gulliver Bank", payroll: "Unknown", prepaid: "Yes", prepaid_reloadable: "Yes", product_id: "Unknown", cardholder_name: "The Cardholder", unique_number_identifier: "abc123">))
         | 
| 38 39 | 
             
                end
         | 
| 39 40 | 
             
              end
         | 
| 40 41 |  | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::GooglePayDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::GooglePayDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::MetaCheckoutCardDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::MetaCheckoutCardDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::MetaCheckoutTokenDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::MetaCheckoutTokenDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::VisaCheckoutCardDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::VisaCheckoutCardDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -119,6 +119,7 @@ describe Braintree::Transaction do | |
| 119 119 | 
             
                      :expiration_year => "2009",
         | 
| 120 120 | 
             
                      :customer_location => "US",
         | 
| 121 121 | 
             
                      :prepaid => "Yes",
         | 
| 122 | 
            +
                      :prepaid_reloadable => "Yes",
         | 
| 122 123 | 
             
                      :healthcare => "Yes",
         | 
| 123 124 | 
             
                      :durbin_regulated => "Yes",
         | 
| 124 125 | 
             
                      :debit => "Yes",
         | 
| @@ -137,6 +138,7 @@ describe Braintree::Transaction do | |
| 137 138 | 
             
                  expect(transaction.credit_card_details.expiration_year).to eq("2009")
         | 
| 138 139 | 
             
                  expect(transaction.credit_card_details.customer_location).to eq("US")
         | 
| 139 140 | 
             
                  expect(transaction.credit_card_details.prepaid).to eq(Braintree::CreditCard::Prepaid::Yes)
         | 
| 141 | 
            +
                  expect(transaction.credit_card_details.prepaid_reloadable).to eq(Braintree::CreditCard::PrepaidReloadable::Yes)
         | 
| 140 142 | 
             
                  expect(transaction.credit_card_details.healthcare).to eq(Braintree::CreditCard::Healthcare::Yes)
         | 
| 141 143 | 
             
                  expect(transaction.credit_card_details.durbin_regulated).to eq(Braintree::CreditCard::DurbinRegulated::Yes)
         | 
| 142 144 | 
             
                  expect(transaction.credit_card_details.debit).to eq(Braintree::CreditCard::Debit::Yes)
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::VisaCheckoutCard do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::VisaCheckoutCard._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Braintree::CreditCardDetails do
         | 
| 4 | 
            +
              it "initializes prepaid reloadable correctly" do
         | 
| 5 | 
            +
                card = Braintree::CreditCardDetails._new(:gateway, {:prepaid_reloadable => "No"})
         | 
| 6 | 
            +
                expect(card.prepaid_reloadable).to eq("No")
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: braintree
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4. | 
| 4 | 
            +
              version: 4.26.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Braintree
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2025- | 
| 11 | 
            +
            date: 2025-03-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: builder
         | 
| @@ -77,6 +77,7 @@ files: | |
| 77 77 | 
             
            - lib/braintree/customer.rb
         | 
| 78 78 | 
             
            - lib/braintree/customer_gateway.rb
         | 
| 79 79 | 
             
            - lib/braintree/customer_search.rb
         | 
| 80 | 
            +
            - lib/braintree/customer_session_gateway.rb
         | 
| 80 81 | 
             
            - lib/braintree/descriptor.rb
         | 
| 81 82 | 
             
            - lib/braintree/digest.rb
         | 
| 82 83 | 
             
            - lib/braintree/disbursement.rb
         | 
| @@ -108,6 +109,16 @@ files: | |
| 108 109 | 
             
            - lib/braintree/gateway.rb
         | 
| 109 110 | 
             
            - lib/braintree/google_pay_card.rb
         | 
| 110 111 | 
             
            - lib/braintree/granted_payment_instrument_update.rb
         | 
| 112 | 
            +
            - lib/braintree/graphql/enums/recommendations.rb
         | 
| 113 | 
            +
            - lib/braintree/graphql/enums/recommended_payment_option.rb
         | 
| 114 | 
            +
            - lib/braintree/graphql/inputs/create_customer_session_input.rb
         | 
| 115 | 
            +
            - lib/braintree/graphql/inputs/customer_recommendations_input.rb
         | 
| 116 | 
            +
            - lib/braintree/graphql/inputs/customer_session_input.rb
         | 
| 117 | 
            +
            - lib/braintree/graphql/inputs/phone_input.rb
         | 
| 118 | 
            +
            - lib/braintree/graphql/inputs/update_customer_session_input.rb
         | 
| 119 | 
            +
            - lib/braintree/graphql/types/customer_recommendations_payload.rb
         | 
| 120 | 
            +
            - lib/braintree/graphql/types/payment_options.rb
         | 
| 121 | 
            +
            - lib/braintree/graphql/unions/customer_recommendations.rb
         | 
| 111 122 | 
             
            - lib/braintree/graphql_client.rb
         | 
| 112 123 | 
             
            - lib/braintree/http.rb
         | 
| 113 124 | 
             
            - lib/braintree/local_payment_completed.rb
         | 
| @@ -141,6 +152,8 @@ files: | |
| 141 152 | 
             
            - lib/braintree/payment_method_parser.rb
         | 
| 142 153 | 
             
            - lib/braintree/paypal_account.rb
         | 
| 143 154 | 
             
            - lib/braintree/paypal_account_gateway.rb
         | 
| 155 | 
            +
            - lib/braintree/paypal_payment_resource.rb
         | 
| 156 | 
            +
            - lib/braintree/paypal_payment_resource_gateway.rb
         | 
| 144 157 | 
             
            - lib/braintree/plan.rb
         | 
| 145 158 | 
             
            - lib/braintree/plan_gateway.rb
         | 
| 146 159 | 
             
            - lib/braintree/processor_response_types.rb
         | 
| @@ -239,6 +252,7 @@ files: | |
| 239 252 | 
             
            - spec/integration/braintree/credit_card_verification_search_spec.rb
         | 
| 240 253 | 
             
            - spec/integration/braintree/credit_card_verification_spec.rb
         | 
| 241 254 | 
             
            - spec/integration/braintree/customer_search_spec.rb
         | 
| 255 | 
            +
            - spec/integration/braintree/customer_session_spec.rb
         | 
| 242 256 | 
             
            - spec/integration/braintree/customer_spec.rb
         | 
| 243 257 | 
             
            - spec/integration/braintree/disbursement_spec.rb
         | 
| 244 258 | 
             
            - spec/integration/braintree/discount_spec.rb
         | 
| @@ -257,6 +271,7 @@ files: | |
| 257 271 | 
             
            - spec/integration/braintree/payment_method_spec.rb
         | 
| 258 272 | 
             
            - spec/integration/braintree/payment_method_us_bank_account_spec.rb
         | 
| 259 273 | 
             
            - spec/integration/braintree/paypal_account_spec.rb
         | 
| 274 | 
            +
            - spec/integration/braintree/paypal_payment_resource_spec.rb
         | 
| 260 275 | 
             
            - spec/integration/braintree/plan_spec.rb
         | 
| 261 276 | 
             
            - spec/integration/braintree/samsung_pay_card_spec.rb
         | 
| 262 277 | 
             
            - spec/integration/braintree/sepa_direct_debit_account_spec.rb
         | 
| @@ -290,6 +305,7 @@ files: | |
| 290 305 | 
             
            - spec/unit/braintree/credit_card_verification_gateway_spec.rb
         | 
| 291 306 | 
             
            - spec/unit/braintree/credit_card_verification_search_spec.rb
         | 
| 292 307 | 
             
            - spec/unit/braintree/credit_card_verification_spec.rb
         | 
| 308 | 
            +
            - spec/unit/braintree/customer_session_gateway_spec.rb
         | 
| 293 309 | 
             
            - spec/unit/braintree/customer_spec.rb
         | 
| 294 310 | 
             
            - spec/unit/braintree/digest_spec.rb
         | 
| 295 311 | 
             
            - spec/unit/braintree/disbursement_spec.rb
         | 
| @@ -304,6 +320,13 @@ files: | |
| 304 320 | 
             
            - spec/unit/braintree/exchange_rate_quote_response_spec.rb
         | 
| 305 321 | 
             
            - spec/unit/braintree/exchange_rate_quote_spec.rb
         | 
| 306 322 | 
             
            - spec/unit/braintree/exchange_rate_spec.rb
         | 
| 323 | 
            +
            - spec/unit/braintree/google_pay_card_spec.rb
         | 
| 324 | 
            +
            - spec/unit/braintree/graphql/create_customer_session_input_spec.rb
         | 
| 325 | 
            +
            - spec/unit/braintree/graphql/customer_recommendations_input_spec.rb
         | 
| 326 | 
            +
            - spec/unit/braintree/graphql/customer_session_input_spec.rb
         | 
| 327 | 
            +
            - spec/unit/braintree/graphql/phone_input_spec.rb
         | 
| 328 | 
            +
            - spec/unit/braintree/graphql/update_customer_session_input_spec.rb
         | 
| 329 | 
            +
            - spec/unit/braintree/graphql_client_spec.rb
         | 
| 307 330 | 
             
            - spec/unit/braintree/http_spec.rb
         | 
| 308 331 | 
             
            - spec/unit/braintree/local_payment_completed_spec.rb
         | 
| 309 332 | 
             
            - spec/unit/braintree/local_payment_expired_spec.rb
         | 
| @@ -321,6 +344,7 @@ files: | |
| 321 344 | 
             
            - spec/unit/braintree/payment_method_nonce_spec.rb
         | 
| 322 345 | 
             
            - spec/unit/braintree/payment_method_spec.rb
         | 
| 323 346 | 
             
            - spec/unit/braintree/paypal_account_spec.rb
         | 
| 347 | 
            +
            - spec/unit/braintree/paypal_payment_resource_spec.rb
         | 
| 324 348 | 
             
            - spec/unit/braintree/resource_collection_spec.rb
         | 
| 325 349 | 
             
            - spec/unit/braintree/risk_data/liability_shift.rb
         | 
| 326 350 | 
             
            - spec/unit/braintree/risk_data_spec.rb
         | 
| @@ -332,14 +356,19 @@ files: | |
| 332 356 | 
             
            - spec/unit/braintree/subscription_spec.rb
         | 
| 333 357 | 
             
            - spec/unit/braintree/successful_result_spec.rb
         | 
| 334 358 | 
             
            - spec/unit/braintree/three_d_secure_info_spec.rb
         | 
| 359 | 
            +
            - spec/unit/braintree/transaction/apple_pay_details_spec.rb
         | 
| 335 360 | 
             
            - spec/unit/braintree/transaction/credit_card_details_spec.rb
         | 
| 336 361 | 
             
            - spec/unit/braintree/transaction/customer_details_spec.rb
         | 
| 337 362 | 
             
            - spec/unit/braintree/transaction/deposit_details_spec.rb
         | 
| 363 | 
            +
            - spec/unit/braintree/transaction/google_pay_details_spec.rb
         | 
| 338 364 | 
             
            - spec/unit/braintree/transaction/installment_spec.rb
         | 
| 339 365 | 
             
            - spec/unit/braintree/transaction/local_payment_details_spec.rb
         | 
| 366 | 
            +
            - spec/unit/braintree/transaction/meta_checkout_card_details_spec.rb
         | 
| 367 | 
            +
            - spec/unit/braintree/transaction/meta_checkout_token_details_spec.rb
         | 
| 340 368 | 
             
            - spec/unit/braintree/transaction/payment_receipt_spec.rb
         | 
| 341 369 | 
             
            - spec/unit/braintree/transaction/paypal_details_spec.rb
         | 
| 342 370 | 
             
            - spec/unit/braintree/transaction/sepa_direct_debit_account_details_spec.rb
         | 
| 371 | 
            +
            - spec/unit/braintree/transaction/visa_checkout_card_details_spec.rb
         | 
| 343 372 | 
             
            - spec/unit/braintree/transaction_gateway_spec.rb
         | 
| 344 373 | 
             
            - spec/unit/braintree/transaction_search_spec.rb
         | 
| 345 374 | 
             
            - spec/unit/braintree/transaction_spec.rb
         | 
| @@ -351,12 +380,14 @@ files: | |
| 351 380 | 
             
            - spec/unit/braintree/validation_error_collection_spec.rb
         | 
| 352 381 | 
             
            - spec/unit/braintree/validation_error_spec.rb
         | 
| 353 382 | 
             
            - spec/unit/braintree/venmo_profile_data_spec.rb
         | 
| 383 | 
            +
            - spec/unit/braintree/visa_checkout_card_spec.rb
         | 
| 354 384 | 
             
            - spec/unit/braintree/webhook_notification_spec.rb
         | 
| 355 385 | 
             
            - spec/unit/braintree/xml/libxml_spec.rb
         | 
| 356 386 | 
             
            - spec/unit/braintree/xml/parser_spec.rb
         | 
| 357 387 | 
             
            - spec/unit/braintree/xml/rexml_spec.rb
         | 
| 358 388 | 
             
            - spec/unit/braintree/xml_spec.rb
         | 
| 359 389 | 
             
            - spec/unit/braintree_spec.rb
         | 
| 390 | 
            +
            - spec/unit/credit_card_details_spec.rb
         | 
| 360 391 | 
             
            - spec/unit/spec_helper.rb
         | 
| 361 392 | 
             
            homepage: https://www.braintreepayments.com/
         | 
| 362 393 | 
             
            licenses:
         |