From b9b2fa7c947c69068b0afd58db13074dee759a7b Mon Sep 17 00:00:00 2001 From: James Wu Date: Tue, 24 Jan 2023 15:41:46 +0900 Subject: [PATCH] Fix error converting String to BigDecimal --- app/models/spree/preference.rb | 3 ++- app/models/spree/preferences/preferable.rb | 2 +- spec/models/spree/preference_spec.rb | 9 +++++++++ spec/models/spree/preferences/preferable_spec.rb | 7 +++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/models/spree/preference.rb b/app/models/spree/preference.rb index dfef2a146d..ea2c63688c 100644 --- a/app/models/spree/preference.rb +++ b/app/models/spree/preference.rb @@ -22,7 +22,8 @@ module Spree when :password self[:value].to_s when :decimal - BigDecimal(self[:value].to_s).round(2, BigDecimal::ROUND_HALF_UP) + BigDecimal(self[:value].to_s, exception: false)&.round(2, BigDecimal::ROUND_HALF_UP) || + self[:value] when :integer self[:value].to_i when :boolean diff --git a/app/models/spree/preferences/preferable.rb b/app/models/spree/preferences/preferable.rb index 2c0f61b2e2..af775ab37d 100644 --- a/app/models/spree/preferences/preferable.rb +++ b/app/models/spree/preferences/preferable.rb @@ -117,7 +117,7 @@ module Spree value.to_s when :decimal value = 0 if value.blank? - BigDecimal(value.to_s).round(2, BigDecimal::ROUND_HALF_UP) + BigDecimal(value.to_s, exception: false)&.round(2, BigDecimal::ROUND_HALF_UP) || value when :integer value.to_i when :boolean diff --git a/spec/models/spree/preference_spec.rb b/spec/models/spree/preference_spec.rb index 780434f768..2eacaddfe7 100644 --- a/spec/models/spree/preference_spec.rb +++ b/spec/models/spree/preference_spec.rb @@ -58,6 +58,15 @@ describe Spree::Preference do expect(pref.value_type).to eq value_type.to_s end + it "incovertible :decimal" do + value_type = :decimal + value = "invalid" + key = "decimal_key" + pref = round_trip_preference(key, value, value_type) + expect(pref.value).to eq value + expect(pref.value_type).to eq value_type.to_s + end + it ":string" do value_type = :string value = "This is a string" diff --git a/spec/models/spree/preferences/preferable_spec.rb b/spec/models/spree/preferences/preferable_spec.rb index 8b7edba9f0..e95e069de0 100644 --- a/spec/models/spree/preferences/preferable_spec.rb +++ b/spec/models/spree/preferences/preferable_spec.rb @@ -165,6 +165,13 @@ describe Spree::Preferences::Preferable do @a.set_preference(:if_decimal, '') expect(@a.preferences[:if_decimal]).to eq 0.0 end + + context "when the value cannot be converted to BigDecimal" do + it "returns the original value" do + @a.set_preference(:if_decimal, "invalid") + expect(@a.preferences[:if_decimal]).to eq "invalid" + end + end end context "converts boolean preferences to boolean values" do