2021-11-25 16:26:55 +01:00
describe Administrateurs :: ProceduresController , type : :controller do
2018-04-13 16:56:00 +02:00
let ( :admin ) { create ( :administrateur ) }
2019-09-24 16:38:58 +02:00
let ( :bad_procedure_id ) { 100000 }
let ( :path ) { 'ma-jolie-demarche' }
let ( :libelle ) { 'Démarche de test' }
let ( :description ) { 'Description de test' }
let ( :organisation ) { 'Organisation de test' }
2021-12-01 21:38:41 +01:00
let ( :ministere ) { create ( :zone ) }
2019-09-24 16:38:58 +02:00
let ( :cadre_juridique ) { 'cadre juridique' }
let ( :duree_conservation_dossiers_dans_ds ) { 3 }
let ( :monavis_embed ) { nil }
let ( :lien_site_web ) { 'http://mon-site.gouv.fr' }
2022-09-26 19:02:39 +02:00
let ( :zone ) { create ( :zone ) }
let ( :zone_ids ) { [ zone . id ] }
2022-10-20 13:07:47 +02:00
let ( :tags ) { " [ \" planete \" , \" environnement \" ] " }
2018-04-13 16:56:00 +02:00
2023-04-13 13:10:23 +02:00
describe '#apercu' do
2022-03-15 11:14:45 +01:00
render_views
let ( :procedure ) { create ( :procedure , :with_all_champs ) }
2018-04-13 16:56:00 +02:00
2022-09-02 10:51:56 +02:00
subject { get :apercu , params : { id : procedure . id } }
2018-04-13 16:56:00 +02:00
before do
2019-08-09 10:46:39 +02:00
sign_in ( admin . user )
2018-04-13 16:56:00 +02:00
end
2022-04-07 11:40:53 +02:00
it do
2022-09-02 10:51:56 +02:00
subject
2022-04-07 11:40:53 +02:00
expect ( response ) . to have_http_status ( :ok )
expect ( procedure . dossiers . visible_by_user ) . to be_empty
expect ( procedure . dossiers . for_procedure_preview ) . not_to be_empty
end
2022-09-02 10:51:56 +02:00
context 'when the draft is invalid' do
before do
allow_any_instance_of ( ProcedureRevision ) . to receive ( :invalid? ) . and_return ( true )
end
it do
subject
expect ( response ) . to redirect_to ( champs_admin_procedure_path ( procedure ) )
expect ( flash [ :alert ] ) . to be_present
end
end
2018-04-13 16:56:00 +02:00
end
2019-09-24 16:38:58 +02:00
let ( :procedure_params ) {
{
path : path ,
libelle : libelle ,
description : description ,
organisation : organisation ,
2021-12-01 21:38:41 +01:00
ministere : ministere ,
2019-09-24 16:38:58 +02:00
cadre_juridique : cadre_juridique ,
duree_conservation_dossiers_dans_ds : duree_conservation_dossiers_dans_ds ,
monavis_embed : monavis_embed ,
2022-09-26 19:02:39 +02:00
zone_ids : zone_ids ,
2022-10-20 13:07:47 +02:00
lien_site_web : lien_site_web ,
tags : tags
2019-09-24 16:38:58 +02:00
}
}
before do
sign_in ( admin . user )
end
2020-07-28 15:15:56 +02:00
describe 'GET #index' do
subject { get :index }
it { expect ( response . status ) . to eq ( 200 ) }
end
describe 'GET #index with sorting and pagination' do
before do
create ( :procedure , administrateur : admin )
admin . reload
end
subject {
get :index , params : {
'statut' : 'publiees'
}
}
it { expect ( subject . status ) . to eq ( 200 ) }
end
2022-10-24 16:43:18 +02:00
describe 'GET #all' do
2022-11-10 15:35:01 +01:00
let! ( :draft_procedure ) { create ( :procedure ) }
let! ( :published_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 ) }
let! ( :closed_procedure ) { create ( :procedure , :closed ) }
2022-10-24 16:43:18 +02:00
subject { get :all }
it { expect ( subject . status ) . to eq ( 200 ) }
2022-11-25 19:55:59 +01:00
context 'for export' do
subject { get :all , format : :xlsx }
it 'exports result in xlsx' do
2022-12-16 15:24:05 +01:00
allow ( ProcedureDetail ) . to receive ( :to_xlsx )
2022-11-25 19:55:59 +01:00
subject
2022-12-16 15:24:05 +01:00
expect ( ProcedureDetail ) . to have_received ( :to_xlsx )
2022-11-25 19:55:59 +01:00
end
end
2022-11-10 15:35:01 +01:00
it 'display published or closed procedures' do
2022-10-24 16:43:18 +02:00
subject
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == published_procedure . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == closed_procedure . id } ) . to be_truthy
2022-11-10 15:35:01 +01:00
end
it 'doesn’ t display draft procedures' do
subject
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == draft_procedure . id } ) . to be_falsey
2022-11-10 15:35:01 +01:00
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
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_falsey
2022-11-10 15:35:01 +01:00
end
2023-02-24 17:27:28 +01:00
context " without zones " do
let! ( :procedure ) { create ( :procedure , :published , zones : [ ] ) }
subject { get :all }
it 'displays procedures without zones' do
subject
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure . id } ) . to be_truthy
end
end
2022-11-10 15:35:01 +01:00
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' ] }
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_falsey
2022-11-10 15:35:01 +01:00
end
it 'display only closed procedures' do
get :all , params : { statuses : [ 'close' ] }
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_falsey
2022-11-10 15:35:01 +01:00
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 }
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure3 . id } ) . to be_falsey
2022-11-10 15:35:01 +01:00
end
end
2022-11-16 11:03:23 +01:00
2023-04-10 13:00:13 +02:00
context 'with specific service' do
let ( :requested_siret ) { '13001501900024' }
let ( :another_siret ) { '11000004900012' }
let ( :requested_service ) { create ( :service , siret : requested_siret ) }
let ( :another_service ) { create ( :service , siret : another_siret ) }
let! ( :procedure1 ) { create ( :procedure , :published , service : another_service ) }
let! ( :procedure2 ) { create ( :procedure , :published , service : requested_service ) }
it 'display only procedures with specific service (identified by siret)' do
get :all , params : { service_siret : requested_siret }
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_falsey
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_truthy
end
end
context 'with a siret which does not identify a service' do
let ( :requested_siret ) { '13001501900024' }
let ( :another_siret ) { '11000004900012' }
let ( :another_service ) { create ( :service , siret : another_siret ) }
let! ( :procedure1 ) { create ( :procedure , :published , service : another_service ) }
it 'displays none procedure' do
get :all , params : { service_siret : requested_siret }
expect ( assigns ( :procedures ) ) . to be_empty
end
end
2023-01-16 16:56:20 +01:00
context 'with specific tag' do
2023-03-02 22:07:44 +01:00
let! ( :tags_procedure ) { create ( :procedure , :published , tags : [ 'environnement' , 'diplomatie' ] ) }
2023-01-16 16:56:20 +01:00
2023-03-02 22:07:44 +01:00
it 'returns procedure who contains at least one tag included in params' do
get :all , params : { tags : [ 'environnement' ] }
expect ( assigns ( :procedures ) . any? { | p | p . id == tags_procedure . id } ) . to be_truthy
end
it 'returns procedures who contains all tags included in params' do
get :all , params : { tags : [ 'environnement' , 'diplomatie' ] }
expect ( assigns ( :procedures ) . any? { | p | p . id == tags_procedure . id } ) . to be_truthy
end
it 'does not returns the procedure' do
get :all , params : { tags : [ 'environnement' , 'diplomatie' , 'football' ] }
expect ( assigns ( :procedures ) . any? { | p | p . id == tags_procedure . id } ) . to be_falsey
2023-01-16 16:56:20 +01:00
end
end
2022-11-16 11:03:23 +01:00
context 'with libelle search' do
let! ( :procedure1 ) { create ( :procedure , :published , libelle : 'Demande de subvention' ) }
let! ( :procedure2 ) { create ( :procedure , :published , libelle : " Fonds d'aide public « Prime Entrepreneurs des Quartiers » " ) }
let! ( :procedure3 ) { create ( :procedure , :published , libelle : " Hackaton pour entrepreneurs en résidence " ) }
it 'returns procedures with specific terms in libelle' do
get :all , params : { libelle : 'entrepreneur' }
2022-12-16 15:24:05 +01:00
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure2 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure3 . id } ) . to be_truthy
expect ( assigns ( :procedures ) . any? { | p | p . id == procedure1 . id } ) . to be_falsey
2022-11-16 11:03:23 +01:00
end
end
2022-11-10 15:35:01 +01:00
end
2022-10-24 16:43:18 +02:00
2022-11-10 15:35:01 +01:00
describe 'GET #administrateurs' do
let! ( :draft_procedure ) { create ( :procedure , administrateur : admin3 ) }
let! ( :published_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 , administrateur : admin1 ) }
2022-11-21 17:40:54 +01:00
let! ( :antoher_published_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 , administrateur : admin4 ) }
let! ( :closed_procedure ) { create ( :procedure , :closed , administrateur : admin2 ) }
let ( :admin1 ) { create ( :administrateur , email : 'jesuis.surmene@education.gouv.fr' ) }
let ( :admin2 ) { create ( :administrateur , email : 'jesuis.alecoute@social.gouv.fr' ) }
let ( :admin3 ) { create ( :administrateur , email : 'gerard.lambert@interieur.gouv.fr' ) }
let ( :admin4 ) { create ( :administrateur , email : 'jack.lang@culture.gouv.fr' ) }
2022-11-10 15:35:01 +01:00
it 'displays admins of the procedures' do
get :administrateurs
expect ( assigns ( :admins ) ) . to include ( admin1 )
expect ( assigns ( :admins ) ) . to include ( admin2 )
2022-11-21 17:40:54 +01:00
expect ( assigns ( :admins ) ) . to include ( admin4 )
2022-11-10 15:35:01 +01:00
expect ( assigns ( :admins ) ) . not_to include ( admin3 )
2022-11-04 12:18:02 +01:00
end
2022-11-21 17:40:54 +01:00
context 'with email search' do
it 'returns procedures with specific terms in libelle' do
get :administrateurs , params : { email : 'jesuis' }
expect ( assigns ( :admins ) ) . to include ( admin1 )
expect ( assigns ( :admins ) ) . to include ( admin2 )
expect ( assigns ( :admins ) ) . not_to include ( admin3 )
expect ( assigns ( :admins ) ) . not_to include ( admin4 )
end
end
2022-10-24 16:43:18 +02:00
end
2022-07-22 15:40:22 +02:00
describe 'POST #search' do
2021-08-31 23:44:23 +02:00
before do
2021-11-25 16:26:55 +01:00
stub_const ( " Administrateurs::ProceduresController::SIGNIFICANT_DOSSIERS_THRESHOLD " , 2 )
2021-08-31 23:44:23 +02:00
end
2022-07-22 15:40:22 +02:00
let ( :query ) { 'Procedure' }
subject { post :search , params : { query : query } , format : :turbo_stream }
2021-08-31 23:44:23 +02:00
let ( :grouped_procedures ) { subject ; assigns ( :grouped_procedures ) }
let ( :response_procedures ) { grouped_procedures . map { | _o , procedures | procedures } . flatten }
describe 'selecting' do
let! ( :large_draft_procedure ) { create ( :procedure_with_dossiers , dossiers_count : 2 ) }
let! ( :large_published_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 ) }
let! ( :large_closed_procedure ) { create ( :procedure_with_dossiers , :closed , dossiers_count : 2 ) }
let! ( :small_closed_procedure ) { create ( :procedure_with_dossiers , :closed , dossiers_count : 1 ) }
it 'displays published and closed procedures' do
expect ( response_procedures ) . to include ( large_published_procedure )
expect ( response_procedures ) . to include ( large_closed_procedure )
end
it 'doesn’ t display procedures without a significant number of dossiers' do
expect ( response_procedures ) . not_to include ( small_closed_procedure )
end
it 'doesn’ t display draft procedures' do
expect ( response_procedures ) . not_to include ( large_draft_procedure )
end
end
describe 'grouping' do
let ( :service_1 ) { create ( :service , nom : 'DDT des Vosges' ) }
let ( :service_2 ) { create ( :service , nom : 'DDT du Loiret' ) }
let! ( :procedure_with_service_1 ) { create ( :procedure_with_dossiers , :published , organisation : nil , service : service_1 , dossiers_count : 2 ) }
let! ( :procedure_with_service_2 ) { create ( :procedure_with_dossiers , :published , organisation : nil , service : service_2 , dossiers_count : 2 ) }
let! ( :procedure_without_service ) { create ( :procedure_with_dossiers , :published , organisation : 'DDT du Loiret' , dossiers_count : 2 ) }
it 'groups procedures with services as well as procedures with organisations' do
expect ( grouped_procedures . length ) . to eq 2
expect ( grouped_procedures . find { | o , _p | o == 'DDT des Vosges' } . last ) . to contain_exactly ( procedure_with_service_1 )
expect ( grouped_procedures . find { | o , _p | o == 'DDT du Loiret' } . last ) . to contain_exactly ( procedure_with_service_2 , procedure_without_service )
end
end
2022-07-22 15:40:22 +02:00
describe 'searching' do
let! ( :matching_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 , libelle : 'éléctriCITE' ) }
let! ( :unmatching_procedure ) { create ( :procedure_with_dossiers , :published , dossiers_count : 2 , libelle : 'temoin' ) }
let ( :query ) { 'ELECTRIcité' }
it 'is case insentivite and unaccented' do
expect ( response_procedures ) . to include ( matching_procedure )
expect ( response_procedures ) . not_to include ( unmatching_procedure )
end
end
2021-08-31 23:44:23 +02:00
end
2019-09-24 16:38:58 +02:00
describe 'GET #edit' do
let ( :published_at ) { nil }
let ( :procedure ) { create ( :procedure , administrateur : admin , published_at : published_at ) }
let ( :procedure_id ) { procedure . id }
subject { get :edit , params : { id : procedure_id } }
context 'when user is not connected' do
before do
sign_out ( admin . user )
end
it { is_expected . to redirect_to new_user_session_path }
end
context 'when user is connected' do
context 'when procedure exist' do
let ( :procedure_id ) { procedure . id }
it { is_expected . to have_http_status ( :success ) }
end
context 'when procedure is published' do
let ( :published_at ) { Time . zone . now }
it { is_expected . to have_http_status ( :success ) }
end
context 'when procedure doesn’ t exist' do
let ( :procedure_id ) { bad_procedure_id }
it { is_expected . to have_http_status ( 404 ) }
end
end
end
2022-09-26 19:02:39 +02:00
describe 'GET #zones' do
let ( :procedure ) { create ( :procedure , administrateur : admin ) }
let ( :procedure_id ) { procedure . id }
subject { get :zones , params : { id : procedure_id } }
it { is_expected . to have_http_status ( :success ) }
end
2019-09-24 16:38:58 +02:00
describe 'POST #create' do
context 'when all attributs are filled' do
describe 'new procedure in database' do
subject { post :create , params : { procedure : procedure_params } }
it { expect { subject } . to change { Procedure . count } . by ( 1 ) }
end
context 'when procedure is correctly save' do
before do
post :create , params : { procedure : procedure_params }
end
describe 'procedure attributs in database' do
subject { Procedure . last }
it { expect ( subject . libelle ) . to eq ( libelle ) }
it { expect ( subject . description ) . to eq ( description ) }
it { expect ( subject . organisation ) . to eq ( organisation ) }
it { expect ( subject . administrateurs ) . to eq ( [ admin ] ) }
it { expect ( subject . duree_conservation_dossiers_dans_ds ) . to eq ( duree_conservation_dossiers_dans_ds ) }
2022-10-20 13:07:47 +02:00
it { expect ( subject . tags ) . to eq ( [ " planete " , " environnement " ] ) }
2019-09-24 16:38:58 +02:00
end
2020-07-07 12:03:32 +02:00
it { is_expected . to redirect_to ( champs_admin_procedure_path ( Procedure . last ) ) }
2019-09-24 16:38:58 +02:00
it { expect ( flash [ :notice ] ) . to be_present }
end
2023-01-12 13:04:21 +01:00
describe " procedure is saved with custom retention period " do
let ( :duree_conservation_dossiers_dans_ds ) { 17 }
before do
stub_const ( " Procedure::NEW_MAX_DUREE_CONSERVATION " , 18 )
end
subject { post :create , params : { procedure : procedure_params } }
it { expect { subject } . to change { Procedure . count } . by ( 1 ) }
it " must save retention period and max retention period " do
subject
last_procedure = Procedure . last
expect ( last_procedure . duree_conservation_dossiers_dans_ds ) . to eq ( duree_conservation_dossiers_dans_ds )
expect ( last_procedure . max_duree_conservation_dossiers_dans_ds ) . to eq ( Procedure :: NEW_MAX_DUREE_CONSERVATION )
end
end
2019-09-24 16:38:58 +02:00
context 'when procedure is correctly saved' do
let ( :instructeur ) { admin . instructeur }
before do
post :create , params : { procedure : procedure_params }
end
describe " admin can also instruct the procedure as a instructeur " do
subject { Procedure . last }
it { expect ( subject . defaut_groupe_instructeur . instructeurs ) . to include ( instructeur ) }
end
end
end
context 'when many attributs are not valid' do
let ( :libelle ) { '' }
let ( :description ) { '' }
describe 'no new procedure in database' do
subject { post :create , params : { procedure : procedure_params } }
it { expect { subject } . to change { Procedure . count } . by ( 0 ) }
describe 'no new module api carto in database' do
it { expect { subject } . to change { ModuleAPICarto . count } . by ( 0 ) }
end
end
describe 'flash message is present' do
before do
post :create , params : { procedure : procedure_params }
end
it { expect ( flash [ :alert ] ) . to be_present }
end
end
end
describe 'PUT #update' do
2022-02-22 16:09:00 +01:00
let! ( :procedure ) { create ( :procedure , :with_type_de_champ , administrateur : admin , procedure_expires_when_termine_enabled : false ) }
2019-09-24 16:38:58 +02:00
context 'when administrateur is not connected' do
before do
sign_out ( admin . user )
end
subject { put :update , params : { id : procedure . id } }
it { is_expected . to redirect_to new_user_session_path }
end
context 'when administrateur is connected' do
def update_procedure
2022-02-22 16:09:00 +01:00
put :update , params : { id : procedure . id , procedure : procedure_params . merge ( procedure_expires_when_termine_enabled : true ) }
2019-09-24 16:38:58 +02:00
procedure . reload
end
context 'when all attributs are present' do
let ( :libelle ) { 'Blable' }
let ( :description ) { 'blabla' }
let ( :organisation ) { 'plop' }
let ( :duree_conservation_dossiers_dans_ds ) { 7 }
2022-02-22 16:09:00 +01:00
let ( :procedure_expires_when_termine_enabled ) { true }
2019-09-24 16:38:58 +02:00
before { update_procedure }
describe 'procedure attributs in database' do
subject { procedure }
it { expect ( subject . libelle ) . to eq ( libelle ) }
it { expect ( subject . description ) . to eq ( description ) }
it { expect ( subject . organisation ) . to eq ( organisation ) }
it { expect ( subject . duree_conservation_dossiers_dans_ds ) . to eq ( duree_conservation_dossiers_dans_ds ) }
2022-02-22 16:09:00 +01:00
it { expect ( subject . procedure_expires_when_termine_enabled ) . to eq ( true ) }
2019-09-24 16:38:58 +02:00
end
2022-02-22 16:09:00 +01:00
it { is_expected . to redirect_to ( admin_procedure_path id : procedure . id ) }
2019-09-24 16:38:58 +02:00
it { expect ( flash [ :notice ] ) . to be_present }
end
context 'when many attributs are not valid' do
before { update_procedure }
let ( :libelle ) { '' }
let ( :description ) { '' }
describe 'flash message is present' do
it { expect ( flash [ :alert ] ) . to be_present }
end
end
context 'when procedure is brouillon' do
let ( :procedure ) { create ( :procedure_with_dossiers , :with_path , :with_type_de_champ , administrateur : admin ) }
let! ( :dossiers_count ) { procedure . dossiers . count }
describe 'dossiers are dropped' do
subject { update_procedure }
it {
expect ( dossiers_count ) . to eq ( 1 )
expect ( subject . dossiers . count ) . to eq ( 0 )
}
end
end
context 'when procedure is published' do
let ( :procedure ) { create ( :procedure , :with_type_de_champ , :published , administrateur : admin ) }
subject { update_procedure }
describe 'only some properties can be updated' do
it { expect ( subject . libelle ) . to eq procedure_params [ :libelle ] }
it { expect ( subject . description ) . to eq procedure_params [ :description ] }
it { expect ( subject . organisation ) . to eq procedure_params [ :organisation ] }
it { expect ( subject . for_individual ) . not_to eq procedure_params [ :for_individual ] }
end
end
end
end
2021-09-01 00:20:32 +02:00
describe 'PUT #clone' do
let ( :procedure ) { create ( :procedure , :with_notice , :with_deliberation , administrateur : admin ) }
let ( :params ) { { procedure_id : procedure . id } }
subject { put :clone , params : params }
before do
procedure
response = Typhoeus :: Response . new ( code : 200 , body : 'Hello world' )
Typhoeus . stub ( / active_storage \/ disk / ) . and_return ( response )
end
it { expect { subject } . to change ( Procedure , :count ) . by ( 1 ) }
context 'when admin is the owner of the procedure' do
before { subject }
it 'creates a new procedure and redirect to it' do
2022-08-17 09:06:04 +02:00
expect ( response ) . to redirect_to admin_procedure_path ( id : Procedure . last . id )
2021-09-01 00:20:32 +02:00
expect ( Procedure . last . cloned_from_library ) . to be_falsey
expect ( Procedure . last . notice . attached? ) . to be_truthy
expect ( Procedure . last . deliberation . attached? ) . to be_truthy
2023-05-16 17:54:37 +02:00
expect ( flash [ :notice ] ) . to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.'
2021-09-01 00:20:32 +02:00
end
context 'when the procedure is cloned from the library' do
let ( :params ) { { procedure_id : procedure . id , from_new_from_existing : true } }
it { expect ( Procedure . last . cloned_from_library ) . to be ( true ) }
end
end
context 'when admin is not the owner of the procedure' do
let ( :admin_2 ) { create ( :administrateur ) }
before do
sign_out ( admin . user )
sign_in ( admin_2 . user )
subject
end
it 'creates a new procedure and redirect to it' do
2022-08-17 09:06:04 +02:00
expect ( response ) . to redirect_to admin_procedure_path ( id : Procedure . last . id )
2023-05-16 17:54:37 +02:00
expect ( flash [ :notice ] ) . to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.'
2021-09-01 00:20:32 +02:00
end
end
2023-05-16 10:59:17 +02:00
context 'when procedure has invalid fields' do
let ( :admin_2 ) { create ( :administrateur ) }
let ( :path ) { 'spec/fixtures/files/invalid_file_format.json' }
before do
sign_out ( admin . user )
sign_in ( admin_2 . user )
procedure . notice . attach ( io : File . open ( path ) ,
filename : " invalid_file_format.json " ,
content_type : " application/json " ,
metadata : { virus_scan_result : ActiveStorage :: VirusScanner :: SAFE } )
procedure . deliberation . attach ( io : File . open ( path ) ,
filename : " invalid_file_format.json " ,
content_type : " application/json " ,
metadata : { virus_scan_result : ActiveStorage :: VirusScanner :: SAFE } )
procedure . created_at = Date . new ( 2020 , 2 , 27 )
procedure . save!
subject { put :clone , params : { procedure_id : procedure . id } }
end
it 'empty invalid fields and allow procedure to be cloned' do
expect ( response ) . to redirect_to admin_procedure_path ( id : Procedure . last . id )
expect ( Procedure . last . notice . attached? ) . to be_falsey
expect ( Procedure . last . deliberation . attached? ) . to be_falsey
2023-05-16 17:54:37 +02:00
expect ( flash [ :notice ] ) . to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.'
2023-05-16 10:59:17 +02:00
end
end
2021-09-01 00:20:32 +02:00
end
2021-09-01 00:25:00 +02:00
describe 'PUT #archive' do
let ( :procedure ) { create ( :procedure , :published , administrateur : admin , lien_site_web : lien_site_web ) }
2022-05-27 16:04:04 +02:00
context 'when the admin is an owner of the procedure without procedure replacement' do
2021-09-01 00:25:00 +02:00
before do
put :archive , params : { procedure_id : procedure . id }
procedure . reload
end
it 'archives the procedure' do
expect ( procedure . close? ) . to be_truthy
expect ( response ) . to redirect_to :admin_procedures
expect ( flash [ :notice ] ) . to have_content 'Démarche close'
end
2022-05-27 16:04:04 +02:00
it 'does not have any replacement procedure' do
expect ( procedure . replaced_by_procedure ) . to be_nil
end
end
context 'when the admin is an owner of the procedure with procedure replacement' do
let ( :new_procedure ) { create ( :procedure , :published , administrateur : admin , lien_site_web : lien_site_web ) }
before do
put :archive , params : { procedure_id : procedure . id , new_procedure : new_procedure }
procedure . reload
end
it 'archives the procedure' do
expect ( procedure . close? ) . to be_truthy
expect ( response ) . to redirect_to :admin_procedures
expect ( flash [ :notice ] ) . to have_content 'Démarche close'
end
it 'does have a replacement procedure' do
expect ( procedure . replaced_by_procedure ) . to eq ( new_procedure )
end
2021-09-01 00:25:00 +02:00
end
context 'when the admin is not an owner of the procedure' do
let ( :admin_2 ) { create ( :administrateur ) }
before do
sign_out ( admin . user )
sign_in ( admin_2 . user )
put :archive , params : { procedure_id : procedure . id }
procedure . reload
end
it 'displays an error message' do
expect ( response ) . to redirect_to :admin_procedures
expect ( flash [ :alert ] ) . to have_content 'Démarche inexistante'
end
end
end
2021-09-01 00:08:51 +02:00
describe 'DELETE #destroy' do
let ( :procedure_draft ) { create ( :procedure , administrateurs : [ admin ] ) }
let ( :procedure_published ) { create ( :procedure , :published , administrateurs : [ admin ] ) }
let ( :procedure_closed ) { create ( :procedure , :closed , administrateurs : [ admin ] ) }
let ( :procedure ) { dossier . procedure }
subject { delete :destroy , params : { id : procedure } }
context 'when the procedure is a brouillon' do
let ( :dossier ) { create ( :dossier , :en_instruction , procedure : procedure_draft ) }
before { subject }
it 'deletes associated dossiers' do
2022-03-09 10:29:16 +01:00
expect ( procedure . dossiers . count ) . to eq ( 0 )
2021-09-01 00:08:51 +02:00
end
it 'redirects to the procedure drafts page' do
expect ( response ) . to redirect_to admin_procedures_draft_path
expect ( flash [ :notice ] ) . to be_present
end
end
context 'when procedure is published' do
let ( :dossier ) { create ( :dossier , :en_instruction , procedure : procedure_published ) }
before { subject }
it { expect ( response . status ) . to eq 403 }
context 'when dossier is en_construction' do
let ( :dossier ) { create ( :dossier , :en_construction , procedure : procedure_published ) }
2022-01-12 11:31:05 +01:00
it do
expect ( procedure . reload . close? ) . to be_truthy
expect ( procedure . discarded? ) . to be_truthy
2022-03-09 10:29:16 +01:00
expect ( dossier . reload . visible_by_administration? ) . to be_falsy
2022-01-12 11:31:05 +01:00
end
end
context 'when dossier is accepte' do
let ( :dossier ) { create ( :dossier , :accepte , procedure : procedure_published ) }
it do
expect ( procedure . reload . close? ) . to be_truthy
expect ( procedure . discarded? ) . to be_truthy
expect ( dossier . reload . hidden_by_administration? ) . to be_truthy
end
2021-09-01 00:08:51 +02:00
end
end
context 'when procedure is closed' do
let ( :dossier ) { create ( :dossier , :en_instruction , procedure : procedure_closed ) }
before { subject }
it { expect ( response . status ) . to eq 403 }
context 'when dossier is en_construction' do
let ( :dossier ) { create ( :dossier , :en_construction , procedure : procedure_published ) }
2022-01-12 11:31:05 +01:00
it do
expect ( procedure . reload . discarded? ) . to be_truthy
2022-03-09 10:29:16 +01:00
expect ( dossier . reload . visible_by_administration? ) . to be_falsy
2022-01-12 11:31:05 +01:00
end
end
context 'when dossier is accepte' do
let ( :dossier ) { create ( :dossier , :accepte , procedure : procedure_published ) }
it do
expect ( procedure . reload . discarded? ) . to be_truthy
expect ( dossier . reload . hidden_by_administration? ) . to be_truthy
end
2021-09-01 00:08:51 +02:00
end
end
context " when administrateur does not own the procedure " do
let ( :dossier ) { create ( :dossier ) }
it { expect { subject } . to raise_error ( ActiveRecord :: RecordNotFound ) }
end
end
2019-09-24 16:38:58 +02:00
describe 'PATCH #monavis' do
let! ( :procedure ) { create ( :procedure , administrateur : admin ) }
let ( :procedure_params ) {
{
monavis_embed : monavis_embed
}
}
context 'when administrateur is not connected' do
before do
sign_out ( admin . user )
end
subject { patch :update_monavis , params : { id : procedure . id } }
it { is_expected . to redirect_to new_user_session_path }
end
context 'when administrateur is connected' do
def update_monavis
patch :update_monavis , params : { id : procedure . id , procedure : procedure_params }
procedure . reload
end
let ( :monavis_embed ) {
<<-MSG
< a href = " https://monavis.numerique.gouv.fr/Demarches/123?&view-mode=formulaire-avis&nd_mode=en-ligne-enti%C3%A8rement&nd_source=button&key=cd4a872d475e4045666057f " >
< img src = " https://monavis.numerique.gouv.fr/monavis-static/bouton-blanc.png " alt = " Je donne mon avis " title = " Je donne mon avis sur cette démarche " / >
< / a>
MSG
}
context 'when all attributes are present' do
render_views
before { update_monavis }
context 'when the embed code is valid' do
describe 'the monavis field is updated' do
subject { procedure }
it { expect ( subject . monavis_embed ) . to eq ( monavis_embed ) }
end
it { expect ( flash [ :notice ] ) . to be_present }
it { expect ( response . body ) . to include " MonAvis " }
end
context 'when the embed code is not valid' do
let ( :monavis_embed ) { 'invalid embed code' }
describe 'the monavis field is not updated' do
subject { procedure }
it { expect ( subject . monavis_embed ) . to eq ( nil ) }
end
it { expect ( flash [ :alert ] ) . to be_present }
it { expect ( response . body ) . to include " MonAvis " }
end
end
context 'when procedure is published' do
let ( :procedure ) { create ( :procedure , :published , administrateur : admin ) }
subject { update_monavis }
describe 'the monavis field is not updated' do
it { expect ( subject . monavis_embed ) . to eq monavis_embed }
end
end
end
end
2020-04-27 14:58:12 +02:00
describe 'GET #jeton' do
let ( :procedure ) { create ( :procedure , administrateur : admin ) }
subject { get :jeton , params : { id : procedure . id } }
it { is_expected . to have_http_status ( :success ) }
end
describe 'PATCH #jeton' do
let ( :procedure ) { create ( :procedure , administrateur : admin ) }
2020-10-19 11:33:36 +02:00
let ( :token ) { " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c " }
2020-04-27 14:58:12 +02:00
2020-10-19 11:33:36 +02:00
subject { patch :update_jeton , params : { id : procedure . id , procedure : { api_entreprise_token : token } } }
before do
2020-08-05 18:40:47 +02:00
allow_any_instance_of ( APIEntreprise :: PrivilegesAdapter ) . to receive ( :valid? ) . and_return ( token_is_valid )
2020-10-19 11:33:36 +02:00
subject
end
context 'when jeton is valid' do
let ( :token_is_valid ) { true }
it { expect ( flash . alert ) . to be_nil }
it { expect ( flash . notice ) . to eq ( 'Le jeton a bien été mis à jour' ) }
it { expect ( procedure . reload . api_entreprise_token ) . to eq ( token ) }
end
context 'when jeton is invalid' do
let ( :token_is_valid ) { false }
2021-05-26 15:16:30 +02:00
it { expect ( flash . alert ) . to eq ( " Mise à jour impossible : le jeton n’ est pas valide " ) }
2020-10-19 11:33:36 +02:00
it { expect ( flash . notice ) . to be_nil }
it { expect ( procedure . reload . api_entreprise_token ) . not_to eq ( token ) }
end
context 'when jeton is not a jwt' do
let ( :token ) { " invalid " }
let ( :token_is_valid ) { true } # just to check jwt format by procedure model
2021-05-26 15:16:30 +02:00
it { expect ( flash . alert ) . to eq ( " Mise à jour impossible : le jeton n’ est pas valide " ) }
2020-10-19 11:33:36 +02:00
it { expect ( flash . notice ) . to be_nil }
it { expect ( procedure . reload . api_entreprise_token ) . not_to eq ( token ) }
2020-04-27 14:58:12 +02:00
end
end
2020-09-08 12:35:44 +02:00
describe 'PUT #publish' do
let ( :procedure ) { create ( :procedure , administrateur : admin , lien_site_web : lien_site_web ) }
let ( :procedure2 ) { create ( :procedure , :published , administrateur : admin , lien_site_web : lien_site_web ) }
let ( :procedure3 ) { create ( :procedure , :published , lien_site_web : lien_site_web ) }
let ( :lien_site_web ) { 'http://some.administration/' }
context 'when admin is the owner of the procedure' do
context 'procedure path does not exist' do
let ( :path ) { 'new_path' }
let ( :lien_site_web ) { 'http://mon-site.gouv.fr' }
before do
put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web }
procedure . reload
end
it 'publish the given procedure' do
expect ( procedure . publiee? ) . to be_truthy
expect ( procedure . path ) . to eq ( path )
expect ( procedure . lien_site_web ) . to eq ( lien_site_web )
end
it 'redirects to the procedure page' do
expect ( response . status ) . to eq 302
expect ( response . body ) . to include ( admin_procedure_path ( procedure . id ) )
expect ( flash [ :notice ] ) . to have_content 'Démarche publiée'
end
end
context 'procedure path exists and is owned by current administrator' do
before do
put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web }
procedure . reload
procedure2 . reload
end
let ( :path ) { procedure2 . path }
let ( :lien_site_web ) { 'http://mon-site.gouv.fr' }
it 'publish the given procedure' do
expect ( procedure . publiee? ) . to be_truthy
expect ( procedure . path ) . to eq ( path )
expect ( procedure . lien_site_web ) . to eq ( lien_site_web )
end
it 'depubliee previous procedure' do
expect ( procedure2 . depubliee? ) . to be_truthy
end
it 'redirects to the procedures page' do
expect ( response . status ) . to eq 302
expect ( response . body ) . to include ( admin_procedure_path ( procedure . id ) )
expect ( flash [ :notice ] ) . to have_content 'Démarche publiée'
end
end
context 'procedure path exists and is not owned by current administrator' do
let ( :path ) { procedure3 . path }
let ( :lien_site_web ) { 'http://mon-site.gouv.fr' }
it { expect { put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web } } . to raise_error ( ActiveRecord :: RecordInvalid ) }
end
context 'procedure path is invalid' do
let ( :lien_site_web ) { 'http://mon-site.gouv.fr' }
let ( :path ) { 'Invalid Procedure Path' }
it { expect { put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web } } . to raise_error ( ActiveRecord :: RecordInvalid ) }
end
2021-11-24 11:08:57 +01:00
context 'procedure revision is invalid' do
let ( :path ) { 'new_path' }
let ( :procedure ) do
create ( :procedure ,
administrateur : admin ,
lien_site_web : lien_site_web ,
2022-08-04 11:39:07 +02:00
types_de_champ_public : [ { type : :repetition , children : [ ] } ] )
2021-11-24 11:08:57 +01:00
end
it { expect { put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web } } . to raise_error ( ActiveRecord :: RecordInvalid ) }
end
2020-09-08 12:35:44 +02:00
end
context 'when admin is not the owner of the procedure' do
let ( :admin_2 ) { create ( :administrateur ) }
before do
sign_out ( admin . user )
sign_in ( admin_2 . user )
put :publish , params : { procedure_id : procedure . id , path : 'fake_path' }
procedure . reload
end
it 'fails' do
expect ( response ) . to have_http_status ( 404 )
end
end
context 'when the admin does not provide a lien_site_web' do
context 'procedure path is valid but lien_site_web is missing' do
let ( :path ) { 'new_path2' }
let ( :lien_site_web ) { nil }
it { expect { put :publish , params : { procedure_id : procedure . id , path : path , lien_site_web : lien_site_web } } . to raise_error ( ActiveRecord :: RecordInvalid ) }
end
end
end
describe 'POST #transfer' do
let! ( :procedure ) { create :procedure , :with_service , administrateur : admin }
before do
post :transfer , params : { email_admin : email_admin , procedure_id : procedure . id }
procedure . reload
end
subject do
post :transfer , params : { email_admin : email_admin , procedure_id : procedure . id }
end
context 'when admin is unknow' do
let ( :email_admin ) { 'plop' }
it { expect ( subject . status ) . to eq 302 }
2020-09-29 10:52:13 +02:00
it { expect ( response . body ) . to include ( admin_procedure_transfert_path ( procedure . id ) ) }
2020-09-08 12:35:44 +02:00
it { expect ( flash [ :alert ] ) . to be_present }
2021-05-26 15:16:30 +02:00
it { expect ( flash [ :alert ] ) . to eq ( " Envoi vers #{ email_admin } impossible : cet administrateur n’ existe pas " ) }
2020-09-08 12:35:44 +02:00
end
context 'when admin is known' do
let! ( :new_admin ) { create :administrateur , email : 'new_admin@admin.com' }
context " and its email address is correct " do
let ( :email_admin ) { 'new_admin@admin.com' }
it { expect ( subject . status ) . to eq 302 }
it { expect { subject } . to change ( new_admin . procedures , :count ) . by ( 1 ) }
it " should create a new service " do
subject
expect ( new_admin . procedures . last . service_id ) . not_to eq ( procedure . service_id )
end
end
context 'when admin is know but its email was not downcased' do
let ( :email_admin ) { " NEW_admin@adMIN.com " }
it { expect ( subject . status ) . to eq 302 }
it { expect { subject } . to change ( Procedure , :count ) . by ( 1 ) }
end
describe " correctly assigns the new admin " do
let ( :email_admin ) { 'new_admin@admin.com' }
before do
subject
end
it { expect ( Procedure . last . administrateurs ) . to eq [ new_admin ] }
end
end
end
2020-09-30 18:22:06 +02:00
describe 'PUT #allow_expert_review' do
let! ( :procedure ) { create :procedure , :with_service , administrateur : admin }
context 'when admin refuse to invite experts on this procedure' do
before do
procedure . update! ( allow_expert_review : false )
procedure . reload
end
it { expect ( procedure . allow_expert_review ) . to be_falsy }
end
context 'when admin accept to invite experts on this procedure (true by default)' do
it { expect ( procedure . allow_expert_review ) . to be_truthy }
end
end
2022-05-10 13:59:47 +02:00
2023-03-23 17:14:54 +01:00
describe 'PUT #allow_expert_messaging' do
let! ( :procedure ) { create :procedure , :with_service , administrateur : admin }
context 'when admin refuse to let experts discuss with users on this procedure' do
before do
procedure . update! ( allow_expert_messaging : false )
procedure . reload
end
it { expect ( procedure . allow_expert_messaging ) . to be_falsy }
end
context 'when admin accept to let experts discuss with users (true by default)' do
it { expect ( procedure . allow_expert_messaging ) . to be_truthy }
end
end
2022-05-10 13:59:47 +02:00
describe 'PUT #restore' do
2022-06-10 12:33:47 +02:00
let ( :procedure ) { create :procedure_with_dossiers , :with_service , :published , administrateur : admin }
before do
procedure . discard_and_keep_track! ( admin )
end
2022-05-10 13:59:47 +02:00
context 'when the admin wants to restore a procedure' do
before do
put :restore , params : { id : procedure . id }
procedure . reload
end
it { expect ( procedure . discarded? ) . to be_falsy }
2022-06-10 12:33:47 +02:00
it { expect ( procedure . dossiers . first . hidden_by_administration_at ) . to be_nil }
2022-05-10 13:59:47 +02:00
end
end
2018-04-13 16:56:00 +02:00
end