From b22f04931818e47331997b53bc29d279d4be3d5b Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 24 Oct 2024 11:16:12 +0200 Subject: [PATCH] fix: do not allow empty filter in models --- app/models/filtered_column.rb | 7 ++-- config/i18n-tasks.yml | 1 + config/locales/models/filtered_column/en.yml | 7 ++++ config/locales/models/filtered_column/fr.yml | 7 ++++ .../procedures_controller_spec.rb | 2 +- spec/models/filtered_column_spec.rb | 35 +++++++++++++------ 6 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 config/locales/models/filtered_column/en.yml create mode 100644 config/locales/models/filtered_column/fr.yml diff --git a/app/models/filtered_column.rb b/app/models/filtered_column.rb index c348e60fd..cd1e1f774 100644 --- a/app/models/filtered_column.rb +++ b/app/models/filtered_column.rb @@ -13,6 +13,9 @@ class FilteredColumn validate :check_filter_max_length validate :check_filter_max_integer + validates :filter, presence: { + message: -> (object, _data) { "Le filtre « #{object.label} » ne peut pas être vide" } + } def initialize(column:, filter:) @column = column @@ -33,14 +36,14 @@ class FilteredColumn if @filter.present? && @filter.length.to_i > FILTERS_VALUE_MAX_LENGTH errors.add( :base, - "Le filtre #{label} est trop long (maximum: #{FILTERS_VALUE_MAX_LENGTH} caractères)" + "Le filtre « #{label} » est trop long (maximum: #{FILTERS_VALUE_MAX_LENGTH} caractères)" ) end end def check_filter_max_integer if @column.column == 'id' && @filter.to_i > PG_INTEGER_MAX_VALUE - errors.add(:base, "Le filtre #{label} n'est pas un numéro de dossier possible") + errors.add(:base, "Le filtre « #{label} » n'est pas un numéro de dossier possible") end end end diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 2e98b95ae..697dc1102 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -103,6 +103,7 @@ ignore_unused: - 'activerecord.attributes.*' - 'activemodel.attributes.map_filter.*' - 'activemodel.attributes.helpscout/form.*' +- 'activemodel.errors.models.*' - 'activerecord.errors.*' - 'errors.messages.blank' - 'errors.messages.content_type_invalid' diff --git a/config/locales/models/filtered_column/en.yml b/config/locales/models/filtered_column/en.yml new file mode 100644 index 000000000..b9d099d2e --- /dev/null +++ b/config/locales/models/filtered_column/en.yml @@ -0,0 +1,7 @@ +en: + activemodel: + errors: + models: + filtered_column: + format: "%{message}" + diff --git a/config/locales/models/filtered_column/fr.yml b/config/locales/models/filtered_column/fr.yml new file mode 100644 index 000000000..aa5942414 --- /dev/null +++ b/config/locales/models/filtered_column/fr.yml @@ -0,0 +1,7 @@ +fr: + activemodel: + errors: + models: + filtered_column: + format: "%{message}" + diff --git a/spec/controllers/instructeurs/procedures_controller_spec.rb b/spec/controllers/instructeurs/procedures_controller_spec.rb index 996966fd8..1f3ea9acb 100644 --- a/spec/controllers/instructeurs/procedures_controller_spec.rb +++ b/spec/controllers/instructeurs/procedures_controller_spec.rb @@ -911,7 +911,7 @@ describe Instructeurs::ProceduresController, type: :controller do it 'should render the error' do subject - expect(flash.alert[0]).to include("Le filtre Nom est trop long (maximum: 4048 caractères)") + expect(flash.alert[0]).to include("Le filtre « Nom » est trop long (maximum: 4048 caractères)") end end end diff --git a/spec/models/filtered_column_spec.rb b/spec/models/filtered_column_spec.rb index f4882d960..30a02e83b 100644 --- a/spec/models/filtered_column_spec.rb +++ b/spec/models/filtered_column_spec.rb @@ -11,7 +11,7 @@ describe FilteredColumn do let(:filter) { 'a' * (FilteredColumn::FILTERS_VALUE_MAX_LENGTH + 1) } it 'adds an error' do - expect(filtered_column.errors.map(&:message)).to include(/Le filtre label est trop long/) + expect(filtered_column.errors.map(&:message)).to include(/Le filtre « label » est trop long/) end end @@ -22,14 +22,6 @@ describe FilteredColumn do expect(filtered_column.errors).to be_empty end end - - context 'when the filter is empty' do - let(:filter) { nil } - - it 'does not add an error' do - expect(filtered_column.errors).to be_empty - end - end end describe '#check_filters_max_integer' do @@ -43,7 +35,7 @@ describe FilteredColumn do let(:filter) { (FilteredColumn::PG_INTEGER_MAX_VALUE + 1).to_s } it 'adds an error' do - expect(filtered_column.errors.map(&:message)).to include(/Le filtre label n'est pas un numéro de dossier possible/) + expect(filtered_column.errors.map(&:message)).to include(/Le filtre « label » n'est pas un numéro de dossier possible/) end end @@ -56,4 +48,27 @@ describe FilteredColumn do end end end + + describe '#check_filter_is_not_blank' do + let(:column) { Column.new(procedure_id: 1, table: 'table', column: 'column', label: 'label') } + let(:filtered_column) { described_class.new(column:, filter:) } + + before { filtered_column.valid? } + + context 'when the filter is blank' do + let(:filter) { '' } + + it 'adds an error' do + expect(filtered_column.errors.map(&:message)).to include(/Le filtre « label » ne peut pas être vide/) + end + end + + context 'when the filter is not blank' do + let(:filter) { 'a' } + + it 'does not add an error' do + expect(filtered_column.errors).to be_empty + end + end + end end