RSpec.describe API::Public::V1::StatsController, type: :controller do describe '#index' do let(:params) { { id: procedure.id } } subject(:index_request) { get :index, params: params } shared_examples 'the procedure is found' do before do create(:dossier, :en_instruction, procedure: procedure) create(:dossier, :accepte, procedure: procedure) index_request end it { expect(response).to be_successful } it { expect(JSON.parse(response.body)).to match({ funnel: procedure.stats_dossiers_funnel.as_json, processed: procedure.stats_termines_states.as_json, processed_by_week: procedure.stats_termines_by_week.as_json, processing_time: procedure.stats_usual_traitement_time.as_json, processing_time_by_month: procedure.stats_usual_traitement_time_by_month_in_days.as_json }.with_indifferent_access) } end shared_examples 'the procedure is not found' do before { index_request } it { expect(response).to have_http_status(:not_found) } it { expect(response).to have_failed_with("procedure #{procedure.id} is not found") } end context 'when the procedure is found' do context 'when the procedure is publiee' do context 'when the procedure is opendata' do it_behaves_like 'the procedure is found' do let(:procedure) { create(:procedure, :published, opendata: true) } end end context 'when the procedure is not opendata' do it_behaves_like 'the procedure is not found' do let(:procedure) { create(:procedure, :published, opendata: false) } end end end context 'when the procedure is brouillon' do context 'when the procedure is opendata' do it_behaves_like 'the procedure is found' do let(:procedure) { create(:procedure, :draft, opendata: true) } end end context 'when the procedure is not opendata' do it_behaves_like 'the procedure is not found' do let(:procedure) { create(:procedure, :draft, opendata: false) } end end end context 'when the procedure is not publiee and not brouillon' do it_behaves_like 'the procedure is not found' do let(:procedure) { create(:procedure, :closed) } end end end context 'when the procedure is not found' do it_behaves_like 'the procedure is not found' do let(:procedure) { double(Procedure, id: -1) } end end end end