diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index 125c22302..57fff907e 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -88,68 +88,16 @@ describe Administrateurs::ProceduresController, type: :controller do end describe 'GET #all' do - let!(:draft_procedure) { create(:procedure) } - let!(:published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2) } - let!(:closed_procedure) { create(:procedure, :closed) } subject { get :all } it { expect(subject.status).to eq(200) } - it 'display published or closed procedures' do + it 'assigns ProceduresFilter' do + filter = double('filter') + expect(ProceduresFilter).to receive(:new).and_return(filter) subject - expect(assigns(:filter).procedures_result).to include(published_procedure) - expect(assigns(:filter).procedures_result).to include(closed_procedure) - end - it 'doesn’t display draft procedures' do - subject - expect(assigns(:filter).procedures_result).not_to include(draft_procedure) - end - - context "for specific zones" do - let(:zone1) { create(:zone) } - let(:zone2) { create(:zone) } - let!(:procedure1) { create(:procedure, :published, zones: [zone1]) } - let!(:procedure2) { create(:procedure, :published, zones: [zone1, zone2]) } - - subject { get :all, params: { zone_ids: [zone2.id] } } - - it 'display only procedures for specified zones' do - subject - expect(assigns(:filter).procedures_result).to include(procedure2) - expect(assigns(:filter).procedures_result).not_to include(procedure1) - end - end - - context 'for specific status' do - let!(:procedure1) { create(:procedure, :published) } - let!(:procedure2) { create(:procedure, :closed) } - - it 'display only published procedures' do - get :all, params: { statuses: ['publiee'] } - expect(assigns(:filter).procedures_result).to include(procedure1) - expect(assigns(:filter).procedures_result).not_to include(procedure2) - end - - it 'display only closed procedures' do - get :all, params: { statuses: ['close'] } - expect(assigns(:filter).procedures_result).to include(procedure2) - expect(assigns(:filter).procedures_result).not_to include(procedure1) - end - end - - context 'after specific date' do - let(:after) { Date.new(2022, 06, 30) } - let!(:procedure1) { create(:procedure, :published, published_at: after + 1.day) } - let!(:procedure2) { create(:procedure, :published, published_at: after + 2.days) } - let!(:procedure3) { create(:procedure, :published, published_at: after - 1.day) } - - it 'display only procedures published after specific date' do - get :all, params: { from_publication_date: after } - expect(assigns(:filter).procedures_result).to include(procedure1) - expect(assigns(:filter).procedures_result).to include(procedure2) - expect(assigns(:filter).procedures_result).not_to include(procedure3) - end + expect(assigns(:filter)).to be_present end end diff --git a/spec/models/procedures_filter_spec.rb b/spec/models/procedures_filter_spec.rb new file mode 100644 index 000000000..bedb6c1fe --- /dev/null +++ b/spec/models/procedures_filter_spec.rb @@ -0,0 +1,79 @@ +describe ProceduresFilter do + let(:admin) { create(:administrateur) } + let(:params) { ActionController::Parameters.new(filters) } + let(:subject) { ProceduresFilter.new(admin, params) } + + context 'without filter' do + let(:filters) { {} } + let!(:draft_procedure) { create(:procedure) } + let!(:published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2) } + let!(:closed_procedure) { create(:procedure, :closed) } + + it 'returns only published and closed procedures' do + expect(subject.procedures_result).to include(published_procedure) + expect(subject.procedures_result).to include(closed_procedure) + expect(subject.procedures_result).not_to include(draft_procedure) + end + end + + context 'with zone filter' do + let(:zone1) { create(:zone) } + let(:zone2) { create(:zone) } + let!(:procedure1) { create(:procedure, :published, zones: [zone1]) } + let!(:procedure2) { create(:procedure, :published, zones: [zone1, zone2]) } + let(:filters) { { zone_ids: [zone2.id] } } + + it 'returns only procedures for specified zones' do + expect(subject.procedures_result).to include(procedure2) + expect(subject.procedures_result).not_to include(procedure1) + end + end + + context 'with published status filter' do + let!(:procedure1) { create(:procedure, :published) } + let!(:procedure2) { create(:procedure, :closed) } + let(:filters) { { statuses: ['publiee'] } } + + it 'returns only published procedures' do + expect(subject.procedures_result).to include(procedure1) + expect(subject.procedures_result).not_to include(procedure2) + end + end + + context 'with closed status filter' do + let!(:procedure1) { create(:procedure, :published) } + let!(:procedure2) { create(:procedure, :closed) } + let(:filters) { { statuses: ['close'] } } + + it 'returns only closed procedures' do + expect(subject.procedures_result).to include(procedure2) + expect(subject.procedures_result).not_to include(procedure1) + end + end + + context 'with specific date filter' do + let(:after) { '2022-06-30' } + let(:after_date) { Date.parse(after) } + let!(:procedure1) { create(:procedure, :published, published_at: after_date + 1.day) } + let!(:procedure2) { create(:procedure, :published, published_at: after_date + 2.days) } + let!(:procedure3) { create(:procedure, :published, published_at: after_date - 1.day) } + + let(:filters) { { from_publication_date: after } } + + it 'returns only procedures published after specific date' do + expect(subject.procedures_result).to include(procedure1) + expect(subject.procedures_result).to include(procedure2) + expect(subject.procedures_result).not_to include(procedure3) + end + end + + context 'with bad date input' do + let(:after) { 'oops' } + let!(:procedure1) { create(:procedure, :published) } + let(:filters) { { from_publication_date: after } } + + it 'ignores date filter' do + expect(subject.procedures_result).to include(procedure1) + end + end +end