Skip to content
This repository has been archived by the owner on Apr 14, 2023. It is now read-only.

Commit

Permalink
Fix error when saving braintree payment method
Browse files Browse the repository at this point in the history
If you try to update the Braintree payment method in the admin it will
throw an error due to 2 of the preference types being hashes. Solidus
automatically creates a text field for these on the page, which it
populates with the default value: "{}". The code inside
`Spree::Preferences::Preferable` that handles type conversion throws an
error if the input for a preference with type :hash is not a Hash
object.

This change allows for a well-formed hash to be input as a string and
converts it to a Hash before saving the record.
  • Loading branch information
Luuk Veenis committed Jan 9, 2017
1 parent f43fae0 commit aada077
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
14 changes: 14 additions & 0 deletions app/models/solidus_paypal_braintree/gateway.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ class Gateway < ::Spree::PaymentMethod
preference(:merchant_currency_map, :hash, default: {})
preference(:paypal_payee_email_map, :hash, default: {})

def preferred_merchant_currency_map_with_braintree=(value)
self.preferred_merchant_currency_map_without_braintree = to_hash(value)
end
alias_method_chain :preferred_merchant_currency_map=, :braintree

def preferred_paypal_payee_email_map_with_braintree=(value)
self.preferred_paypal_payee_email_map_without_braintree = to_hash(value)
end
alias_method_chain :preferred_paypal_payee_email_map=, :braintree

def method_type
"paypal_braintree"
end
Expand Down Expand Up @@ -204,6 +214,10 @@ def cents(dollars)
dollars.to_money.cents
end

def to_hash(preference_string)
JSON.parse(preference_string.gsub("=>", ":"))
end

def transaction_options(source, options, submit_for_settlement = false)
params = options.select do |key, _|
ALLOWED_BRAINTREE_OPTIONS.include?(key)
Expand Down
29 changes: 29 additions & 0 deletions spec/models/solidus_paypal_braintree/gateway_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,35 @@
end
let(:payment_type) { SolidusPaypalBraintree::Source::PAYPAL }

describe "saving preference hashes as strings" do
subject { gateway.update(update_params) }

context "with valid hash syntax" do
let(:update_params) do
{
preferred_merchant_currency_map: '{"EUR" => "test_merchant_account_id"}',
preferred_paypal_payee_email_map: '{"CAD" => "[email protected]"}'
}
end

it "successfully updates the preference" do
subject
expect(gateway.preferred_merchant_currency_map).to eq({ "EUR" => "test_merchant_account_id" })
expect(gateway.preferred_paypal_payee_email_map).to eq({ "CAD" => "[email protected]" })
end
end

context "with invalid user input" do
let(:update_params) do
{ preferred_merchant_currency_map: '{this_is_not_a_valid_hash}' }
end

it "raise a JSON parser error" do
expect{ subject }.to raise_error(JSON::ParserError)
end
end
end

describe 'making a payment on an order', vcr: { cassette_name: 'gateway/complete' } do
include_context 'order ready for payment'

Expand Down

0 comments on commit aada077

Please sign in to comment.