From e43a018dc79f3d3f3bb9465d712390516ce372ae Mon Sep 17 00:00:00 2001 From: David Cook Date: Tue, 4 Apr 2023 14:41:16 +1000 Subject: [PATCH] [wip] Copy each calculator error But we still have the duplicate problem. Wait a minute, it copies them in the same format that I am copying them. So.. I don't need to copy them at all! Now I see that we just needed the right format in the translation file. --- .../concerns/nested_calculator_validation.rb | 17 ++++++++++--- config/locales/en.yml | 22 ++++++++-------- .../nested_calculator_validation_spec.rb | 25 +++++++++++++++++-- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/app/models/concerns/nested_calculator_validation.rb b/app/models/concerns/nested_calculator_validation.rb index cddd3c506a..e85c9b265b 100644 --- a/app/models/concerns/nested_calculator_validation.rb +++ b/app/models/concerns/nested_calculator_validation.rb @@ -4,9 +4,18 @@ module NestedCalculatorValidation extend ActiveSupport::Concern included do - validates_associated :calculator, message: ->(class_obj, obj) { - # Include all error messages from object - obj[:value].errors.full_messages.join("; ") - } + validate :associated_calculator + end + + def associated_calculator + # Calculator errors have already been added, don't know why. + errors.each do |error| + errors.delete(error.attribute) if error.attribute.match? /^calculator./ + end + # Copy errors from associated calculator to the base object, prepending "calculator." to the attribute name. + # wait a minute, that's what the messages were before! we just needed to get the translate keys right! + calculator.tap(&:valid?).errors.each do |error| + errors.import error, attribute: [:calculator, error.attribute].join('.') + end end end diff --git a/config/locales/en.yml b/config/locales/en.yml index d08c02fce5..af0d4718fd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -79,17 +79,17 @@ en: orders_close_at: Close date variant_override: count_on_hand: "On Hand" - spree/calculator: - preferred_flat_percent: "Flat Percent" - preferred_amount: "Amount" - preferred_first_item: "First Item" - preferred_additional_item: "Additional Item Cost" - preferred_max_items: "Max Items" - preferred_minimal_amount: "Minimal Amount" - preferred_normal_amount: "Normal Amount" - preferred_discount_amount: "Discount Amount" - preferred_unit_from_list: "Unit From List" - preferred_per_unit: "Per Unit" + spree/payment_method/calculator: + preferred_flat_percent: "Calculator Flat Percent" + preferred_amount: "Calculator Amount" + preferred_first_item: "Calculator First Item" + preferred_additional_item: "Calculator Additional Item Cost" + preferred_max_items: "Calculator Max Items" + preferred_minimal_amount: "Calculator Minimal Amount" + preferred_normal_amount: "Calculator Normal Amount" + preferred_discount_amount: "Calculator Discount Amount" + preferred_unit_from_list: "Calculator Unit From List" + preferred_per_unit: "Calculator Per Unit" errors: messages: calculator_preferred_value_error: "has an invalid input. Please use only numbers. For example: 10, 5.5, -20" diff --git a/spec/models/concerns/nested_calculator_validation_spec.rb b/spec/models/concerns/nested_calculator_validation_spec.rb index 843d965da0..0cc48673f9 100644 --- a/spec/models/concerns/nested_calculator_validation_spec.rb +++ b/spec/models/concerns/nested_calculator_validation_spec.rb @@ -15,7 +15,7 @@ shared_examples "a parent model that has a Calculator" do |parent_name| context "when the associated Calculator is invalid" do let(:invalid_parent) do - build(parent_name, calculator: Calculator::FlatRate.new(preferred_amount: "invalid")) + build(parent_name, calculator: Calculator::FlexiRate.new(preferred_first_item: "invalid")) end before do @@ -28,7 +28,7 @@ shared_examples "a parent model that has a Calculator" do |parent_name| it "adds custom error messages to base" do error_messages = invalid_parent.errors.full_messages - expect(error_messages).to include(/^Calculator Amount has an invalid input./) + expect(error_messages).to include(/^Calculator First Item has an invalid input./) end it "has the correct number of errors messages" do @@ -45,6 +45,27 @@ shared_examples "a parent model that has a Calculator" do |parent_name| error_messages = invalid_parent.errors.full_messages expect(error_messages).not_to include(/^Calculator preferred/) end + + context "with multiple errors" do + let(:invalid_parent) do + build(parent_name, + calculator: Calculator::FlexiRate.new( + preferred_first_item: "invalid", + preferred_additional_item: "invalid", + )) + end + + it "adds custom error messages to base" do + error_messages = invalid_parent.errors.full_messages + expect(error_messages[0]).to match(/^Calculator Additional Item Cost has an invalid input./) + expect(error_messages[1]).to match(/^Calculator First Item has an invalid input./) + end + + it "has the correct number of errors messages" do + error_messages = invalid_parent.errors.full_messages + expect(error_messages.count).to eq 2 + end + end end context "when number localization is enabled and the associated Calculator is invalid" do