2024-04-29 00:17:15 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2021-04-29 09:33:32 +02:00
|
|
|
describe RechercheController, type: :controller do
|
2021-11-19 12:29:24 +01:00
|
|
|
let(:procedure) {
|
2024-01-23 09:52:20 +01:00
|
|
|
create(:procedure, :published,
|
|
|
|
:for_individual,
|
|
|
|
types_de_champ_public: [{ type: :text }, { type: :text }],
|
|
|
|
types_de_champ_private: [{ type: :text }, { type: :text }])
|
2021-11-19 12:29:24 +01:00
|
|
|
}
|
|
|
|
let(:dossier) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
|
2019-08-06 11:02:54 +02:00
|
|
|
let(:instructeur) { create(:instructeur) }
|
2017-07-31 11:58:52 +02:00
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
let(:dossier_with_expert) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
|
|
|
|
let(:avis) { create(:avis, dossier: dossier_with_expert) }
|
2021-05-06 01:14:57 +02:00
|
|
|
|
|
|
|
let(:user) { instructeur.user }
|
|
|
|
|
2021-04-29 09:33:32 +02:00
|
|
|
before do
|
2021-05-06 01:14:57 +02:00
|
|
|
instructeur.assign_to_procedure(dossier.procedure)
|
2021-11-19 12:29:24 +01:00
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
dossier.champs_public[0].value = "Name of district A"
|
|
|
|
dossier.champs_public[1].value = "Name of city A"
|
2021-11-19 12:29:24 +01:00
|
|
|
dossier.champs_private[0].value = "Dossier A is complete"
|
|
|
|
dossier.champs_private[1].value = "Dossier A is valid"
|
|
|
|
dossier.save!
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
dossier_with_expert.champs_public[0].value = "Name of district B"
|
|
|
|
dossier_with_expert.champs_public[1].value = "name of city B"
|
2021-11-19 12:29:24 +01:00
|
|
|
dossier_with_expert.champs_private[0].value = "Dossier B is incomplete"
|
|
|
|
dossier_with_expert.champs_private[1].value = "Dossier B is invalid"
|
|
|
|
dossier_with_expert.save!
|
2024-04-03 10:21:50 +02:00
|
|
|
|
2024-04-25 17:57:55 +02:00
|
|
|
perform_enqueued_jobs(only: DossierIndexSearchTermsJob)
|
2021-04-29 09:33:32 +02:00
|
|
|
end
|
2017-07-31 11:58:52 +02:00
|
|
|
|
|
|
|
describe 'GET #index' do
|
2021-05-06 01:14:57 +02:00
|
|
|
before { sign_in(user) }
|
|
|
|
|
2017-07-31 11:58:52 +02:00
|
|
|
subject { get :index, params: { q: query } }
|
|
|
|
|
|
|
|
describe 'by id' do
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when instructeur own the dossier' do
|
2021-05-06 01:14:57 +02:00
|
|
|
let(:query) { dossier.id }
|
2021-04-29 09:33:32 +02:00
|
|
|
|
2021-05-06 01:14:57 +02:00
|
|
|
before { subject }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'returns the expected dossier' do
|
|
|
|
expect(assigns(:projected_dossiers).count).to eq(1)
|
|
|
|
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier.id)
|
2021-04-29 09:33:32 +02:00
|
|
|
end
|
2021-05-06 01:14:57 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when expert own the dossier' do
|
|
|
|
let(:user) { avis.experts_procedure.expert.user }
|
|
|
|
let(:query) { dossier_with_expert.id }
|
|
|
|
|
|
|
|
before { subject }
|
2017-07-31 11:58:52 +02:00
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'returns the expected dossier' do
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(1)
|
|
|
|
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier_with_expert.id)
|
2017-07-31 11:58:52 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
context 'when instructeur do not own the dossier' do
|
2021-11-19 12:29:24 +01:00
|
|
|
let(:dossier2) { create(:dossier, :en_construction) }
|
|
|
|
let(:query) { dossier2.id }
|
2017-07-31 11:58:52 +02:00
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
2023-08-24 15:44:22 +02:00
|
|
|
|
|
|
|
it 'does not return the dossier' do
|
|
|
|
subject
|
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
|
|
|
expect(assigns(:dossier_not_in_instructor_group)).to eq(nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when dossier is brouillon without groupe instructeur' do
|
|
|
|
let(:dossier2) { create(:dossier, :brouillon, procedure: procedure) }
|
|
|
|
let(:query) { dossier2.id }
|
|
|
|
before { dossier2.update(groupe_instructeur_id: nil) }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
2017-07-31 11:58:52 +02:00
|
|
|
|
|
|
|
it 'does not return the dossier' do
|
|
|
|
subject
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
2022-11-07 17:00:31 +01:00
|
|
|
expect(assigns(:dossier_not_in_instructor_group)).to eq(nil)
|
2022-11-03 17:39:12 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when instructeur is attached to the procedure but is not in the instructor group of the dossier' do
|
|
|
|
let!(:gi_p1_1) { GroupeInstructeur.create(label: 'groupe 1', procedure: procedure) }
|
|
|
|
let!(:gi_p1_2) { GroupeInstructeur.create(label: 'groupe 2', procedure: procedure) }
|
|
|
|
let!(:dossier3) { create(:dossier, :accepte, :with_individual, procedure: procedure, groupe_instructeur: gi_p1_2) }
|
|
|
|
|
|
|
|
before { gi_p1_1.instructeurs << instructeur }
|
|
|
|
|
|
|
|
let(:query) { dossier3.id }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'does not return the dossier but it returns a message' do
|
|
|
|
subject
|
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
2022-11-07 17:00:31 +01:00
|
|
|
expect(assigns(:dossier_not_in_instructor_group)).to eq(dossier3)
|
2017-07-31 11:58:52 +02:00
|
|
|
end
|
|
|
|
end
|
2018-02-06 12:15:20 +01:00
|
|
|
|
2023-10-17 14:25:14 +02:00
|
|
|
context 'when dossier is deleted' do
|
|
|
|
let!(:deleted_dossier) { DeletedDossier.create_from_dossier(dossier, DeletedDossier.reasons.fetch(:user_request)) }
|
|
|
|
let(:query) { deleted_dossier.dossier_id }
|
|
|
|
|
|
|
|
before { subject }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'does not return the dossier but it returns a message' do
|
|
|
|
subject
|
|
|
|
expect(assigns(:dossiers_count)).to eq(0)
|
|
|
|
expect(assigns(:deleted_dossier)).to eq(deleted_dossier)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-06 12:15:20 +01:00
|
|
|
context 'with an id out of range' do
|
|
|
|
let(:query) { 123456789876543234567 }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'does not return the dossier' do
|
|
|
|
subject
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
describe 'by champs' do
|
|
|
|
let(:query) { 'district A' }
|
2021-05-06 01:14:57 +02:00
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'returns the expected dossier' do
|
2024-01-11 18:35:19 +01:00
|
|
|
subject
|
2021-11-19 12:29:24 +01:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(1)
|
|
|
|
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier.id)
|
|
|
|
end
|
|
|
|
|
2024-01-11 18:35:19 +01:00
|
|
|
context 'when dossier has notification' do
|
|
|
|
before do
|
|
|
|
instructeur.follow(dossier)
|
|
|
|
dossier.touch(:last_commentaire_updated_at)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'assigns notification' do
|
|
|
|
subject
|
|
|
|
expect(assigns(:notifications_dossier_ids)).to eq([dossier.id])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
context 'as an expert' do
|
|
|
|
let(:user) { avis.experts_procedure.expert.user }
|
|
|
|
let(:query) { 'district' }
|
2021-05-06 01:14:57 +02:00
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
it 'returns only the dossier available to the expert' do
|
2024-01-11 18:35:19 +01:00
|
|
|
subject
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(1)
|
2021-11-19 12:29:24 +01:00
|
|
|
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier_with_expert.id)
|
2021-05-06 01:14:57 +02:00
|
|
|
end
|
|
|
|
end
|
2021-11-19 12:29:24 +01:00
|
|
|
end
|
2021-05-06 01:14:57 +02:00
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
describe 'by private annotations' do
|
|
|
|
let(:query) { 'invalid' }
|
2021-05-06 01:14:57 +02:00
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
before { subject }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'returns the expected dossier' do
|
|
|
|
expect(assigns(:projected_dossiers).count).to eq(1)
|
|
|
|
expect(assigns(:projected_dossiers).first.dossier_id).to eq(dossier_with_expert.id)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'as an expert' do
|
|
|
|
let(:user) { avis.experts_procedure.expert.user }
|
2021-05-06 01:14:57 +02:00
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
2021-11-19 12:29:24 +01:00
|
|
|
it 'does not allow experts to search in private annotations' do
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
2018-02-06 12:15:20 +01:00
|
|
|
end
|
|
|
|
end
|
2017-07-31 11:58:52 +02:00
|
|
|
end
|
2019-05-22 14:34:46 +02:00
|
|
|
|
|
|
|
context 'with no query param it does not crash' do
|
|
|
|
subject { get :index, params: {} }
|
|
|
|
|
|
|
|
it { is_expected.to have_http_status(200) }
|
|
|
|
|
|
|
|
it 'returns 0 dossier' do
|
|
|
|
subject
|
2021-05-06 01:14:57 +02:00
|
|
|
expect(assigns(:projected_dossiers).count).to eq(0)
|
2019-05-22 14:34:46 +02:00
|
|
|
end
|
|
|
|
end
|
2017-07-31 11:58:52 +02:00
|
|
|
end
|
|
|
|
end
|