2021-11-25 16:26:55 +01:00
describe Administrateurs :: GroupeInstructeursController , type : :controller do
2019-10-17 15:13:50 +02:00
render_views
2023-04-26 17:29:47 +02:00
include Logic
2019-10-17 15:13:50 +02:00
let ( :admin ) { create ( :administrateur ) }
2023-06-29 11:45:20 +02:00
let ( :procedure ) { create ( :procedure , :routee , :published , :for_individual , administrateurs : [ admin ] ) }
2023-04-26 17:29:47 +02:00
2019-10-17 15:13:50 +02:00
let! ( :gi_1_1 ) { procedure . defaut_groupe_instructeur }
2023-06-29 11:45:20 +02:00
let! ( :gi_1_2 ) { procedure . defaut_groupe_instructeur . other_groupe_instructeurs . first }
2019-10-17 15:13:50 +02:00
2023-06-29 11:45:20 +02:00
let ( :procedure2 ) { create ( :procedure , :routee , :published ) }
let! ( :gi_2_2 ) { procedure2 . defaut_groupe_instructeur . other_groupe_instructeurs . first }
2019-10-17 15:13:50 +02:00
before { sign_in ( admin . user ) }
describe '#index' do
context 'of a procedure I own' do
2023-05-09 11:15:02 +02:00
before { get :index , params : }
2019-10-17 15:13:50 +02:00
context 'when a procedure has multiple groups' do
2023-05-09 11:15:02 +02:00
let ( :params ) { { procedure_id : procedure . id } }
it do
expect ( response ) . to have_http_status ( :ok )
expect ( response . body ) . to include ( gi_1_1 . label )
expect ( response . body ) . to include ( gi_1_2 . label )
end
context 'when there is a search' do
2023-06-29 11:45:20 +02:00
let ( :params ) { { procedure_id : procedure . id , q : 'deuxième' } }
2023-05-09 11:15:02 +02:00
it do
expect ( assigns ( :groupes_instructeurs ) ) . to match_array ( [ gi_1_2 ] )
end
end
2019-10-17 15:13:50 +02:00
end
end
end
2019-10-23 20:22:56 +02:00
describe '#show' do
context 'of a group I belong to' do
before { get :show , params : { procedure_id : procedure . id , id : gi_1_1 . id } }
it { expect ( response ) . to have_http_status ( :ok ) }
end
2020-06-12 18:16:07 +02:00
context 'when the routage is not activated on the procedure' do
let ( :procedure ) { create :procedure , administrateur : admin , instructeurs : [ instructeur_assigned_1 , instructeur_assigned_2 ] }
2022-03-24 12:38:32 +01:00
let! ( :instructeur_assigned_1 ) { create :instructeur , email : 'instructeur_1@ministere-a.gouv.fr' , administrateurs : [ admin ] }
let! ( :instructeur_assigned_2 ) { create :instructeur , email : 'instructeur_2@ministere-b.gouv.fr' , administrateurs : [ admin ] }
let! ( :instructeur_not_assigned_1 ) { create :instructeur , email : 'instructeur_3@ministere-a.gouv.fr' , administrateurs : [ admin ] }
let! ( :instructeur_not_assigned_2 ) { create :instructeur , email : 'instructeur_4@ministere-b.gouv.fr' , administrateurs : [ admin ] }
2020-06-12 18:16:07 +02:00
subject! { get :show , params : { procedure_id : procedure . id , id : gi_1_1 . id } }
it { expect ( response . status ) . to eq ( 200 ) }
it 'sets the assigned and not assigned instructeurs' do
expect ( assigns ( :instructeurs ) ) . to match_array ( [ instructeur_assigned_1 , instructeur_assigned_2 ] )
2022-03-24 12:38:32 +01:00
expect ( assigns ( :available_instructeur_emails ) ) . to match_array ( [ 'instructeur_3@ministere-a.gouv.fr' , 'instructeur_4@ministere-b.gouv.fr' ] )
2020-06-12 18:16:07 +02:00
end
end
2023-05-15 11:40:03 +02:00
context 'group without routing rule' do
before { get :show , params : { procedure_id : procedure . id , id : gi_1_1 . id } }
it do
expect ( response ) . to have_http_status ( :ok )
2023-06-16 15:11:33 +02:00
expect ( response . body ) . to include ( 'règle invalide' )
2023-05-15 11:40:03 +02:00
end
end
context 'group with routing rule matching tdc' do
let! ( :drop_down_tdc ) { create ( :type_de_champ_drop_down_list , procedure : procedure , drop_down_options : options ) }
let ( :options ) { procedure . groupe_instructeurs . pluck ( :label ) }
before do
gi_1_1 . update ( routing_rule : ds_eq ( champ_value ( drop_down_tdc . stable_id ) , constant ( gi_1_1 . label ) ) )
get :show , params : { procedure_id : procedure . id , id : gi_1_1 . id }
end
it do
expect ( response ) . to have_http_status ( :ok )
2023-06-16 15:11:33 +02:00
expect ( response . body ) . not_to include ( 'règle invalide' )
2023-05-15 11:40:03 +02:00
end
end
context 'group with routing rule not matching tdc' do
let! ( :drop_down_tdc ) { create ( :type_de_champ_drop_down_list , procedure : procedure , drop_down_options : options ) }
let ( :options ) { [ 'parmesan' , 'brie' , 'morbier' ] }
before do
gi_1_1 . update ( routing_rule : ds_eq ( champ_value ( drop_down_tdc . stable_id ) , constant ( gi_1_1 . label ) ) )
get :show , params : { procedure_id : procedure . id , id : gi_1_1 . id }
end
it do
expect ( response ) . to have_http_status ( :ok )
2023-06-16 15:11:33 +02:00
expect ( response . body ) . to include ( 'règle invalide' )
2023-05-15 11:40:03 +02:00
end
end
2019-10-23 20:22:56 +02:00
end
2019-10-23 20:51:25 +02:00
describe '#create' do
before do
post :create ,
params : {
procedure_id : procedure . id ,
groupe_instructeur : { label : label }
}
end
context 'with a valid name' do
let ( :label ) { " nouveau_groupe " }
it { expect ( flash . notice ) . to be_present }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , procedure . groupe_instructeurs . last ) ) }
2023-03-03 16:01:07 +01:00
it { expect ( procedure . groupe_instructeurs . count ) . to eq ( 3 ) }
2019-10-23 20:51:25 +02:00
end
context 'with an invalid group name' do
let ( :label ) { gi_1_1 . label }
it { expect ( response ) . to render_template ( :index ) }
2023-03-03 16:01:07 +01:00
it { expect ( procedure . groupe_instructeurs . count ) . to eq ( 2 ) }
2019-10-23 20:51:25 +02:00
it { expect ( flash . alert ) . to be_present }
end
end
2019-10-23 20:54:59 +02:00
2020-01-08 14:13:51 +01:00
describe '#destroy' do
def delete_group ( group )
delete :destroy ,
params : {
procedure_id : procedure . id ,
id : group . id
}
end
2023-04-18 16:40:53 +02:00
context 'default group' do
2023-03-03 16:01:07 +01:00
before do
delete_group gi_1_1
end
2020-01-08 14:13:51 +01:00
it { expect ( flash . alert ) . to be_present }
2023-04-18 16:40:53 +02:00
it { expect ( flash . alert ) . to eq " Suppression impossible : le groupe « défaut » est le groupe par défaut. " }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure ) ) }
2023-04-18 16:40:53 +02:00
it { expect ( procedure . groupe_instructeurs . count ) . to eq ( 2 ) }
2020-01-08 14:13:51 +01:00
end
context 'with many groups' do
2020-01-20 11:27:41 +01:00
context 'of a group that can be deleted' do
before { delete_group gi_1_2 }
2023-06-29 11:45:20 +02:00
it { expect ( flash . notice ) . to eq " le groupe « deuxième groupe » a été supprimé et le routage a été désactivé. " }
2020-01-20 11:27:41 +01:00
it { expect ( procedure . groupe_instructeurs . count ) . to eq ( 1 ) }
2022-10-14 17:10:42 +02:00
it { expect ( procedure . reload . routing_enabled? ) . to eq ( false ) }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure ) ) }
2020-01-08 14:13:51 +01:00
end
2020-01-20 11:27:41 +01:00
context 'of a group with dossiers, that cannot be deleted' do
let! ( :dossier12 ) { create ( :dossier , procedure : procedure , state : Dossier . states . fetch ( :en_construction ) , groupe_instructeur : gi_1_2 ) }
2020-01-08 14:13:51 +01:00
before { delete_group gi_1_2 }
2020-01-20 11:27:41 +01:00
it { expect ( flash . alert ) . to be_present }
it { expect ( procedure . groupe_instructeurs . count ) . to eq ( 2 ) }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure ) ) }
2020-01-08 14:13:51 +01:00
end
end
end
2020-01-08 16:26:12 +01:00
describe '#reaffecter_dossiers' do
2023-06-29 11:45:20 +02:00
let! ( :gi_1_3 ) { create ( :groupe_instructeur , label : 'groupe instructeur 3' , procedure : procedure ) }
2020-01-08 16:26:12 +01:00
before do
get :reaffecter_dossiers ,
params : {
procedure_id : procedure . id ,
id : gi_1_2 . id
}
end
def reaffecter_url ( group )
2020-07-07 12:03:32 +02:00
reaffecter_admin_procedure_groupe_instructeur_path ( :id = > gi_1_2 ,
2020-01-08 16:26:12 +01:00
:target_group = > group )
end
it { expect ( response ) . to have_http_status ( :ok ) }
it { expect ( response . body ) . to include ( reaffecter_url ( procedure . defaut_groupe_instructeur ) ) }
it { expect ( response . body ) . not_to include ( reaffecter_url ( gi_1_2 ) ) }
it { expect ( response . body ) . to include ( reaffecter_url ( gi_1_3 ) ) }
end
describe '#reaffecter' do
2023-06-29 11:45:20 +02:00
let! ( :gi_1_3 ) { create ( :groupe_instructeur , label : 'groupe instructeur 3' , procedure : procedure ) }
2021-01-28 13:53:18 +01:00
let! ( :dossier12 ) { create ( :dossier , :en_construction , :with_individual , procedure : procedure , groupe_instructeur : gi_1_1 ) }
2021-07-26 16:06:09 +02:00
let! ( :instructeur ) { create ( :instructeur ) }
let! ( :bulk_message ) { BulkMessage . create ( dossier_count : 2 , dossier_state : " brouillon " , body : " hello " , sent_at : Time . zone . now , groupe_instructeurs : [ gi_1_1 , gi_1_3 ] , instructeur : instructeur ) }
2020-01-08 16:26:12 +01:00
describe 'when the new group is a group of the procedure' do
before do
post :reaffecter ,
params : {
procedure_id : procedure . id ,
id : gi_1_1 . id ,
target_group : gi_1_2 . id
}
dossier12 . reload
2021-07-26 16:06:09 +02:00
bulk_message . reload
2020-01-08 16:26:12 +01:00
end
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure ) ) }
2020-01-08 16:26:12 +01:00
it { expect ( gi_1_2 . dossiers . last . id ) . to be ( dossier12 . id ) }
it { expect ( dossier12 . groupe_instructeur . id ) . to be ( gi_1_2 . id ) }
2023-07-05 11:13:01 +02:00
it { expect ( dossier12 . dossier_assignment . dossier_id ) . to be ( dossier12 . id ) }
it { expect ( dossier12 . dossier_assignment . groupe_instructeur_id ) . to be ( gi_1_2 . id ) }
it { expect ( dossier12 . dossier_assignment . assigned_by ) . to eq ( admin . email ) }
2021-12-16 17:07:49 +01:00
it { expect ( bulk_message . groupe_instructeurs ) . to contain_exactly ( gi_1_2 , gi_1_3 ) }
2020-01-08 16:26:12 +01:00
end
2020-01-20 11:27:41 +01:00
describe 'when the target group is not a possible group' do
subject {
2020-01-08 16:26:12 +01:00
post :reaffecter ,
params :
{
procedure_id : procedure . id ,
id : gi_1_1 . id ,
target_group : gi_2_2 . id
}
2020-01-20 11:27:41 +01:00
}
before do
2020-01-08 16:26:12 +01:00
dossier12 . reload
2021-07-26 16:06:09 +02:00
bulk_message . reload
2020-01-08 16:26:12 +01:00
end
2020-01-20 11:27:41 +01:00
it { expect { subject } . to raise_error ( ActiveRecord :: RecordNotFound ) }
2022-10-14 09:45:58 +02:00
it { expect ( bulk_message . groupe_instructeurs ) . to match_array ( [ gi_1_1 , gi_1_3 ] ) }
2020-01-08 16:26:12 +01:00
end
end
2019-10-23 20:54:59 +02:00
describe '#update' do
let ( :new_name ) { 'nouveau nom du groupe' }
2023-03-03 16:01:07 +01:00
let! ( :procedure_non_routee ) { create ( :procedure , :published , :for_individual , administrateurs : [ admin ] ) }
let! ( :gi_1_1 ) { procedure_non_routee . defaut_groupe_instructeur }
2019-10-23 20:54:59 +02:00
before do
patch :update ,
params : {
2023-03-03 16:01:07 +01:00
procedure_id : procedure_non_routee . id ,
2019-10-23 20:54:59 +02:00
id : gi_1_1 . id ,
2023-04-26 17:29:47 +02:00
groupe_instructeur : { label : new_name }
2019-10-23 20:54:59 +02:00
}
2022-06-20 16:14:27 +02:00
gi_1_1 . reload
2019-10-23 20:54:59 +02:00
end
2023-04-18 17:15:04 +02:00
it do
expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure_non_routee , gi_1_1 ) )
expect ( gi_1_1 . label ) . to eq ( new_name )
expect ( gi_1_1 . closed ) . to eq ( false )
expect ( flash . notice ) . to be_present
end
2019-10-23 20:54:59 +02:00
2023-04-26 17:29:47 +02:00
context 'when the name is already taken' do
2023-06-29 11:45:20 +02:00
let! ( :gi_1_2 ) { procedure_non_routee . groupe_instructeurs . create ( label : 'deuxième groupe' ) }
2023-04-26 17:29:47 +02:00
let ( :new_name ) { gi_1_2 . label }
it do
expect ( gi_1_1 . label ) . not_to eq ( new_name )
expect ( flash . alert ) . to eq ( [ 'Le libellé est déjà utilisé(e)' ] )
end
end
end
describe '#update_state' do
let ( :closed_value ) { '0' }
let! ( :procedure_non_routee ) { create ( :procedure , :published , :for_individual , administrateurs : [ admin ] ) }
let! ( :gi_1_1 ) { procedure_non_routee . defaut_groupe_instructeur }
2023-06-29 11:45:20 +02:00
let! ( :gi_1_2 ) { procedure_non_routee . groupe_instructeurs . create ( label : 'deuxième groupe' ) }
2023-04-26 17:29:47 +02:00
before do
patch :update_state ,
params : {
procedure_id : procedure_non_routee . id ,
groupe_instructeur_id : group . id ,
closed : closed_value
}
group . reload
end
2023-04-18 17:15:04 +02:00
context 'when we try do disable the default groupe instructeur' do
let ( :closed_value ) { '1' }
2023-04-26 17:29:47 +02:00
let ( :group ) { gi_1_1 }
2022-10-20 18:24:27 +02:00
2023-04-18 17:15:04 +02:00
it do
expect ( subject ) . to redirect_to admin_procedure_groupe_instructeur_path ( procedure_non_routee , gi_1_1 )
expect ( gi_1_1 . closed ) . to eq ( false )
expect ( flash . alert ) . to eq ( 'Il est impossible de désactiver le groupe d’ instructeurs par défaut.' )
end
2022-10-20 18:24:27 +02:00
end
2023-04-26 17:29:47 +02:00
context 'when we try do disable the second groupe instructeur' do
let ( :closed_value ) { '1' }
let ( :group ) { gi_1_2 }
2019-10-23 20:54:59 +02:00
2023-04-18 17:15:04 +02:00
it do
2023-04-26 17:29:47 +02:00
expect ( subject ) . to redirect_to admin_procedure_groupe_instructeur_path ( procedure_non_routee , gi_1_2 )
expect ( gi_1_2 . closed ) . to eq ( true )
2023-06-29 11:45:20 +02:00
expect ( flash . notice ) . to eq ( 'Le groupe deuxième groupe est désactivé.' )
2023-04-18 17:15:04 +02:00
end
2019-10-23 20:54:59 +02:00
end
end
2019-10-10 19:36:56 +02:00
2020-06-12 18:16:07 +02:00
describe '#add_instructeur_procedure_non_routee' do
2023-03-03 16:01:07 +01:00
# faire la meme chose sur une procedure non routee
let ( :procedure_non_routee ) { create :procedure }
let! ( :groupe_instructeur ) { create ( :administrateurs_procedure , procedure : procedure_non_routee , administrateur : admin , manager : manager ) }
2021-02-11 15:36:11 +01:00
let ( :emails ) { [ 'instructeur_3@ministere_a.gouv.fr' , 'instructeur_4@ministere_b.gouv.fr' ] . to_json }
2023-03-03 16:01:07 +01:00
subject { post :add_instructeur , params : { emails : emails , procedure_id : procedure_non_routee . id , id : procedure_non_routee . defaut_groupe_instructeur . id } }
2022-07-21 18:56:01 +02:00
let ( :manager ) { false }
2020-06-12 18:16:07 +02:00
context 'when all emails are valid' do
2021-02-11 15:36:11 +01:00
let ( :emails ) { [ 'test@b.gouv.fr' , 'test2@b.gouv.fr' ] . to_json }
2020-06-12 18:16:07 +02:00
it { expect ( response . status ) . to eq ( 200 ) }
it { expect ( subject . request . flash [ :alert ] ) . to be_nil }
it { expect ( subject . request . flash [ :notice ] ) . to be_present }
2023-03-03 16:01:07 +01:00
it { expect ( subject ) . to redirect_to admin_procedure_groupe_instructeurs_path ( procedure_non_routee ) }
2020-06-12 18:16:07 +02:00
end
context 'when there is at least one bad email' do
2021-02-11 15:36:11 +01:00
let ( :emails ) { [ 'badmail' , 'instructeur2@gmail.com' ] . to_json }
2020-06-12 18:16:07 +02:00
it { expect ( response . status ) . to eq ( 200 ) }
it { expect ( subject . request . flash [ :alert ] ) . to be_present }
it { expect ( subject . request . flash [ :notice ] ) . to be_present }
2023-03-03 16:01:07 +01:00
it { expect ( subject ) . to redirect_to admin_procedure_groupe_instructeurs_path ( procedure_non_routee ) }
2020-06-12 18:16:07 +02:00
end
context 'when the admin wants to assign an instructor who is already assigned on this procedure' do
2021-02-11 15:36:11 +01:00
let ( :emails ) { [ 'instructeur_1@ministere_a.gouv.fr' ] . to_json }
2020-06-12 18:16:07 +02:00
it { expect ( subject . request . flash [ :alert ] ) . to be_present }
2023-03-03 16:01:07 +01:00
it { expect ( subject ) . to redirect_to admin_procedure_groupe_instructeurs_path ( procedure_non_routee ) }
2020-06-12 18:16:07 +02:00
end
2022-07-21 18:56:01 +02:00
context 'when signed in admin comes from manager' do
let ( :manager ) { true }
it { is_expected . to have_http_status ( :forbidden ) }
end
2020-06-12 18:16:07 +02:00
end
2019-10-10 19:36:56 +02:00
describe '#add_instructeur' do
let! ( :instructeur ) { create ( :instructeur ) }
2022-07-21 18:56:01 +02:00
let ( :do_request ) do
2019-10-10 19:36:56 +02:00
post :add_instructeur ,
params : {
procedure_id : procedure . id ,
2020-06-12 18:16:07 +02:00
id : gi_1_2 . id ,
2021-02-11 15:36:11 +01:00
emails : new_instructeur_emails . to_json
2019-10-10 19:36:56 +02:00
}
end
2022-07-21 18:56:01 +02:00
2023-02-06 16:11:08 +01:00
before { gi_1_2 . instructeurs << instructeur }
2019-10-10 19:36:56 +02:00
2019-11-04 14:49:53 +01:00
context 'of a news instructeurs' do
let ( :new_instructeur_emails ) { [ 'new_i1@mail.com' , 'new_i2@mail.com' ] }
2023-02-17 15:24:12 +01:00
before do
allow ( GroupeInstructeurMailer ) . to receive ( :notify_added_instructeurs )
. and_return ( double ( deliver_later : true ) )
do_request
end
2020-06-12 18:16:07 +02:00
it { expect ( gi_1_2 . instructeurs . pluck ( :email ) ) . to include ( * new_instructeur_emails ) }
2019-10-10 19:36:56 +02:00
it { expect ( flash . notice ) . to be_present }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_2 ) ) }
2022-11-04 10:10:57 +01:00
it { expect ( procedure . routing_enabled? ) . to be_truthy }
2023-02-17 15:24:12 +01:00
it " calls GroupeInstructeurMailer with the right params " do
expect ( GroupeInstructeurMailer ) . to have_received ( :notify_added_instructeurs ) . with (
gi_1_2 ,
gi_1_2 . instructeurs . last ( 2 ) ,
admin . email
)
end
2019-10-10 19:36:56 +02:00
end
context 'of an instructeur already in the group' do
2019-11-04 14:49:53 +01:00
let ( :new_instructeur_emails ) { [ instructeur . email ] }
2022-07-21 18:56:01 +02:00
before { do_request }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_2 ) ) }
2019-11-04 14:49:53 +01:00
end
context 'of badly formed email' do
let ( :new_instructeur_emails ) { [ 'badly_formed_email' ] }
2022-07-21 18:56:01 +02:00
before { do_request }
2019-10-10 19:36:56 +02:00
it { expect ( flash . alert ) . to be_present }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_2 ) ) }
2019-10-10 19:36:56 +02:00
end
2019-11-27 10:06:07 +01:00
context 'of an empty string' do
2021-02-11 15:36:11 +01:00
let ( :new_instructeur_emails ) { [ '' ] }
2022-07-21 18:56:01 +02:00
before { do_request }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_2 ) ) }
2019-11-27 10:06:07 +01:00
end
2022-07-21 18:56:01 +02:00
context 'when connected as an administrateur from manager' do
let ( :new_instructeur_emails ) { [ instructeur . email ] }
before do
admin . administrateurs_procedures . update_all ( manager : true )
do_request
end
it { expect ( response ) . to have_http_status ( :forbidden ) }
end
2019-10-10 19:36:56 +02:00
end
2019-10-09 18:23:29 +02:00
describe '#remove_instructeur' do
let! ( :instructeur ) { create ( :instructeur ) }
2023-03-16 14:51:37 +01:00
before do
gi_1_1 . instructeurs << admin . instructeur << instructeur
procedure . update ( routing_enabled : true )
end
2019-10-09 18:23:29 +02:00
2019-10-25 10:19:58 +02:00
def remove_instructeur ( instructeur )
2019-10-09 18:23:29 +02:00
delete :remove_instructeur ,
params : {
procedure_id : procedure . id ,
id : gi_1_1 . id ,
2019-10-25 10:19:58 +02:00
instructeur : { id : instructeur . id }
2019-10-09 18:23:29 +02:00
}
end
context 'when there are many instructeurs' do
2023-02-14 11:17:52 +01:00
before do
2023-02-15 11:57:35 +01:00
allow ( GroupeInstructeurMailer ) . to receive ( :notify_removed_instructeur )
2023-02-14 11:17:52 +01:00
. and_return ( double ( deliver_later : true ) )
remove_instructeur ( admin . instructeur )
end
2019-10-09 18:23:29 +02:00
it { expect ( gi_1_1 . instructeurs ) . to include ( instructeur ) }
it { expect ( gi_1_1 . reload . instructeurs . count ) . to eq ( 1 ) }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_1 ) ) }
2023-02-14 11:17:52 +01:00
it " calls GroupeInstructeurMailer with the right groupe and instructeur " do
2023-02-15 11:57:35 +01:00
expect ( GroupeInstructeurMailer ) . to have_received ( :notify_removed_instructeur ) . with (
2023-02-14 11:17:52 +01:00
gi_1_1 ,
2023-02-15 11:57:35 +01:00
admin . instructeur ,
2023-02-14 11:17:52 +01:00
admin . email
)
end
2019-10-09 18:23:29 +02:00
end
context 'when there is only one instructeur' do
before do
2019-10-25 10:19:58 +02:00
remove_instructeur ( admin . instructeur )
remove_instructeur ( instructeur )
2019-10-09 18:23:29 +02:00
end
it { expect ( gi_1_1 . instructeurs ) . to include ( instructeur ) }
it { expect ( gi_1_1 . instructeurs . count ) . to eq ( 1 ) }
it { expect ( flash . alert ) . to eq ( 'Suppression impossible : il doit y avoir au moins un instructeur dans le groupe' ) }
2020-07-07 12:03:32 +02:00
it { expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeur_path ( procedure , gi_1_1 ) ) }
2019-10-09 18:23:29 +02:00
end
end
2019-10-17 10:57:58 +02:00
2020-06-12 18:16:07 +02:00
describe '#remove_instructeur_procedure_non_routee' do
2023-03-03 16:01:07 +01:00
let ( :procedure_non_routee ) { create :procedure , administrateur : admin , instructeurs : [ instructeur_assigned_1 , instructeur_assigned_2 ] }
2022-03-24 12:38:32 +01:00
let! ( :instructeur_assigned_1 ) { create :instructeur , email : 'instructeur_1@ministere-a.gouv.fr' , administrateurs : [ admin ] }
let! ( :instructeur_assigned_2 ) { create :instructeur , email : 'instructeur_2@ministere-b.gouv.fr' , administrateurs : [ admin ] }
let! ( :instructeur_assigned_3 ) { create :instructeur , email : 'instructeur_3@ministere-a.gouv.fr' , administrateurs : [ admin ] }
2023-03-03 16:01:07 +01:00
subject! { get :show , params : { procedure_id : procedure_non_routee . id , id : procedure_non_routee . defaut_groupe_instructeur . id } }
2020-06-12 18:16:07 +02:00
it 'sets the assigned instructeurs' do
expect ( assigns ( :instructeurs ) ) . to match_array ( [ instructeur_assigned_1 , instructeur_assigned_2 ] )
end
context 'when the instructor is assigned to the procedure' do
2023-03-03 16:01:07 +01:00
subject { delete :remove_instructeur , params : { instructeur : { id : instructeur_assigned_1 . id } , procedure_id : procedure_non_routee . id , id : procedure_non_routee . defaut_groupe_instructeur . id } }
2020-06-12 18:16:07 +02:00
it { expect ( subject . request . flash [ :notice ] ) . to be_present }
it { expect ( subject . request . flash [ :alert ] ) . to be_nil }
it { expect ( response . status ) . to eq ( 302 ) }
2023-03-03 16:01:07 +01:00
it { expect ( subject ) . to redirect_to admin_procedure_groupe_instructeurs_path ( procedure_non_routee ) }
2020-06-12 18:16:07 +02:00
end
context 'when the instructor is not assigned to the procedure' do
2023-03-03 16:01:07 +01:00
subject { delete :remove_instructeur , params : { instructeur : { id : instructeur_assigned_3 . id } , procedure_id : procedure_non_routee . id , id : procedure_non_routee . defaut_groupe_instructeur . id } }
2020-06-12 18:16:07 +02:00
it { expect ( subject . request . flash [ :alert ] ) . to be_present }
it { expect ( subject . request . flash [ :notice ] ) . to be_nil }
it { expect ( response . status ) . to eq ( 302 ) }
2023-03-03 16:01:07 +01:00
it { expect ( subject ) . to redirect_to admin_procedure_groupe_instructeurs_path ( procedure_non_routee ) }
2020-06-12 18:16:07 +02:00
end
end
2023-03-02 18:07:05 +01:00
describe '#import' do
2021-06-09 17:52:29 +02:00
subject do
2023-03-02 18:07:05 +01:00
post :import , params : { procedure_id : procedure . id , csv_file : csv_file }
2021-06-09 17:52:29 +02:00
end
2023-03-02 18:07:05 +01:00
context 'routed procedures' do
context 'when the csv file is less than 1 mo and content type text/csv' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur.csv' , 'text/csv' ) }
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
before { subject }
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
it { expect ( response . status ) . to eq ( 302 ) }
it { expect ( procedure . groupe_instructeurs . first . label ) . to eq ( " Afrique " ) }
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara " ) }
end
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
context 'when the csv file has only one column' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/valid-instructeurs-file.csv' , 'text/csv' ) }
2023-01-18 16:38:56 +01:00
2023-03-02 18:07:05 +01:00
before { subject }
2023-01-18 16:38:56 +01:00
2023-03-02 18:07:05 +01:00
it { expect { subject } . not_to raise_error }
it { expect ( response . status ) . to eq ( 302 ) }
it { expect ( flash . alert ) . to be_present }
2023-03-08 10:47:22 +01:00
it { expect ( flash . alert ) . to eq ( " Importation impossible, veuillez importer un csv suivant <a href= \" /csv/import-instructeurs-test.csv \" >ce modèle</a> pour une procédure sans routage ou <a href= \" /csv/fr/import-groupe-test.csv \" >celui-ci</a> pour une procédure routée " ) }
2023-03-02 18:07:05 +01:00
end
2021-07-15 16:16:59 +02:00
2023-03-02 18:07:05 +01:00
context 'when the file content type is application/vnd.ms-excel' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe_avec_caracteres_speciaux.csv' , " application/vnd.ms-excel " ) }
2021-07-15 16:16:59 +02:00
2023-03-02 18:07:05 +01:00
before { subject }
2021-07-12 14:00:26 +02:00
2023-03-02 18:07:05 +01:00
it { expect ( flash . notice ) . to be_present }
it { expect ( flash . notice ) . to eq ( " La liste des instructeurs a été importée avec succès " ) }
2023-02-22 18:05:20 +01:00
end
2021-07-12 14:00:26 +02:00
2023-03-02 18:07:05 +01:00
context 'when the content of csv contains special characters' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe_avec_caracteres_speciaux.csv' , 'text/csv' ) }
2021-07-12 14:00:26 +02:00
2023-03-02 18:07:05 +01:00
before do
allow ( GroupeInstructeurMailer ) . to receive ( :notify_added_instructeurs )
. and_return ( double ( deliver_later : true ) )
subject
end
2021-06-09 17:52:29 +02:00
2023-06-29 11:45:20 +02:00
it { expect ( procedure . groupe_instructeurs . pluck ( :label ) ) . to match_array ( [ " Auvergne-Rhône-Alpes " , " Vendée " , " défaut " , " deuxième groupe " ] ) }
2023-03-02 18:07:05 +01:00
it { expect ( flash . notice ) . to be_present }
it { expect ( flash . notice ) . to eq ( " La liste des instructeurs a été importée avec succès " ) }
it { expect ( GroupeInstructeurMailer ) . to have_received ( :notify_added_instructeurs ) . twice }
2021-06-09 17:52:29 +02:00
end
2023-03-02 18:07:05 +01:00
context 'when the csv file length is more than 1 mo' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur.csv' , 'text/csv' ) }
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
before do
allow_any_instance_of ( ActionDispatch :: Http :: UploadedFile ) . to receive ( :size ) . and_return ( 3 . megabytes )
subject
end
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Importation impossible : le poids du fichier est supérieur à 1 Mo " ) }
end
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
context 'when the file content type is not accepted' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/french-flag.gif' , 'image/gif' ) }
2021-06-22 14:30:16 +02:00
2023-03-02 18:07:05 +01:00
before { subject }
2021-06-22 14:30:16 +02:00
2023-03-02 18:07:05 +01:00
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Importation impossible : veuillez importer un fichier CSV " ) }
end
2021-06-22 14:30:16 +02:00
2023-03-02 18:07:05 +01:00
context 'when the headers are wrong' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/invalid-group-file.csv' , 'text/csv' ) }
2023-02-09 09:44:06 +01:00
2023-03-02 18:07:05 +01:00
before { subject }
2023-02-09 09:44:06 +01:00
2023-03-02 18:07:05 +01:00
it { expect ( flash . alert ) . to be_present }
2023-03-08 10:47:22 +01:00
it { expect ( flash . alert ) . to eq ( " Importation impossible, veuillez importer un csv suivant <a href= \" /csv/import-instructeurs-test.csv \" >ce modèle</a> pour une procédure sans routage ou <a href= \" /csv/fr/import-groupe-test.csv \" >celui-ci</a> pour une procédure routée " ) }
2023-03-02 18:07:05 +01:00
end
2023-02-09 09:44:06 +01:00
2023-03-02 18:07:05 +01:00
context 'when procedure is closed' do
let ( :procedure ) { create ( :procedure , :closed , administrateurs : [ admin ] ) }
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur.csv' , 'text/csv' ) }
2021-06-09 17:52:29 +02:00
2023-03-02 18:07:05 +01:00
before { subject }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
it { expect ( procedure . groupe_instructeurs . first . label ) . to eq ( " Afrique " ) }
it { expect ( flash . alert ) . to eq ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara " ) }
end
2023-03-08 10:47:22 +01:00
context 'when emails are invalid' do
let ( :procedure ) { create ( :procedure , :closed , administrateurs : [ admin ] ) }
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur-emails-invalides.csv' , 'text/csv' ) }
before do
allow ( GroupeInstructeurMailer ) . to receive ( :notify_added_instructeurs )
. and_return ( double ( deliver_later : true ) )
subject
end
it { expect ( flash . alert ) . to include ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: " ) }
it { expect ( GroupeInstructeurMailer ) . not_to have_received ( :notify_added_instructeurs ) }
end
2023-01-10 14:36:56 +01:00
end
2023-03-02 18:07:05 +01:00
context 'unrouted procedures' do
let ( :procedure_non_routee ) { create ( :procedure , :published , :for_individual , administrateurs : [ admin ] ) }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
subject do
post :import , params : { procedure_id : procedure_non_routee . id , csv_file : csv_file }
2023-02-22 17:29:07 +01:00
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
context 'when the csv file is less than 1 mo and content type text/csv' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/instructeurs-file.csv' , 'text/csv' ) }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
before do
allow ( GroupeInstructeurMailer ) . to receive ( :notify_added_instructeurs )
. and_return ( double ( deliver_later : true ) )
subject
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
it { expect ( response . status ) . to eq ( 302 ) }
it { expect ( procedure_non_routee . instructeurs . pluck ( :email ) ) . to match_array ( [ " kara@beta-gouv.fr " , " philippe@mail.com " , " lisa@gouv.fr " ] ) }
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: eric " ) }
it " calls GroupeInstructeurMailer " do
expect ( GroupeInstructeurMailer ) . to have_received ( :notify_added_instructeurs ) . with (
procedure_non_routee . defaut_groupe_instructeur ,
any_args ,
admin . email
)
end
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
context 'when the csv file has more than one column' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur.csv' , 'text/csv' ) }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
before { subject }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
it { expect ( response . status ) . to eq ( 302 ) }
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara " ) }
2023-03-03 10:36:19 +01:00
it { expect ( procedure_non_routee . reload . routing_enabled? ) . to be_truthy }
2023-03-02 18:07:05 +01:00
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
context 'when the file content type is application/vnd.ms-excel' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/valid-instructeurs-file.csv' , " application/vnd.ms-excel " ) }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
before { subject }
it { expect ( procedure_non_routee . instructeurs . pluck ( :email ) ) . to match_array ( [ " kara@beta-gouv.fr " , " philippe@mail.com " , " lisa@gouv.fr " ] ) }
it { expect ( flash . notice ) . to be_present }
it { expect ( flash . notice ) . to eq ( " La liste des instructeurs a été importée avec succès " ) }
2023-01-10 14:36:56 +01:00
end
2023-03-02 18:07:05 +01:00
context 'when the csv file length is more than 1 mo' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/groupe-instructeur.csv' , 'text/csv' ) }
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
before do
allow_any_instance_of ( ActionDispatch :: Http :: UploadedFile ) . to receive ( :size ) . and_return ( 3 . megabytes )
subject
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Importation impossible : le poids du fichier est supérieur à 1 Mo " ) }
end
2023-01-10 14:36:56 +01:00
2023-03-02 18:07:05 +01:00
context 'when the file content type is not accepted' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/french-flag.gif' , 'image/gif' ) }
before { subject }
it { expect ( flash . alert ) . to be_present }
it { expect ( flash . alert ) . to eq ( " Importation impossible : veuillez importer un fichier CSV " ) }
end
2023-03-08 10:47:22 +01:00
context 'when emails are invalid' do
let ( :csv_file ) { fixture_file_upload ( 'spec/fixtures/files/instructeurs-emails-invalides.csv' , 'text/csv' ) }
before do
allow ( GroupeInstructeurMailer ) . to receive ( :notify_added_instructeurs )
. and_return ( double ( deliver_later : true ) )
subject
end
it { expect ( flash . alert ) . to include ( " Import terminé. Cependant les emails suivants ne sont pas pris en compte: " ) }
it { expect ( GroupeInstructeurMailer ) . not_to have_received ( :notify_added_instructeurs ) }
end
2023-01-10 14:36:56 +01:00
end
end
2021-10-04 18:18:54 +02:00
describe '#export_groupe_instructeurs' do
2022-03-24 12:38:32 +01:00
let ( :instructeur_assigned_1 ) { create :instructeur , email : 'instructeur_1@ministere-a.gouv.fr' , administrateurs : [ admin ] }
let ( :instructeur_assigned_2 ) { create :instructeur , email : 'instructeur_2@ministere-b.gouv.fr' , administrateurs : [ admin ] }
2021-10-04 18:18:54 +02:00
subject do
get :export_groupe_instructeurs , params : { procedure_id : procedure . id , format : :csv }
end
before do
gi_1_2 . instructeurs << [ instructeur_assigned_1 , instructeur_assigned_2 ]
end
it 'generates a CSV file containing the instructeurs and groups' do
expect ( subject . status ) . to eq ( 200 )
expect ( subject . stream . body . split ( " \n " ) . size ) . to eq ( 3 )
2023-06-29 11:45:20 +02:00
expect ( subject . stream . body ) . to include ( " deuxième groupe " )
2021-10-04 18:18:54 +02:00
expect ( subject . stream . body ) . to include ( instructeur_assigned_1 . email )
expect ( subject . stream . body ) . to include ( instructeur_assigned_2 . email )
expect ( subject . header [ " Content-Disposition " ] ) . to include ( " #{ procedure . id } -groupe-instructeurs- #{ Date . today } .csv " )
end
end
2023-04-26 17:29:47 +02:00
describe '#create_simple_routing' do
let! ( :procedure3 ) do
create ( :procedure ,
types_de_champ_public : [
{ type : :drop_down_list , libelle : 'Votre ville' , options : [ 'Paris' , 'Lyon' , 'Marseille' ] } ,
{ type : :text , libelle : 'Un champ texte' }
] ,
administrateurs : [ admin ] )
end
let! ( :drop_down_tdc ) { procedure3 . draft_revision . types_de_champ . first }
before { post :create_simple_routing , params : { procedure_id : procedure3 . id , create_simple_routing : { stable_id : drop_down_tdc . stable_id } } }
it do
expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure3 ) )
expect ( flash . notice ) . to eq 'Les groupes instructeurs ont été ajoutés'
expect ( procedure3 . groupe_instructeurs . pluck ( :label ) ) . to match_array ( [ 'Paris' , 'Lyon' , 'Marseille' ] )
expect ( procedure3 . reload . defaut_groupe_instructeur . routing_rule ) . to eq ( ds_eq ( champ_value ( drop_down_tdc . stable_id ) , constant ( 'Lyon' ) ) )
2023-06-27 10:18:08 +02:00
expect ( procedure3 . routing_enabled ) . to be_truthy
2023-04-26 17:29:47 +02:00
end
end
2023-06-27 10:35:33 +02:00
describe '#wizard' do
let! ( :procedure4 ) do
create ( :procedure ,
types_de_champ_public : [
{ type : :drop_down_list , libelle : 'Votre ville' , options : [ 'Paris' , 'Lyon' , 'Marseille' ] } ,
{ type : :text , libelle : 'Un champ texte' }
] ,
administrateurs : [ admin ] )
end
let! ( :drop_down_tdc ) { procedure4 . draft_revision . types_de_champ . first }
before { patch :wizard , params : { procedure_id : procedure4 . id , choice : { state : 'routage_custom' } } }
it do
expect ( response ) . to redirect_to ( admin_procedure_groupe_instructeurs_path ( procedure4 ) )
expect ( procedure4 . groupe_instructeurs . pluck ( :label ) ) . to match_array ( [ 'défaut' , 'défaut bis' ] )
expect ( procedure4 . reload . routing_enabled ) . to be_truthy
2023-04-26 17:29:47 +02:00
end
end
2019-10-17 15:13:50 +02:00
end