2019-08-06 11:02:54 +02:00
|
|
|
describe Instructeur, type: :model do
|
2016-07-18 18:24:29 +02:00
|
|
|
let(:admin) { create :administrateur }
|
2017-07-18 15:26:33 +02:00
|
|
|
let!(:procedure) { create :procedure, :published, administrateur: admin }
|
|
|
|
let!(:procedure_2) { create :procedure, :published, administrateur: admin }
|
|
|
|
let!(:procedure_3) { create :procedure, :published, administrateur: admin }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { create :instructeur, administrateurs: [admin] }
|
2018-12-03 13:51:45 +01:00
|
|
|
let!(:procedure_assign) { assign(procedure) }
|
2016-07-18 18:24:29 +02:00
|
|
|
|
|
|
|
before do
|
2018-12-03 13:51:45 +01:00
|
|
|
assign(procedure_2)
|
2016-07-18 18:24:29 +02:00
|
|
|
end
|
|
|
|
|
2017-07-17 11:28:14 +02:00
|
|
|
describe 'follow' do
|
|
|
|
let(:dossier) { create :dossier }
|
|
|
|
let(:already_followed_dossier) { create :dossier }
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
before { instructeur.followed_dossiers << already_followed_dossier }
|
2017-07-17 11:28:14 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when a instructeur follow a dossier for the first time' do
|
|
|
|
before { instructeur.follow(dossier) }
|
2017-07-17 11:28:14 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.follow?(dossier)).to be true }
|
2017-07-17 11:28:14 +02:00
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when a instructeur follows a dossier already followed' do
|
|
|
|
before { instructeur.follow(already_followed_dossier) }
|
2017-07-17 11:28:14 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.follow?(already_followed_dossier)).to be true }
|
2017-07-17 11:28:14 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-05 14:10:49 +02:00
|
|
|
describe '#unfollow' do
|
|
|
|
let(:already_followed_dossier) { create(:dossier) }
|
2019-08-06 11:02:54 +02:00
|
|
|
before { instructeur.followed_dossiers << already_followed_dossier }
|
2017-10-05 14:10:49 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when a instructeur unfollow a dossier already followed' do
|
2017-10-05 14:10:49 +02:00
|
|
|
before do
|
2019-08-06 11:02:54 +02:00
|
|
|
instructeur.unfollow(already_followed_dossier)
|
2017-10-05 14:10:49 +02:00
|
|
|
already_followed_dossier.reload
|
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.follow?(already_followed_dossier)).to be false }
|
|
|
|
it { expect(instructeur.previously_followed_dossiers).to include(already_followed_dossier) }
|
2017-10-05 14:10:49 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-07-18 18:24:29 +02:00
|
|
|
describe '#follow?' do
|
|
|
|
let!(:dossier) { create :dossier, procedure: procedure }
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
subject { instructeur.follow?(dossier) }
|
2016-07-18 18:24:29 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when instructeur follow a dossier' do
|
2016-07-18 18:24:29 +02:00
|
|
|
before do
|
2019-08-06 11:02:54 +02:00
|
|
|
create :follow, dossier_id: dossier.id, instructeur_id: instructeur.id
|
2016-07-18 18:24:29 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when instructeur not follow a dossier' do
|
2016-07-18 18:24:29 +02:00
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-20 11:24:32 +01:00
|
|
|
describe "#assign_to_procedure" do
|
2019-08-06 11:02:54 +02:00
|
|
|
subject { instructeur.assign_to_procedure(procedure_to_assign) }
|
2018-02-20 11:24:32 +01:00
|
|
|
|
|
|
|
context "with a procedure not already assigned" do
|
|
|
|
let(:procedure_to_assign) { procedure_3 }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect { subject }.to change(instructeur.procedures, :count) }
|
2019-08-20 16:59:45 +02:00
|
|
|
it do
|
|
|
|
subject
|
|
|
|
expect(instructeur.groupe_instructeurs).to include(procedure_to_assign.defaut_groupe_instructeur)
|
|
|
|
end
|
2018-02-20 11:24:32 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
context "with an already assigned procedure" do
|
|
|
|
let(:procedure_to_assign) { procedure }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect { subject }.not_to change(instructeur.procedures, :count) }
|
2018-02-20 11:24:32 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "#remove_from_procedure" do
|
2019-08-06 11:02:54 +02:00
|
|
|
subject { instructeur.remove_from_procedure(procedure_to_remove) }
|
2018-02-20 11:24:32 +01:00
|
|
|
|
|
|
|
context "with an assigned procedure" do
|
|
|
|
let(:procedure_to_remove) { procedure }
|
|
|
|
let!(:procedure_presentation) { procedure_assign.procedure_presentation }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
|
|
|
|
describe "consequences" do
|
|
|
|
before do
|
|
|
|
procedure_assign.build_procedure_presentation
|
|
|
|
procedure_assign.save
|
|
|
|
subject
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes the assign_to and procedure_presentation" do
|
|
|
|
expect(AssignTo.where(id: procedure_assign).count).to eq(0)
|
|
|
|
expect(ProcedurePresentation.where(assign_to_id: procedure_assign.id).count).to eq(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with an already unassigned procedure" do
|
|
|
|
let(:procedure_to_remove) { procedure_3 }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-05-12 16:47:18 +02:00
|
|
|
describe 'last_week_overview' do
|
2019-08-06 11:02:54 +02:00
|
|
|
let!(:instructeur2) { create(:instructeur) }
|
|
|
|
subject { instructeur2.last_week_overview }
|
2018-10-25 15:19:29 +02:00
|
|
|
let(:friday) { Time.zone.local(2017, 5, 12) }
|
2018-10-25 15:07:15 +02:00
|
|
|
let(:monday) { Time.zone.now.beginning_of_week }
|
2017-05-12 16:47:18 +02:00
|
|
|
|
2017-11-29 16:07:39 +01:00
|
|
|
before { Timecop.freeze(friday) }
|
2017-10-05 16:10:00 +02:00
|
|
|
after { Timecop.return }
|
|
|
|
|
2017-05-12 16:47:18 +02:00
|
|
|
context 'when no procedure published was active last week' do
|
2019-08-20 18:03:33 +02:00
|
|
|
let!(:procedure) { create(:procedure, :published, libelle: 'procedure') }
|
|
|
|
|
|
|
|
before { instructeur2.assign_to_procedure(procedure) }
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when the instructeur has no notifications' do
|
2017-05-12 16:47:18 +02:00
|
|
|
it { is_expected.to eq(nil) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a procedure published was active' do
|
2019-08-20 18:03:33 +02:00
|
|
|
let!(:procedure) { create(:procedure, :published, libelle: 'procedure') }
|
2017-05-12 16:47:18 +02:00
|
|
|
let(:procedure_overview) { double('procedure_overview', 'had_some_activities?'.to_sym => true) }
|
|
|
|
|
|
|
|
before :each do
|
2019-08-20 18:03:33 +02:00
|
|
|
instructeur2.assign_to_procedure(procedure)
|
2017-05-12 16:47:18 +02:00
|
|
|
expect_any_instance_of(Procedure).to receive(:procedure_overview).and_return(procedure_overview)
|
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur2.last_week_overview[:procedure_overviews]).to match([procedure_overview]) }
|
2017-05-12 16:47:18 +02:00
|
|
|
end
|
|
|
|
|
2020-02-11 15:51:15 +01:00
|
|
|
context 'when a procedure published was active and weekly notifications is disable' do
|
|
|
|
let!(:procedure) { create(:procedure, :published, libelle: 'procedure') }
|
|
|
|
let(:procedure_overview) { double('procedure_overview', 'had_some_activities?'.to_sym => true) }
|
|
|
|
|
|
|
|
before :each do
|
|
|
|
instructeur2.assign_to_procedure(procedure)
|
|
|
|
AssignTo
|
|
|
|
.where(instructeur: instructeur2, groupe_instructeur: procedure.groupe_instructeurs.first)
|
|
|
|
.update(weekly_email_notifications_enabled: false)
|
|
|
|
allow_any_instance_of(Procedure).to receive(:procedure_overview).and_return(procedure_overview)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(instructeur2.last_week_overview).to be_nil }
|
|
|
|
end
|
|
|
|
|
2017-05-12 16:47:18 +02:00
|
|
|
context 'when a procedure not published was active with no notifications' do
|
2019-08-20 18:03:33 +02:00
|
|
|
let!(:procedure) { create(:procedure, libelle: 'procedure') }
|
2017-05-12 16:47:18 +02:00
|
|
|
let(:procedure_overview) { double('procedure_overview', 'had_some_activities?'.to_sym => true) }
|
|
|
|
|
|
|
|
before :each do
|
2019-08-20 18:03:33 +02:00
|
|
|
instructeur2.assign_to_procedure(procedure)
|
2017-05-12 16:47:18 +02:00
|
|
|
allow_any_instance_of(Procedure).to receive(:procedure_overview).and_return(procedure_overview)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to eq(nil) }
|
|
|
|
end
|
|
|
|
end
|
2017-05-16 15:20:38 +02:00
|
|
|
|
2018-10-23 11:39:54 +02:00
|
|
|
describe "procedure_presentation_and_errors_for_procedure_id" do
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:procedure_presentation_and_errors) { instructeur.procedure_presentation_and_errors_for_procedure_id(procedure_id) }
|
2018-10-23 11:39:54 +02:00
|
|
|
let(:procedure_presentation) { procedure_presentation_and_errors.first }
|
|
|
|
let(:errors) { procedure_presentation_and_errors.second }
|
2017-10-02 17:03:38 +02:00
|
|
|
|
2018-10-23 11:20:16 +02:00
|
|
|
context 'with explicit presentation' do
|
|
|
|
let(:procedure_id) { procedure.id }
|
|
|
|
let!(:pp) { ProcedurePresentation.create(assign_to: procedure_assign) }
|
|
|
|
|
|
|
|
it { expect(procedure_presentation).to eq(pp) }
|
2018-10-23 11:39:54 +02:00
|
|
|
it { expect(errors).to be_nil }
|
2018-10-23 11:20:16 +02:00
|
|
|
end
|
|
|
|
|
2018-10-23 11:48:25 +02:00
|
|
|
context 'with invalid presentation' do
|
|
|
|
let(:procedure_id) { procedure.id }
|
|
|
|
before do
|
|
|
|
pp = ProcedurePresentation.create(assign_to: procedure_assign, displayed_fields: [{ 'table' => 'invalid', 'column' => 'random' }])
|
|
|
|
pp.save(:validate => false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(procedure_presentation).not_to be_persisted }
|
|
|
|
it { expect(errors).to be_present }
|
|
|
|
end
|
|
|
|
|
2018-10-23 11:20:16 +02:00
|
|
|
context 'with default presentation' do
|
|
|
|
let(:procedure_id) { procedure_2.id }
|
|
|
|
|
2018-10-23 11:21:32 +02:00
|
|
|
it { expect(procedure_presentation).not_to be_persisted }
|
2018-10-23 11:39:54 +02:00
|
|
|
it { expect(errors).to be_nil }
|
2018-10-23 11:20:16 +02:00
|
|
|
end
|
2017-10-02 17:03:38 +02:00
|
|
|
end
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
describe '#notifications_for_dossier' do
|
2018-08-28 14:10:55 +02:00
|
|
|
let!(:dossier) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { dossier.follows.first.instructeur }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
subject { instructeur.notifications_for_dossier(dossier) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when the instructeur has just followed the dossier' do
|
2017-10-05 16:10:00 +02:00
|
|
|
it { is_expected.to match({ demande: false, annotations_privees: false, avis: false, messagerie: false }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on public champs' do
|
|
|
|
before { dossier.champs.first.update_attribute('value', 'toto') }
|
|
|
|
|
2020-02-26 22:43:59 +01:00
|
|
|
it { is_expected.to match({ demande: true, annotations_privees: false, avis: false, messagerie: false }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on groupe instructeur' do
|
|
|
|
let(:groupe_instructeur) { create(:groupe_instructeur, instructeurs: [instructeur], procedure: dossier.procedure) }
|
|
|
|
before { dossier.assign_to_groupe_instructeur(groupe_instructeur) }
|
|
|
|
|
2017-10-05 16:10:00 +02:00
|
|
|
it { is_expected.to match({ demande: true, annotations_privees: false, avis: false, messagerie: false }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on private champs' do
|
|
|
|
before { dossier.champs_private.first.update_attribute('value', 'toto') }
|
|
|
|
|
|
|
|
it { is_expected.to match({ demande: false, annotations_privees: true, avis: false, messagerie: false }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on avis' do
|
|
|
|
before { create(:avis, dossier: dossier) }
|
|
|
|
|
|
|
|
it { is_expected.to match({ demande: false, annotations_privees: false, avis: true, messagerie: false }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'messagerie' do
|
|
|
|
context 'when there is a new commentaire' do
|
|
|
|
before { create(:commentaire, dossier: dossier, email: 'a@b.com') }
|
|
|
|
|
|
|
|
it { is_expected.to match({ demande: false, annotations_privees: false, avis: false, messagerie: true }) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a new commentaire issued by tps' do
|
2018-05-31 15:43:57 +02:00
|
|
|
before { create(:commentaire, dossier: dossier, email: CONTACT_EMAIL) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
it { is_expected.to match({ demande: false, annotations_privees: false, avis: false, messagerie: false }) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-04-17 15:20:10 +02:00
|
|
|
describe '#notifications_for_procedure' do
|
2019-10-24 15:35:43 +02:00
|
|
|
let(:procedure) { create(:simple_procedure, :routee, :with_type_de_champ_private) }
|
|
|
|
let!(:dossier) { create(:dossier, :followed, groupe_instructeur: procedure.groupe_instructeurs.last, state: Dossier.states.fetch(:en_construction)) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { dossier.follows.first.instructeur }
|
2019-10-24 15:35:43 +02:00
|
|
|
let!(:instructeur_2) { create(:instructeur, groupe_instructeurs: [procedure.groupe_instructeurs.last]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2018-08-28 14:10:55 +02:00
|
|
|
let!(:dossier_on_procedure_2) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let!(:instructeur_on_procedure_2) { dossier_on_procedure_2.follows.first.instructeur }
|
2020-07-30 11:05:39 +02:00
|
|
|
let(:now) { Time.zone.parse("14/09/1867") }
|
|
|
|
let(:follow) { instructeur.follows.find_by(dossier: dossier) }
|
|
|
|
let(:follow2) { instructeur_2.follows.find_by(dossier: dossier) }
|
|
|
|
let(:seen_at_instructeur) { now - 1.hour }
|
|
|
|
let(:seen_at_instructeur2) { now - 1.hour }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
before do
|
2019-10-24 15:35:43 +02:00
|
|
|
procedure.groupe_instructeurs.last.instructeurs << instructeur
|
2019-08-06 11:02:54 +02:00
|
|
|
instructeur_2.followed_dossiers << dossier
|
2020-07-30 11:05:39 +02:00
|
|
|
Timecop.freeze(now)
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
|
2020-07-30 11:05:39 +02:00
|
|
|
after { Timecop.return }
|
|
|
|
|
2019-09-20 10:35:44 +02:00
|
|
|
subject { instructeur.notifications_for_procedure(procedure, :en_cours) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when the instructeur has just followed the dossier' do
|
2017-10-05 16:10:00 +02:00
|
|
|
it { is_expected.to match([]) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on public champs' do
|
2020-07-30 11:05:39 +02:00
|
|
|
before do
|
|
|
|
dossier.update!(last_champ_updated_at: now)
|
|
|
|
follow.update_attribute('demande_seen_at', seen_at_instructeur)
|
|
|
|
follow2.update_attribute('demande_seen_at', seen_at_instructeur2)
|
|
|
|
end
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-09-20 12:42:10 +02:00
|
|
|
it { is_expected.to match([dossier]) }
|
|
|
|
it { expect(instructeur_2.notifications_for_procedure(procedure, :en_cours)).to match([dossier]) }
|
2019-09-20 10:35:44 +02:00
|
|
|
it { expect(instructeur_on_procedure_2.notifications_for_procedure(procedure, :en_cours)).to match([]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
context 'and there is a modification on private champs' do
|
|
|
|
before { dossier.champs_private.first.update_attribute('value', 'toto') }
|
|
|
|
|
2019-09-20 12:42:10 +02:00
|
|
|
it { is_expected.to match([dossier]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when instructeur update it s public champs last seen' do
|
2020-07-30 11:05:39 +02:00
|
|
|
let(:seen_at_instructeur) { now + 1.hour }
|
|
|
|
let(:seen_at_instructeur2) { now - 1.hour }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
it { is_expected.to match([]) }
|
2019-09-20 12:42:10 +02:00
|
|
|
it { expect(instructeur_2.notifications_for_procedure(procedure, :en_cours)).to match([dossier]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on public champs on a followed dossier from another procedure' do
|
|
|
|
before { dossier_on_procedure_2.champs.first.update_attribute('value', 'toto') }
|
|
|
|
|
|
|
|
it { is_expected.to match([]) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on private champs' do
|
2020-07-30 11:05:39 +02:00
|
|
|
before do
|
|
|
|
dossier.update!(last_champ_private_updated_at: now)
|
|
|
|
follow.update_attribute('annotations_privees_seen_at', seen_at_instructeur)
|
|
|
|
end
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-09-20 12:42:10 +02:00
|
|
|
it { is_expected.to match([dossier]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a modification on avis' do
|
2020-07-30 11:05:39 +02:00
|
|
|
before do
|
|
|
|
dossier.update!(last_avis_updated_at: Time.zone.now)
|
|
|
|
follow.update_attribute('avis_seen_at', seen_at_instructeur)
|
|
|
|
end
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-09-20 12:42:10 +02:00
|
|
|
it { is_expected.to match([dossier]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'the messagerie' do
|
|
|
|
context 'when there is a new commentaire' do
|
2020-07-30 11:05:39 +02:00
|
|
|
before do
|
|
|
|
dossier.update!(last_commentaire_updated_at: Time.zone.now)
|
|
|
|
follow.update_attribute('messagerie_seen_at', seen_at_instructeur)
|
|
|
|
end
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2019-09-20 12:42:10 +02:00
|
|
|
it { is_expected.to match([dossier]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is a new commentaire issued by tps' do
|
2018-05-31 15:43:57 +02:00
|
|
|
before { create(:commentaire, dossier: dossier, email: CONTACT_EMAIL) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
it { is_expected.to match([]) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-09-10 18:16:58 +02:00
|
|
|
describe '#procedure_ids_with_notifications' do
|
2018-08-28 14:10:55 +02:00
|
|
|
let!(:dossier) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { dossier.follows.first.instructeur }
|
2017-10-05 16:10:00 +02:00
|
|
|
let(:procedure) { dossier.procedure }
|
|
|
|
|
2020-09-10 18:16:58 +02:00
|
|
|
subject { instructeur.procedure_ids_with_notifications(:en_cours) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
|
|
|
context 'when there is a modification on public champs' do
|
2020-07-30 11:05:39 +02:00
|
|
|
before { dossier.update!(last_champ_updated_at: Time.zone.now) }
|
2017-10-05 16:10:00 +02:00
|
|
|
|
2020-09-10 18:16:58 +02:00
|
|
|
it { is_expected.to match([procedure.id]) }
|
2017-10-05 16:10:00 +02:00
|
|
|
end
|
|
|
|
end
|
2017-10-24 11:41:22 +02:00
|
|
|
|
|
|
|
describe '#mark_tab_as_seen' do
|
2018-08-28 14:10:55 +02:00
|
|
|
let!(:dossier) { create(:dossier, :followed, state: Dossier.states.fetch(:en_construction)) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { dossier.follows.first.instructeur }
|
2018-10-25 15:17:33 +02:00
|
|
|
let(:freeze_date) { Time.zone.parse('12/12/2012') }
|
2017-10-24 11:41:22 +02:00
|
|
|
|
|
|
|
context 'when demande is acknowledged' do
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:follow) { instructeur.follows.find_by(dossier: dossier) }
|
2017-10-24 11:41:22 +02:00
|
|
|
|
|
|
|
before do
|
|
|
|
Timecop.freeze(freeze_date)
|
2019-08-06 11:02:54 +02:00
|
|
|
instructeur.mark_tab_as_seen(dossier, :demande)
|
2017-10-24 11:41:22 +02:00
|
|
|
end
|
2017-11-29 16:07:39 +01:00
|
|
|
after { Timecop.return }
|
2017-10-24 11:41:22 +02:00
|
|
|
|
|
|
|
it { expect(follow.demande_seen_at).to eq(freeze_date) }
|
|
|
|
end
|
|
|
|
end
|
2018-12-03 13:51:45 +01:00
|
|
|
|
2019-01-10 10:41:03 +01:00
|
|
|
describe '#young_login_token?' do
|
2019-08-06 11:02:54 +02:00
|
|
|
let!(:instructeur) { create(:instructeur) }
|
2019-01-10 10:41:03 +01:00
|
|
|
|
|
|
|
context 'when there is a token' do
|
2019-08-06 11:02:54 +02:00
|
|
|
let!(:good_token) { instructeur.create_trusted_device_token }
|
2019-01-10 10:41:03 +01:00
|
|
|
|
|
|
|
context 'when the token has just been created' do
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.young_login_token?).to be true }
|
2019-01-10 10:41:03 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the token is a bit old' do
|
2019-08-06 11:02:54 +02:00
|
|
|
before { instructeur.trusted_device_tokens.first.update(created_at: (TrustedDeviceToken::LOGIN_TOKEN_YOUTH + 1.minute).ago) }
|
|
|
|
it { expect(instructeur.young_login_token?).to be false }
|
2019-01-10 10:41:03 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there are no token' do
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.young_login_token?).to be_falsey }
|
2019-01-10 10:41:03 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-13 17:59:33 +01:00
|
|
|
describe '#email_notification_data' do
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { create(:instructeur) }
|
2019-03-13 17:59:33 +01:00
|
|
|
let(:procedure_to_assign) { create(:procedure) }
|
|
|
|
|
|
|
|
before do
|
2020-07-20 16:13:51 +02:00
|
|
|
create(:assign_to, instructeur: instructeur, procedure: procedure_to_assign, daily_email_notifications_enabled: true)
|
2019-03-13 17:59:33 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a dossier in construction exists' do
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure_to_assign, state: Dossier.states.fetch(:en_construction)) }
|
|
|
|
|
|
|
|
it do
|
2019-08-06 11:02:54 +02:00
|
|
|
expect(instructeur.email_notification_data).to eq([
|
2019-03-13 17:59:33 +01:00
|
|
|
{
|
|
|
|
nb_en_construction: 1,
|
2020-03-13 10:24:25 +01:00
|
|
|
nb_en_instruction: 0,
|
|
|
|
nb_accepted: 0,
|
2019-03-13 17:59:33 +01:00
|
|
|
nb_notification: 0,
|
|
|
|
procedure_id: procedure_to_assign.id,
|
|
|
|
procedure_libelle: procedure_to_assign.libelle
|
|
|
|
}
|
|
|
|
])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a notification exists' do
|
|
|
|
before do
|
2019-08-06 11:02:54 +02:00
|
|
|
allow(instructeur).to receive(:notifications_for_procedure)
|
2019-09-20 10:45:44 +02:00
|
|
|
.with(procedure_to_assign, :not_archived)
|
2019-03-13 17:59:33 +01:00
|
|
|
.and_return([1, 2, 3])
|
|
|
|
end
|
|
|
|
|
|
|
|
it do
|
2019-08-06 11:02:54 +02:00
|
|
|
expect(instructeur.email_notification_data).to eq([
|
2019-03-13 17:59:33 +01:00
|
|
|
{
|
|
|
|
nb_en_construction: 0,
|
2020-03-13 10:24:25 +01:00
|
|
|
nb_en_instruction: 0,
|
|
|
|
nb_accepted: 0,
|
2019-03-13 17:59:33 +01:00
|
|
|
nb_notification: 3,
|
|
|
|
procedure_id: procedure_to_assign.id,
|
|
|
|
procedure_libelle: procedure_to_assign.libelle
|
|
|
|
}
|
|
|
|
])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-03-13 10:24:25 +01:00
|
|
|
context 'when a declarated dossier in instruction exists' do
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure_to_assign, state: Dossier.states.fetch(:en_construction)) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure_to_assign.update(declarative_with_state: "en_instruction")
|
2020-11-13 14:34:53 +01:00
|
|
|
Cron::DeclarativeProceduresJob.new.perform
|
2020-03-13 10:24:25 +01:00
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(procedure_to_assign.declarative_with_state).to eq("en_instruction") }
|
|
|
|
it { expect(dossier.state).to eq("en_instruction") }
|
|
|
|
it do
|
|
|
|
expect(instructeur.email_notification_data).to eq([
|
|
|
|
{
|
|
|
|
nb_en_construction: 0,
|
|
|
|
nb_en_instruction: 1,
|
|
|
|
nb_accepted: 0,
|
|
|
|
nb_notification: 0,
|
|
|
|
procedure_id: procedure_to_assign.id,
|
|
|
|
procedure_libelle: procedure_to_assign.libelle
|
|
|
|
}
|
|
|
|
])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a declarated dossier in accepte processed at today exists' do
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure_to_assign, state: Dossier.states.fetch(:en_construction)) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure_to_assign.update(declarative_with_state: "accepte")
|
2020-11-13 14:34:53 +01:00
|
|
|
Cron::DeclarativeProceduresJob.new.perform
|
2020-03-13 10:24:25 +01:00
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(procedure_to_assign.declarative_with_state).to eq("accepte") }
|
|
|
|
it { expect(dossier.state).to eq("accepte") }
|
|
|
|
|
|
|
|
it do
|
|
|
|
expect(instructeur.email_notification_data).to eq([])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a declarated dossier in accepte processed at yesterday exists' do
|
|
|
|
let!(:dossier) { create(:dossier, procedure: procedure_to_assign, state: Dossier.states.fetch(:en_construction)) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure_to_assign.update(declarative_with_state: "accepte")
|
2020-11-13 14:34:53 +01:00
|
|
|
Cron::DeclarativeProceduresJob.new.perform
|
2020-07-02 11:02:50 +02:00
|
|
|
dossier.traitements.last.update(processed_at: Time.zone.yesterday.beginning_of_day)
|
2020-03-13 10:24:25 +01:00
|
|
|
dossier.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(procedure_to_assign.declarative_with_state).to eq("accepte") }
|
|
|
|
it { expect(dossier.state).to eq("accepte") }
|
|
|
|
|
|
|
|
it do
|
|
|
|
expect(instructeur.email_notification_data).to eq([
|
|
|
|
{
|
|
|
|
nb_en_construction: 0,
|
|
|
|
nb_en_instruction: 0,
|
|
|
|
nb_accepted: 1,
|
|
|
|
nb_notification: 0,
|
|
|
|
procedure_id: procedure_to_assign.id,
|
|
|
|
procedure_libelle: procedure_to_assign.libelle
|
|
|
|
}
|
|
|
|
])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-13 17:59:33 +01:00
|
|
|
context 'otherwise' do
|
2019-08-06 11:02:54 +02:00
|
|
|
it { expect(instructeur.email_notification_data).to eq([]) }
|
2019-03-13 17:59:33 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-09-18 11:46:28 +02:00
|
|
|
describe '#procedures' do
|
|
|
|
let(:procedure_a) { create(:procedure) }
|
|
|
|
let(:instructeur_a) { create(:instructeur, groupe_instructeurs: [procedure_a.defaut_groupe_instructeur]) }
|
|
|
|
|
|
|
|
before do
|
2021-03-03 11:32:42 +01:00
|
|
|
gi2 = procedure_a.groupe_instructeurs.create(label: 'gi2')
|
2019-09-18 11:46:28 +02:00
|
|
|
|
|
|
|
instructeur_a.groupe_instructeurs << gi2
|
|
|
|
end
|
|
|
|
|
|
|
|
it { expect(instructeur_a.procedures.all.to_ary).to eq([procedure_a]) }
|
|
|
|
end
|
|
|
|
|
2020-01-30 10:48:28 +01:00
|
|
|
describe "#can_be_deleted?" do
|
|
|
|
subject { instructeur.can_be_deleted? }
|
|
|
|
|
|
|
|
context 'when the instructeur is an administrateur' do
|
|
|
|
let!(:administrateur) { create(:administrateur) }
|
|
|
|
let(:instructeur) { administrateur.instructeur }
|
|
|
|
|
|
|
|
it { is_expected.to be false }
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the instructeur's procedures have other instructeurs" do
|
|
|
|
let(:instructeur_not_admin) { create(:instructeur) }
|
|
|
|
let(:autre_instructeur) { create(:instructeur) }
|
|
|
|
|
|
|
|
it "can be deleted" do
|
|
|
|
assign(procedure, instructeur_assigne: instructeur_not_admin)
|
|
|
|
assign(procedure, instructeur_assigne: autre_instructeur)
|
|
|
|
expect(autre_instructeur.can_be_deleted?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the instructeur's procedures is the only one" do
|
|
|
|
let(:instructeur_not_admin) { create :instructeur }
|
|
|
|
let(:autre_procedure) { create :procedure }
|
|
|
|
it "can be deleted" do
|
|
|
|
assign(autre_procedure, instructeur_assigne: instructeur_not_admin)
|
|
|
|
expect(instructeur_not_admin.can_be_deleted?).to be_falsy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-12-03 13:51:45 +01:00
|
|
|
private
|
|
|
|
|
2020-01-30 10:48:28 +01:00
|
|
|
def assign(procedure_to_assign, instructeur_assigne: instructeur)
|
|
|
|
create :assign_to, instructeur: instructeur_assigne, procedure: procedure_to_assign, groupe_instructeur: procedure_to_assign.defaut_groupe_instructeur
|
2018-12-03 13:51:45 +01:00
|
|
|
end
|
2015-09-22 10:15:12 +02:00
|
|
|
end
|