From 7af26e65795aa34898eec899275946c20a4ee358 Mon Sep 17 00:00:00 2001 From: James Wu Date: Fri, 3 Mar 2023 00:29:22 +0900 Subject: [PATCH] Add errors for invalid input with number localization enabled --- lib/spree/localized_number.rb | 2 +- spec/lib/spree/localized_number_spec.rb | 6 ++++++ .../nested_calculator_validation_spec.rb | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/spree/localized_number.rb b/lib/spree/localized_number.rb index 77270d49ee..773c81ce45 100644 --- a/lib/spree/localized_number.rb +++ b/lib/spree/localized_number.rb @@ -44,7 +44,7 @@ module Spree def self.valid_localizable_number?(number) return true unless number.is_a?(String) || number.respond_to?(:to_d) - return false if number.to_s =~ /[.,]\d{2}[.,]/ + return false if number.to_s =~ /[.,]\d{2}[.,]/ || number.to_s =~ /[^0-9,.]+/ true end diff --git a/spec/lib/spree/localized_number_spec.rb b/spec/lib/spree/localized_number_spec.rb index b13f8ddf6e..bafe0c822d 100644 --- a/spec/lib/spree/localized_number_spec.rb +++ b/spec/lib/spree/localized_number_spec.rb @@ -59,5 +59,11 @@ describe Spree::LocalizedNumber do expect(described_class.valid_localizable_number?(1599.99)).to eql true end end + + context "with letters" do + it "returns false" do + expect(described_class.valid_localizable_number?('invalid')).to eql false + end + end end end diff --git a/spec/models/concerns/nested_calculator_validation_spec.rb b/spec/models/concerns/nested_calculator_validation_spec.rb index ada8e67ce3..7900e26f6d 100644 --- a/spec/models/concerns/nested_calculator_validation_spec.rb +++ b/spec/models/concerns/nested_calculator_validation_spec.rb @@ -45,4 +45,21 @@ shared_examples "a parent model that has a Calculator" do |parent_name| expect(error_messages).not_to include(/^Calculator preferred/) end end + + context "when number localization is enabled and the associated Calculator is invalid" do + let(:localized_parent) do + build(parent_name, calculator: Calculator::FlatRate.new(preferred_amount: "invalid")) + end + + before do + allow(Spree::Config).to receive(:enable_localized_number?).and_return true + localized_parent.valid? + end + + it "adds custom error messages to base" do + expect(localized_parent.errors[:base]).to include( + /#{I18n.t('spree.localized_number.invalid_format')}/ + ) + end + end end