diff --git a/app/models/compte.rb b/app/models/compte.rb index cebb03158..6076453b8 100644 --- a/app/models/compte.rb +++ b/app/models/compte.rb @@ -19,6 +19,7 @@ class Compte < ApplicationRecord validates :role, inclusion: { in: ROLES } enum :role, ROLES.zip(ROLES).to_h validates :statut_validation, presence: true + validate :verifie_etat_si_structure_manquante validates :nom, :prenom, presence: { on: :create } validate :verifie_dns_email, :structure_a_un_admin validates :role, inclusion: { in: %w[conseiller compte_generique], message: :comptes_refuses }, @@ -88,6 +89,12 @@ def rejoindre_structure(structure) private + def verifie_etat_si_structure_manquante + return unless structure.blank? && statut_validation != 'en_attente' + + errors.add(:statut_validation, :doit_etre_en_attente_si_structure_vide) + end + def verifie_dns_email return if email.blank? return unless email_changed? diff --git a/config/locales/models/compte.yml b/config/locales/models/compte.yml index 755031160..568a38717 100644 --- a/config/locales/models/compte.yml +++ b/config/locales/models/compte.yml @@ -48,6 +48,8 @@ fr: models: compte: attributes: + statut_validation: + doit_etre_en_attente_si_structure_vide: L'état doit être en attente s'il n'y a pas de structure role: structure_doit_avoir_un_admin: 'La structure doit avoir au moins un administrateur' inclusion: n'est pas inclus dans la liste diff --git a/spec/factories/compte.rb b/spec/factories/compte.rb index e77c6eb17..efe9efa82 100644 --- a/spec/factories/compte.rb +++ b/spec/factories/compte.rb @@ -15,6 +15,15 @@ trait :structure_avec_admin do structure { create(:structure, :avec_admin) } end + trait :en_attente do + statut_validation { :en_attente } + end + trait :acceptee do + statut_validation { :acceptee } + end + trait :refusee do + statut_validation { :refusee } + end factory :compte_superadmin do role { 'superadmin' } @@ -27,15 +36,6 @@ end factory :compte_conseiller do role { 'conseiller' } - trait :en_attente do - statut_validation { :en_attente } - end - trait :acceptee do - statut_validation { :acceptee } - end - trait :refusee do - statut_validation { :refusee } - end end factory :compte_generique do role { 'compte_generique' } diff --git a/spec/features/admin/compte_spec.rb b/spec/features/admin/compte_spec.rb index c3b3c7270..87c01da8a 100644 --- a/spec/features/admin/compte_spec.rb +++ b/spec/features/admin/compte_spec.rb @@ -262,7 +262,7 @@ context 'avec un compte sans structure' do let(:compte_connecte) do - create :compte_conseiller, structure: nil + create :compte_conseiller, :en_attente, structure: nil end it 'peut rejoindre une structure' do diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb index e526da2c7..71ee2106b 100644 --- a/spec/features/admin/dashboard_spec.rb +++ b/spec/features/admin/dashboard_spec.rb @@ -41,7 +41,7 @@ context 'quand je suis avec un compte sans structure' do let!(:compte) do - create :compte_conseiller, statut_validation: :acceptee, structure: nil + create :compte_conseiller, :en_attente, structure: nil end it 'Affiche le tutoriel sans le bouton quitter' do diff --git a/spec/features/admin/structure_locale_spec.rb b/spec/features/admin/structure_locale_spec.rb index 9dd1aa40e..cb65ab055 100644 --- a/spec/features/admin/structure_locale_spec.rb +++ b/spec/features/admin/structure_locale_spec.rb @@ -84,7 +84,7 @@ end describe 'avec un compte sans structure' do - let(:compte) { create(:compte_conseiller, structure: nil) } + let(:compte) { create(:compte_conseiller, :en_attente, structure: nil) } before { connecte(compte) } diff --git a/spec/integrations/ability_spec.rb b/spec/integrations/ability_spec.rb index 7234cbee5..e4185c2af 100644 --- a/spec/integrations/ability_spec.rb +++ b/spec/integrations/ability_spec.rb @@ -222,7 +222,7 @@ end context 'Compte conseiller sans structure' do - let(:compte) { create :compte_conseiller, structure: nil } + let(:compte) { create :compte_conseiller, :en_attente, structure: nil } it { expect(subject).to be_able_to(:read, ActiveAdmin::Page.new(:admin, 'recherche_structure', {})) diff --git a/spec/integrations/compte_spec.rb b/spec/integrations/compte_spec.rb index 0ab43785b..f25c4311d 100644 --- a/spec/integrations/compte_spec.rb +++ b/spec/integrations/compte_spec.rb @@ -38,7 +38,7 @@ end it "Quand le compte n'a pas de structure" do - expect { create :compte_admin, structure: nil, confirmed_at: Time.zone.now } + expect { create :compte_admin, :en_attente, structure: nil, confirmed_at: Time.zone.now } .to have_enqueued_mail(CompteMailer, :nouveau_compte).exactly(0) end @@ -109,6 +109,7 @@ it 'ne programme pas de mail de relance' do expect do create :compte_admin, + :en_attente, structure: nil, confirmed_at: Time.zone.now, email_bienvenue_envoye: false @@ -123,7 +124,7 @@ let(:compte) { create :compte_conseiller, structure: structure } context 'avec des admins' do - let!(:compte_admin_sans_structure) { create :compte_admin, structure: nil } + let!(:compte_admin_sans_structure) { create :compte_admin, :en_attente, structure: nil } let!(:compte_admin) { create :compte_admin, structure: structure } let!(:compte_admin2) { create :compte_admin, structure: structure } let!(:compte_superadmin) { create :compte_superadmin, structure: structure } @@ -135,7 +136,7 @@ end it "quand le compte n'a pas de structure, retourne une liste vide" do - compte.update(structure: nil) + compte.update(statut_validation: :en_attente, structure: nil) expect(compte.find_admins.count).to be(0) end end diff --git a/spec/jobs/relance_utilisateur_pour_non_activation_job_spec.rb b/spec/jobs/relance_utilisateur_pour_non_activation_job_spec.rb index 9cf14f990..058c489d3 100644 --- a/spec/jobs/relance_utilisateur_pour_non_activation_job_spec.rb +++ b/spec/jobs/relance_utilisateur_pour_non_activation_job_spec.rb @@ -39,7 +39,7 @@ let(:campagne) { create :campagne, compte: compte } before do - compte.update(structure_id: nil) + compte.update(statut_validation: :en_attente, structure_id: nil) end it 'ne fais rien' do diff --git a/spec/models/compte_spec.rb b/spec/models/compte_spec.rb index 8360264e6..11df30645 100644 --- a/spec/models/compte_spec.rb +++ b/spec/models/compte_spec.rb @@ -21,7 +21,9 @@ it { is_expected.to validate_presence_of :prenom } context 'quand un compte a été soft-delete' do - let(:compte) { build :compte, email: 'mon-email-supprime@example.com' } + let(:compte) do + build :compte, email: 'mon-email-supprime@example.com' + end before do autre_compte = create :compte, email: 'mon-email-supprime@example.com' @@ -111,14 +113,55 @@ it { expect(compte.role).to eql('conseiller') } end + describe "verifie le statut s'il n'y a pas de structure" do + context 'Quand il y a une de structure' do + let(:structure) { Structure.new } + let(:compte) { described_class.new role: 'admin', structure: structure } + + context 'quand le statut est accepté' do + before do + compte.statut_validation = :acceptee + end + + it "il n'y a pas d'erreur" do + compte.valid? + expect(compte.errors[:statut_validation]).to be_blank + end + end + end + + context "Quand il n'y a pas de structure" do + let(:compte) { described_class.new role: 'admin', structure: nil } + + context 'quand le statut est accepté' do + before do + compte.statut_validation = :acceptee + end + + it 'il signal une erreur' do + compte.valid? + expect(compte.errors[:statut_validation]) + .to include "L'état doit être en attente s'il n'y a pas de structure" + end + end + + context 'quand le statut est en_attente' do + before do + compte.statut_validation = :en_attente + end + + it "il n'y a pas d'erreur" do + compte.valid? + expect(compte.errors[:statut_validation]).to be_blank + end + end + end + end + describe "verifie la présence d'un admin" do let(:structure) { Structure.new } let(:compte) { described_class.new role: 'admin', structure: structure } - before do - allow(compte).to receive(:verifie_dns_email).and_return(true) - end - context 'quand il y a un autre admins dans la structure' do before do allow(compte).to receive(:autres_admins?).and_return(true)