From 30bc4aa5d3e4654776c48360219d9c5fd765b06c Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 13 Oct 2023 14:27:03 +0200 Subject: [PATCH] amelioration(champ.expression_reguliere): pas besoin d'executer la validation du champs expression reguliere dans controller, le validateur le fait sur le champ au moment de sauver le dossier avec le bon context --- app/controllers/users/dossiers_controller.rb | 3 --- app/models/dossier.rb | 14 -------------- app/models/type_de_champ.rb | 11 ++++------- app/validators/expression_reguliere_validator.rb | 11 ++++------- .../champs/expression_reguliere_champ/en.yml | 8 ++++++++ .../champs/expression_reguliere_champ/fr.yml | 8 ++++++++ spec/models/dossier_spec.rb | 10 +++------- 7 files changed, 27 insertions(+), 38 deletions(-) create mode 100644 config/locales/models/champs/expression_reguliere_champ/en.yml create mode 100644 config/locales/models/champs/expression_reguliere_champ/fr.yml diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 09b480260..5a4c047d1 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -540,9 +540,6 @@ module Users @dossier.check_mandatory_and_visible_champs.map do |error_on_champ| errors.import(error_on_champ) end - @dossier.check_expressions_regulieres_champs.map do |error_on_champ| - errors.import(error_on_champ) if error_on_champ.present? - end errors end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 2a534cf62..17931f171 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -1152,20 +1152,6 @@ class Dossier < ApplicationRecord end end - def check_expressions_regulieres_champs - champs_public.filter { _1.expression_reguliere && _1.visible? }.map do |champ| - if champ.value.present? - begin - if !champ.value.match(Regexp.new(champ.expression_reguliere, timeout: 5.0)) - champ.errors.add(:value, :invalid) - end - rescue Regexp::TimeoutError - self.errors.add(:value, I18n.t('errors.messages.evil_regexp')) - end - end - end - end - def demander_un_avis!(avis) log_dossier_operation(avis.claimant, :demander_un_avis, avis) end diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 020d02b16..42eac1d5e 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -618,16 +618,13 @@ class TypeDeChamp < ApplicationRecord def invalid_regexp? return false if expression_reguliere.blank? return false if expression_reguliere_exemple_text.blank? - begin - if expression_reguliere_exemple_text.match?(Regexp.new(expression_reguliere, timeout: 2.0)) - return false - end - rescue Regexp::TimeoutError - self.errors.add(:expression_reguliere, I18n.t('errors.messages.evil_regexp')) - end + return false if expression_reguliere_exemple_text.match?(Regexp.new(expression_reguliere, timeout: 2.0)) self.errors.add(:expression_reguliere_exemple_text, I18n.t('errors.messages.mismatch_regexp')) true + rescue Regexp::TimeoutError + self.errors.add(:expression_reguliere, I18n.t('errors.messages.evil_regexp')) + true rescue RegexpError self.errors.add(:expression_reguliere, I18n.t('errors.messages.syntax_error_regexp')) true diff --git a/app/validators/expression_reguliere_validator.rb b/app/validators/expression_reguliere_validator.rb index 16ea42548..7ba53525a 100644 --- a/app/validators/expression_reguliere_validator.rb +++ b/app/validators/expression_reguliere_validator.rb @@ -1,14 +1,11 @@ - class ExpressionReguliereValidator < ActiveModel::Validator def validate(record) if record.value.present? - begin - if !record.value.match?(Regexp.new(record.expression_reguliere, timeout: 5.0)) - record.errors.add(:value, I18n.t('errors.messages.invalid_regexp', expression_reguliere_error_message: record.expression_reguliere_error_message)) - end - rescue Regexp::TimeoutError - record.errors.add(:expression_reguliere, I18n.t('errors.messages.evil_regexp')) + if !record.value.match?(Regexp.new(record.expression_reguliere, timeout: 5.0)) + record.errors.add(:value, I18n.t('errors.messages.invalid_regexp', expression_reguliere_error_message: record.expression_reguliere_error_message)) end end + rescue Regexp::TimeoutError + record.errors.add(:expression_reguliere, :evil_regexp) end end diff --git a/config/locales/models/champs/expression_reguliere_champ/en.yml b/config/locales/models/champs/expression_reguliere_champ/en.yml new file mode 100644 index 000000000..29554a792 --- /dev/null +++ b/config/locales/models/champs/expression_reguliere_champ/en.yml @@ -0,0 +1,8 @@ +en: + activerecord: + errors: + models: + champs/expression_reguliere_champ: + attributes: + value: + invalid_regexp: does not match expected format diff --git a/config/locales/models/champs/expression_reguliere_champ/fr.yml b/config/locales/models/champs/expression_reguliere_champ/fr.yml new file mode 100644 index 000000000..a266b3f6a --- /dev/null +++ b/config/locales/models/champs/expression_reguliere_champ/fr.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + errors: + models: + champs/expression_reguliere_champ: + attributes: + value: + invalid_regexp: ne correspond pas au format attendu diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 1d5f8ff23..30a00691b 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -1576,13 +1576,10 @@ describe Dossier, type: :model do end describe "#check_expressions_regulieres_champs" do - include Logic - let(:procedure) { create(:procedure, types_de_champ_public: types_de_champ) } let(:dossier) { create(:dossier, procedure: procedure) } let(:types_de_champ) { [type_de_champ] } let(:type_de_champ) { { type: :expression_reguliere, expression_reguliere:, expression_reguliere_exemple_text: } } - let(:errors) { dossier.check_expressions_regulieres_champs } context "with bad example" do let(:expression_reguliere_exemple_text) { "01234567" } @@ -1591,13 +1588,12 @@ describe Dossier, type: :model do before do champ = dossier.champs_public.first champ.value = expression_reguliere_exemple_text - champ.save! - dossier.reload + dossier.save end it 'should have errors' do - expect(errors).not_to be_empty - expect(errors.first.full_message).to eq("n'est pas valide") + expect(dossier.errors).not_to be_empty + expect(dossier.errors.full_messages.join(',')).to include("ne correspond pas au format attendu") end end