diff --git a/app/models/champs/piece_justificative_champ.rb b/app/models/champs/piece_justificative_champ.rb index b7aa201f6..bfa5c2473 100644 --- a/app/models/champs/piece_justificative_champ.rb +++ b/app/models/champs/piece_justificative_champ.rb @@ -35,9 +35,8 @@ class Champs::PieceJustificativeChamp < Champ validates :piece_justificative_file, content_type: ACCEPTED_FORMATS, - size: { less_than: MAX_SIZE } - - before_save :update_skip_pj_validation + size: { less_than: MAX_SIZE }, + if: -> { !type_de_champ.skip_pj_validation } def main_value_name :piece_justificative_file @@ -60,8 +59,4 @@ class Champs::PieceJustificativeChamp < Champ piece_justificative_file.service_url end end - - def update_skip_pj_validation - type_de_champ.update(skip_pj_validation: true) - end end diff --git a/spec/features/users/brouillon_spec.rb b/spec/features/users/brouillon_spec.rb index 5818f99e8..898af7cb0 100644 --- a/spec/features/users/brouillon_spec.rb +++ b/spec/features/users/brouillon_spec.rb @@ -176,6 +176,13 @@ feature 'The user' do create(:procedure, :published, :for_individual, types_de_champ: tdcs) end + let(:old_procedure_with_disabled_pj_validation) do + tdcs = [ + create(:type_de_champ_piece_justificative, mandatory: true, libelle: 'Pièce justificative 1', order_place: 1, skip_pj_validation: true) + ] + create(:procedure, :published, :for_individual, types_de_champ: tdcs) + end + scenario 'add an attachment', js: true do log_in(user, procedure_with_pjs) fill_individual @@ -216,6 +223,16 @@ feature 'The user' do expect(page).to have_text('piece_justificative_0.pdf') end + scenario 'add an invalid attachment on an old procedure where pj validation is disabled', js: true do + log_in(user, old_procedure_with_disabled_pj_validation) + fill_individual + + # Test invalid file type + attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/invalid_file_format.json') + expect(page).to have_no_text('La pièce justificative n’est pas d’un type accepté') + expect(page).to have_text('analyse antivirus en cours', count: 1) + end + scenario 'retry on transcient upload error', js: true do log_in(user, procedure_with_pjs) fill_individual diff --git a/spec/models/champs/piece_justificative_champ_spec.rb b/spec/models/champs/piece_justificative_champ_spec.rb index 7f5a563e8..b8cacf149 100644 --- a/spec/models/champs/piece_justificative_champ_spec.rb +++ b/spec/models/champs/piece_justificative_champ_spec.rb @@ -3,7 +3,7 @@ require 'active_storage_validations/matchers' describe Champs::PieceJustificativeChamp do include ActiveStorageValidations::Matchers - describe "update_skip_validation" do + describe "skip_validation is not set anymore" do subject { champ_pj.type_de_champ.skip_pj_validation } context 'before_save' do @@ -12,15 +12,26 @@ describe Champs::PieceJustificativeChamp do end context 'after_save' do let(:champ_pj) { create (:champ_piece_justificative) } - it { is_expected.to be_truthy } + it { is_expected.to be_falsy } end end describe "validations" do - subject(:champ_pj) { build(:champ_piece_justificative) } + let(:champ_pj) { create(:champ_piece_justificative) } + subject { champ_pj } - it { is_expected.to validate_size_of(:piece_justificative_file).less_than(Champs::PieceJustificativeChamp::MAX_SIZE) } - it { is_expected.to validate_content_type_of(:piece_justificative_file).allowing(Champs::PieceJustificativeChamp::ACCEPTED_FORMATS) } + context "by default" do + it { is_expected.to validate_size_of(:piece_justificative_file).less_than(Champs::PieceJustificativeChamp::MAX_SIZE) } + it { is_expected.to validate_content_type_of(:piece_justificative_file).allowing(Champs::PieceJustificativeChamp::ACCEPTED_FORMATS) } + it { expect(champ_pj.type_de_champ.skip_pj_validation).to be_falsy } + end + + context "when validation is disabled" do + before { champ_pj.type_de_champ.update(skip_pj_validation: true) } + + it { is_expected.not_to validate_size_of(:piece_justificative_file).less_than(Champs::PieceJustificativeChamp::MAX_SIZE) } + it { is_expected.not_to validate_content_type_of(:piece_justificative_file).allowing(Champs::PieceJustificativeChamp::ACCEPTED_FORMATS) } + end end describe "#for_export" do