2017-10-02 17:03:38 +02:00
describe ProcedurePresentation do
2018-10-05 10:08:39 +02:00
let ( :procedure ) { create ( :procedure , :with_type_de_champ , :with_type_de_champ_private ) }
2020-07-20 16:13:51 +02:00
let ( :instructeur ) { create ( :instructeur ) }
let ( :assign_to ) { create ( :assign_to , procedure : procedure , instructeur : instructeur ) }
2020-06-08 14:33:58 +02:00
let ( :first_type_de_champ ) { assign_to . procedure . types_de_champ . first }
2020-10-30 15:01:13 +01:00
let ( :first_type_de_champ_id ) { first_type_de_champ . stable_id . to_s }
2020-06-08 14:33:58 +02:00
let ( :procedure_presentation ) {
2020-07-20 16:13:51 +02:00
create ( :procedure_presentation ,
2018-10-02 17:04:23 +02:00
assign_to : assign_to ,
2017-09-28 11:04:18 +02:00
displayed_fields : [
2018-10-02 17:04:23 +02:00
{ " label " = > " test1 " , " table " = > " user " , " column " = > " email " } ,
{ " label " = > " test2 " , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id }
2018-01-15 19:17:01 +01:00
] ,
2018-12-24 17:37:57 +01:00
sort : { " table " = > " user " , " column " = > " email " , " order " = > " asc " } ,
2020-07-20 16:59:27 +02:00
filters : filters )
2017-09-28 11:04:18 +02:00
}
2020-06-08 14:33:58 +02:00
let ( :procedure_presentation_id ) { procedure_presentation . id }
let ( :filters ) { { " a-suivre " = > [ ] , " suivis " = > [ { " label " = > " label1 " , " table " = > " self " , " column " = > " created_at " } ] } }
2017-10-02 17:03:38 +02:00
describe " # displayed_fields " do
2018-10-02 17:04:23 +02:00
it { expect ( procedure_presentation . displayed_fields ) . to eq ( [ { " label " = > " test1 " , " table " = > " user " , " column " = > " email " } , { " label " = > " test2 " , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id } ] ) }
2017-10-02 17:03:38 +02:00
end
2017-09-27 15:16:07 +02:00
describe " # sort " do
2018-12-24 17:37:57 +01:00
it { expect ( procedure_presentation . sort ) . to eq ( { " table " = > " user " , " column " = > " email " , " order " = > " asc " } ) }
2017-09-27 15:16:07 +02:00
end
2017-09-28 11:04:18 +02:00
describe " # filters " do
2018-10-02 17:04:23 +02:00
it { expect ( procedure_presentation . filters ) . to eq ( { " a-suivre " = > [ ] , " suivis " = > [ { " label " = > " label1 " , " table " = > " self " , " column " = > " created_at " } ] } ) }
end
describe 'validation' do
it { expect ( build ( :procedure_presentation ) ) . to be_valid }
context 'of displayed fields' do
it { expect ( build ( :procedure_presentation , displayed_fields : [ { " table " = > " user " , " column " = > " reset_password_token " , " order " = > " asc " } ] ) ) . to be_invalid }
end
context 'of sort' do
it { expect ( build ( :procedure_presentation , sort : { " table " = > " notifications " , " column " = > " notifications " , " order " = > " asc " } ) ) . to be_valid }
2018-10-03 16:20:27 +02:00
it { expect ( build ( :procedure_presentation , sort : { " table " = > " self " , " column " = > " id " , " order " = > " asc " } ) ) . to be_valid }
it { expect ( build ( :procedure_presentation , sort : { " table " = > " self " , " column " = > " state " , " order " = > " asc " } ) ) . to be_valid }
2018-10-02 17:04:23 +02:00
it { expect ( build ( :procedure_presentation , sort : { " table " = > " user " , " column " = > " reset_password_token " , " order " = > " asc " } ) ) . to be_invalid }
end
context 'of filters' do
it { expect ( build ( :procedure_presentation , filters : { " suivis " = > [ { " table " = > " user " , " column " = > " reset_password_token " , " order " = > " asc " } ] } ) ) . to be_invalid }
2021-07-20 14:00:29 +02:00
it { expect ( build ( :procedure_presentation , filters : { " suivis " = > [ { " table " = > " user " , " column " = > " email " , " value " = > " exceedingly long filter value " * 10 } ] } ) ) . to be_invalid }
2018-10-02 17:04:23 +02:00
end
2017-09-28 11:04:18 +02:00
end
2018-10-03 14:46:12 +02:00
2018-10-03 16:05:27 +02:00
describe " # fields " do
2018-10-11 10:45:03 +02:00
context 'when the procedure can have a SIRET number' do
2020-08-27 19:56:19 +02:00
let ( :procedure ) { create ( :procedure , :with_type_de_champ , :with_type_de_champ_private , types_de_champ_count : 4 , types_de_champ_private_count : 4 ) }
2018-10-11 10:45:03 +02:00
let ( :tdc_1 ) { procedure . types_de_champ [ 0 ] }
let ( :tdc_2 ) { procedure . types_de_champ [ 1 ] }
let ( :tdc_private_1 ) { procedure . types_de_champ_private [ 0 ] }
let ( :tdc_private_2 ) { procedure . types_de_champ_private [ 1 ] }
let ( :expected ) {
[
2022-04-14 10:30:23 +02:00
{ " label " = > 'Créé le' , " table " = > 'self' , " column " = > 'created_at' , 'classname' = > '' } ,
{ " label " = > 'En construction le' , " table " = > 'self' , " column " = > 'en_construction_at' , 'classname' = > '' } ,
{ " label " = > 'Déposé le' , " table " = > 'self' , " column " = > 'depose_at' , 'classname' = > '' } ,
{ " label " = > 'Mis à jour le' , " table " = > 'self' , " column " = > 'updated_at' , 'classname' = > '' } ,
{ " label " = > 'Demandeur' , " table " = > 'user' , " column " = > 'email' , 'classname' = > '' } ,
{ " label " = > 'Email instructeur' , " table " = > 'followers_instructeurs' , " column " = > 'email' , 'classname' = > '' } ,
{ " label " = > 'Groupe instructeur' , " table " = > 'groupe_instructeur' , " column " = > 'label' , 'classname' = > '' } ,
{ " label " = > 'SIREN' , " table " = > 'etablissement' , " column " = > 'entreprise_siren' , 'classname' = > '' } ,
{ " label " = > 'Forme juridique' , " table " = > 'etablissement' , " column " = > 'entreprise_forme_juridique' , 'classname' = > '' } ,
{ " label " = > 'Nom commercial' , " table " = > 'etablissement' , " column " = > 'entreprise_nom_commercial' , 'classname' = > '' } ,
{ " label " = > 'Raison sociale' , " table " = > 'etablissement' , " column " = > 'entreprise_raison_sociale' , 'classname' = > '' } ,
{ " label " = > 'SIRET siège social' , " table " = > 'etablissement' , " column " = > 'entreprise_siret_siege_social' , 'classname' = > '' } ,
{ " label " = > 'Date de création' , " table " = > 'etablissement' , " column " = > 'entreprise_date_creation' , 'classname' = > '' } ,
{ " label " = > 'SIRET' , " table " = > 'etablissement' , " column " = > 'siret' , 'classname' = > '' } ,
{ " label " = > 'Libellé NAF' , " table " = > 'etablissement' , " column " = > 'libelle_naf' , 'classname' = > '' } ,
{ " label " = > 'Code postal' , " table " = > 'etablissement' , " column " = > 'code_postal' , 'classname' = > '' } ,
{ " label " = > tdc_1 . libelle , " table " = > 'type_de_champ' , " column " = > tdc_1 . stable_id . to_s , 'classname' = > '' } ,
{ " label " = > tdc_2 . libelle , " table " = > 'type_de_champ' , " column " = > tdc_2 . stable_id . to_s , 'classname' = > '' } ,
{ " label " = > tdc_private_1 . libelle , " table " = > 'type_de_champ_private' , " column " = > tdc_private_1 . stable_id . to_s , 'classname' = > '' } ,
{ " label " = > tdc_private_2 . libelle , " table " = > 'type_de_champ_private' , " column " = > tdc_private_2 . stable_id . to_s , 'classname' = > '' }
2018-10-11 10:45:03 +02:00
]
}
2018-10-03 16:05:27 +02:00
2018-10-11 10:45:03 +02:00
before do
2018-12-24 17:37:57 +01:00
procedure . types_de_champ [ 2 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :header_section ) )
procedure . types_de_champ [ 3 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :explication ) )
procedure . types_de_champ_private [ 2 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :header_section ) )
procedure . types_de_champ_private [ 3 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :explication ) )
2018-10-11 10:45:03 +02:00
end
2020-07-20 16:13:51 +02:00
subject { create ( :procedure_presentation , assign_to : assign_to ) }
2018-10-11 10:45:03 +02:00
it { expect ( subject . fields ) . to eq ( expected ) }
2018-10-03 16:05:27 +02:00
end
2018-10-11 10:45:03 +02:00
context 'when the procedure is for individuals' do
2022-04-14 10:30:23 +02:00
let ( :name_field ) { { " label " = > " Prénom " , " table " = > " individual " , " column " = > " prenom " , 'classname' = > '' } }
let ( :surname_field ) { { " label " = > " Nom " , " table " = > " individual " , " column " = > " nom " , 'classname' = > '' } }
let ( :gender_field ) { { " label " = > " Civilité " , " table " = > " individual " , " column " = > " gender " , 'classname' = > '' } }
2018-10-11 10:45:03 +02:00
let ( :procedure ) { create ( :procedure , :for_individual ) }
2020-07-20 16:13:51 +02:00
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : assign_to ) }
2018-10-03 16:05:27 +02:00
2018-10-11 10:45:03 +02:00
subject { procedure_presentation . fields }
it { is_expected . to include ( name_field , surname_field , gender_field ) }
end
2018-10-03 16:05:27 +02:00
end
2020-10-30 11:38:58 +01:00
describe " # displayed_fields_for_select " do
2020-07-20 16:13:51 +02:00
subject { create ( :procedure_presentation , assign_to : assign_to ) }
2018-10-03 14:46:12 +02:00
before do
2018-10-03 16:05:27 +02:00
allow ( subject ) . to receive ( :fields ) . and_return ( [
2018-10-03 14:46:12 +02:00
{
" label " = > " label1 " ,
" table " = > " table1 " ,
" column " = > " column1 "
} ,
{
" label " = > " label2 " ,
" table " = > " table2 " ,
" column " = > " column2 "
}
] )
end
2020-10-30 11:38:58 +01:00
it { expect ( subject . displayed_fields_for_select ) . to eq ( [ [ [ " label1 " , " table1/column1 " ] , [ " label2 " , " table2/column2 " ] ] , [ " user/email " ] ] ) }
2018-10-03 14:46:12 +02:00
end
2018-10-03 19:17:22 +02:00
2018-10-05 10:08:39 +02:00
describe '#sorted_ids' do
2019-08-06 11:02:54 +02:00
let ( :instructeur ) { create ( :instructeur ) }
let ( :assign_to ) { create ( :assign_to , procedure : procedure , instructeur : instructeur ) }
2018-10-05 10:08:39 +02:00
let ( :sort ) { { 'table' = > table , 'column' = > column , 'order' = > order } }
2020-07-20 16:13:51 +02:00
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : assign_to , sort : sort ) }
2018-10-05 10:08:39 +02:00
2022-03-31 16:32:45 +02:00
subject { procedure_presentation . sorted_ids ( procedure . dossiers , procedure . dossiers . count ) }
2018-10-05 10:08:39 +02:00
context 'for notifications table' do
let ( :table ) { 'notifications' }
let ( :column ) { 'notifications' }
let! ( :notified_dossier ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :recent_dossier ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :older_dossier ) { create ( :dossier , :en_construction , procedure : procedure ) }
before do
2020-07-30 11:05:39 +02:00
notified_dossier . update! ( last_champ_updated_at : Time . zone . local ( 2018 , 9 , 20 ) )
2019-08-06 11:02:54 +02:00
create ( :follow , instructeur : instructeur , dossier : notified_dossier , demande_seen_at : Time . zone . local ( 2018 , 9 , 10 ) )
2018-10-25 15:19:29 +02:00
notified_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 20 ) )
recent_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 25 ) )
older_dossier . touch ( time : Time . zone . local ( 2018 , 5 , 13 ) )
2018-10-05 10:08:39 +02:00
end
context 'in ascending order' do
let ( :order ) { 'asc' }
it { is_expected . to eq ( [ older_dossier , recent_dossier , notified_dossier ] . map ( & :id ) ) }
end
context 'in descending order' do
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ notified_dossier , recent_dossier , older_dossier ] . map ( & :id ) ) }
end
2018-10-23 18:48:05 +02:00
context 'with a dossier terminé' do
let! ( :notified_dossier ) { create ( :dossier , :accepte , procedure : procedure ) }
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ notified_dossier , recent_dossier , older_dossier ] . map ( & :id ) ) }
end
2018-10-05 10:08:39 +02:00
end
context 'for self table' do
let ( :table ) { 'self' }
let ( :order ) { 'asc' } # Desc works the same, no extra test required
2018-10-17 12:10:23 +02:00
context 'for created_at column' do
let ( :column ) { 'created_at' }
2018-10-25 15:19:29 +02:00
let! ( :recent_dossier ) { Timecop . freeze ( Time . zone . local ( 2018 , 10 , 17 ) ) { create ( :dossier , procedure : procedure ) } }
let! ( :older_dossier ) { Timecop . freeze ( Time . zone . local ( 2003 , 11 , 11 ) ) { create ( :dossier , procedure : procedure ) } }
2018-10-05 10:08:39 +02:00
2018-10-17 12:10:23 +02:00
it { is_expected . to eq ( [ older_dossier , recent_dossier ] . map ( & :id ) ) }
2018-10-05 10:08:39 +02:00
end
2018-10-17 12:10:23 +02:00
context 'for en_construction_at column' do
let ( :column ) { 'en_construction_at' }
2018-10-25 15:19:29 +02:00
let! ( :recent_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 17 ) ) }
let! ( :older_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2013 , 1 , 1 ) ) }
2018-10-17 12:10:23 +02:00
it { is_expected . to eq ( [ older_dossier , recent_dossier ] . map ( & :id ) ) }
end
context 'for updated_at column' do
let ( :column ) { 'updated_at' }
let ( :recent_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :older_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2018-10-25 15:19:29 +02:00
recent_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 25 ) )
older_dossier . touch ( time : Time . zone . local ( 2018 , 5 , 13 ) )
2018-10-17 12:10:23 +02:00
end
it { is_expected . to eq ( [ older_dossier , recent_dossier ] . map ( & :id ) ) }
end
2018-10-05 10:08:39 +02:00
end
context 'for type_de_champ table' do
2021-07-22 18:16:04 +02:00
context 'with no revisions' do
let ( :table ) { 'type_de_champ' }
let ( :column ) { procedure . types_de_champ . first . stable_id . to_s }
2018-10-05 10:08:39 +02:00
2021-07-22 18:16:04 +02:00
let ( :beurre_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :tartine_dossier ) { create ( :dossier , procedure : procedure ) }
2018-10-05 10:08:39 +02:00
2021-07-22 18:16:04 +02:00
before do
beurre_dossier . champs . first . update ( value : 'beurre' )
tartine_dossier . champs . first . update ( value : 'tartine' )
end
context 'asc' do
let ( :order ) { 'asc' }
it { is_expected . to eq ( [ beurre_dossier , tartine_dossier ] . map ( & :id ) ) }
end
context 'desc' do
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ tartine_dossier , beurre_dossier ] . map ( & :id ) ) }
end
2018-10-05 10:08:39 +02:00
end
2021-07-22 18:16:04 +02:00
context 'with a revision adding a new type_de_champ' do
let! ( :tdc ) { { type_champ : :text , libelle : 'nouveau champ' } }
let ( :table ) { 'type_de_champ' }
let ( :column ) { procedure . types_de_champ . last . stable_id . to_s }
let ( :nothing_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :beurre_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :tartine_dossier ) { create ( :dossier , procedure : procedure ) }
before do
nothing_dossier
procedure . draft_revision . add_type_de_champ ( tdc )
procedure . publish_revision!
beurre_dossier . champs . last . update ( value : 'beurre' )
tartine_dossier . champs . last . update ( value : 'tartine' )
end
context 'asc' do
let ( :order ) { 'asc' }
it { is_expected . to eq ( [ beurre_dossier , tartine_dossier , nothing_dossier ] . map ( & :id ) ) }
end
context 'desc' do
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ nothing_dossier , tartine_dossier , beurre_dossier ] . map ( & :id ) ) }
end
end
2018-10-05 10:08:39 +02:00
end
context 'for type_de_champ_private table' do
2021-07-22 18:16:04 +02:00
context 'with no revisions' do
let ( :table ) { 'type_de_champ_private' }
let ( :column ) { procedure . types_de_champ_private . first . stable_id . to_s }
2018-10-05 10:08:39 +02:00
2021-07-22 18:16:04 +02:00
let ( :biere_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :vin_dossier ) { create ( :dossier , procedure : procedure ) }
2018-10-05 10:08:39 +02:00
2021-07-22 18:16:04 +02:00
before do
biere_dossier . champs_private . first . update ( value : 'biere' )
vin_dossier . champs_private . first . update ( value : 'vin' )
end
context 'asc' do
let ( :order ) { 'asc' }
it { is_expected . to eq ( [ biere_dossier , vin_dossier ] . map ( & :id ) ) }
end
context 'desc' do
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ vin_dossier , biere_dossier ] . map ( & :id ) ) }
end
2018-10-05 10:08:39 +02:00
end
2021-07-22 18:16:04 +02:00
context 'with a revision adding a new type_de_champ' do
let! ( :tdc ) { { type_champ : :text , private : true , libelle : 'nouveau champ' } }
let ( :table ) { 'type_de_champ_private' }
let ( :column ) { procedure . types_de_champ_private . last . stable_id . to_s }
let ( :nothing_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :biere_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :vin_dossier ) { create ( :dossier , procedure : procedure ) }
before do
nothing_dossier
procedure . draft_revision . add_type_de_champ ( tdc )
procedure . publish_revision!
biere_dossier . champs_private . last . update ( value : 'biere' )
vin_dossier . champs_private . last . update ( value : 'vin' )
end
context 'asc' do
let ( :order ) { 'asc' }
it { is_expected . to eq ( [ biere_dossier , vin_dossier , nothing_dossier ] . map ( & :id ) ) }
end
context 'desc' do
let ( :order ) { 'desc' }
it { is_expected . to eq ( [ nothing_dossier , vin_dossier , biere_dossier ] . map ( & :id ) ) }
end
end
2018-10-05 10:08:39 +02:00
end
2018-10-11 11:28:51 +02:00
context 'for individual table' do
let ( :table ) { 'individual' }
let ( :order ) { 'asc' } # Desc works the same, no extra test required
let ( :procedure ) { create ( :procedure , :for_individual ) }
2021-11-19 13:48:52 +01:00
let! ( :first_dossier ) { create ( :dossier , procedure : procedure , individual : build ( :individual , gender : 'M' , prenom : 'Alain' , nom : 'Antonelli' ) ) }
let! ( :last_dossier ) { create ( :dossier , procedure : procedure , individual : build ( :individual , gender : 'Mme' , prenom : 'Zora' , nom : 'Zemmour' ) ) }
2018-10-11 11:28:51 +02:00
context 'for gender column' do
let ( :column ) { 'gender' }
it { is_expected . to eq ( [ first_dossier , last_dossier ] . map ( & :id ) ) }
end
context 'for prenom column' do
let ( :column ) { 'prenom' }
it { is_expected . to eq ( [ first_dossier , last_dossier ] . map ( & :id ) ) }
end
context 'for nom column' do
let ( :column ) { 'nom' }
it { is_expected . to eq ( [ first_dossier , last_dossier ] . map ( & :id ) ) }
end
end
2019-10-16 13:02:42 +02:00
context 'for followers_instructeurs table' do
let ( :table ) { 'followers_instructeurs' }
let ( :order ) { 'asc' } # Desc works the same, no extra test required
let! ( :dossier_z ) { create ( :dossier , :en_construction , procedure : procedure ) }
2022-03-16 18:23:08 +01:00
let! ( :dossier_a ) { create ( :dossier , :en_construction , procedure : procedure ) }
2019-10-16 13:02:42 +02:00
let! ( :dossier_without_instructeur ) { create ( :dossier , :en_construction , procedure : procedure ) }
before do
2022-03-16 18:23:08 +01:00
create ( :follow , dossier : dossier_z , instructeur : create ( :instructeur , email : 'zythum@exemple.fr' ) )
2019-10-16 13:02:42 +02:00
create ( :follow , dossier : dossier_a , instructeur : create ( :instructeur , email : 'abaca@exemple.fr' ) )
2021-05-04 15:37:29 +02:00
create ( :follow , dossier : dossier_a , instructeur : create ( :instructeur , email : 'abaca2@exemple.fr' ) )
2019-10-16 13:02:42 +02:00
end
context 'for email column' do
let ( :column ) { 'email' }
it { is_expected . to eq ( [ dossier_a , dossier_z , dossier_without_instructeur ] . map ( & :id ) ) }
end
end
2018-10-05 10:08:39 +02:00
context 'for other tables' do
# All other columns and tables work the same so it’ s ok to test only one
let ( :table ) { 'etablissement' }
let ( :column ) { 'code_postal' }
let ( :order ) { 'asc' } # Desc works the same, no extra test required
let! ( :huitieme_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , code_postal : '75008' ) ) }
let! ( :vingtieme_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , code_postal : '75020' ) ) }
it { is_expected . to eq ( [ huitieme_dossier , vingtieme_dossier ] . map ( & :id ) ) }
end
end
2018-10-03 19:17:22 +02:00
describe '#filtered_ids' do
2020-07-20 16:13:51 +02:00
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : assign_to , filters : { " suivis " = > filter } ) }
2018-10-03 19:17:22 +02:00
2019-10-16 13:02:42 +02:00
subject { procedure_presentation . filtered_ids ( procedure . dossiers . joins ( :user ) , 'suivis' ) }
2018-10-03 19:17:22 +02:00
2018-10-10 18:18:28 +02:00
context 'for self table' do
context 'for created_at column' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'created_at' , 'value' = > '18/9/2018' } ] }
2018-10-25 15:19:29 +02:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure , created_at : Time . zone . local ( 2018 , 9 , 18 , 14 , 28 ) ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure , created_at : Time . zone . local ( 2018 , 9 , 17 , 23 , 59 ) ) }
2018-10-10 18:18:28 +02:00
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2018-10-17 12:16:04 +02:00
context 'for en_construction_at column' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'en_construction_at' , 'value' = > '17/10/2018' } ] }
2018-10-25 15:19:29 +02:00
let! ( :kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 17 ) ) }
let! ( :discarded_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2013 , 1 , 1 ) ) }
2018-10-17 12:16:04 +02:00
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2018-10-10 18:18:28 +02:00
context 'for updated_at column' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'updated_at' , 'value' = > '18/9/2018' } ] }
2018-10-10 18:18:28 +02:00
let ( :kept_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :discarded_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2018-10-25 15:19:29 +02:00
kept_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 18 , 14 , 28 ) )
discarded_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 17 , 23 , 59 ) )
2018-10-10 18:18:28 +02:00
end
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2018-10-26 11:02:14 +02:00
2018-10-26 15:10:42 +02:00
context 'ignore time of day' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'en_construction_at' , 'value' = > '17/10/2018 19:30' } ] }
2018-10-26 15:10:42 +02:00
let! ( :kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 17 , 15 , 56 ) ) }
let! ( :discarded_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 18 , 5 , 42 ) ) }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2018-10-26 11:02:14 +02:00
context 'for a malformed date' do
2018-10-26 14:23:11 +02:00
context 'when its a string' do
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'updated_at' , 'value' = > 'malformed date' } ] }
2019-02-19 13:10:24 +01:00
2018-10-26 14:23:11 +02:00
it { is_expected . to match ( [ ] ) }
end
context 'when its a number' do
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'updated_at' , 'value' = > '177500' } ] }
it { is_expected . to match ( [ ] ) }
end
2018-10-26 11:02:14 +02:00
end
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'self' , 'column' = > 'en_construction_at' , 'value' = > '17/10/2018' } ,
{ 'table' = > 'self' , 'column' = > 'en_construction_at' , 'value' = > '19/10/2018' }
]
end
let! ( :kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 17 ) ) }
let! ( :other_kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2018 , 10 , 19 ) ) }
let! ( :discarded_dossier ) { create ( :dossier , :en_construction , procedure : procedure , en_construction_at : Time . zone . local ( 2013 , 1 , 1 ) ) }
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-10 18:18:28 +02:00
end
2018-10-03 19:17:22 +02:00
context 'for type_de_champ table' do
2020-10-30 15:01:13 +01:00
let ( :filter ) { [ { 'table' = > 'type_de_champ' , 'column' = > type_de_champ . stable_id . to_s , 'value' = > 'keep' } ] }
2019-02-19 13:10:24 +01:00
2018-10-03 19:17:22 +02:00
let ( :kept_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :discarded_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :type_de_champ ) { procedure . types_de_champ . first }
2020-06-08 14:33:58 +02:00
context 'with single value' do
before do
kept_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'keep me' )
discarded_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'discard me' )
end
2018-10-03 19:17:22 +02:00
2020-06-08 14:33:58 +02:00
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
2020-10-30 15:01:13 +01:00
{ 'table' = > 'type_de_champ' , 'column' = > type_de_champ . stable_id . to_s , 'value' = > 'keep' } ,
{ 'table' = > 'type_de_champ' , 'column' = > type_de_champ . stable_id . to_s , 'value' = > 'and' }
2019-02-19 13:11:00 +01:00
]
end
let ( :other_kept_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2020-06-08 14:33:58 +02:00
kept_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'keep me' )
discarded_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'discard me' )
2020-04-06 17:22:46 +02:00
other_kept_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'and me too' )
2019-02-19 13:11:00 +01:00
end
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2020-06-08 14:33:58 +02:00
context 'with yes_no type_de_champ' do
2020-10-30 15:01:13 +01:00
let ( :filter ) { [ { 'table' = > 'type_de_champ' , 'column' = > type_de_champ . stable_id . to_s , 'value' = > 'true' } ] }
2020-06-08 14:33:58 +02:00
let ( :procedure ) { create ( :procedure , :with_yes_no ) }
before do
kept_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'true' )
discarded_dossier . champs . find_by ( type_de_champ : type_de_champ ) . update ( value : 'false' )
end
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2018-10-03 19:17:22 +02:00
end
context 'for type_de_champ_private table' do
2020-10-30 15:01:13 +01:00
let ( :filter ) { [ { 'table' = > 'type_de_champ_private' , 'column' = > type_de_champ_private . stable_id . to_s , 'value' = > 'keep' } ] }
2019-02-19 13:10:24 +01:00
2018-10-03 19:17:22 +02:00
let ( :kept_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :discarded_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :type_de_champ_private ) { procedure . types_de_champ_private . first }
before do
2020-04-06 17:22:46 +02:00
kept_dossier . champs_private . find_by ( type_de_champ : type_de_champ_private ) . update ( value : 'keep me' )
discarded_dossier . champs_private . find_by ( type_de_champ : type_de_champ_private ) . update ( value : 'discard me' )
2018-10-03 19:17:22 +02:00
end
it { is_expected . to contain_exactly ( kept_dossier . id ) }
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
2020-10-30 15:01:13 +01:00
{ 'table' = > 'type_de_champ_private' , 'column' = > type_de_champ_private . stable_id . to_s , 'value' = > 'keep' } ,
{ 'table' = > 'type_de_champ_private' , 'column' = > type_de_champ_private . stable_id . to_s , 'value' = > 'and' }
2019-02-19 13:11:00 +01:00
]
end
let ( :other_kept_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2020-04-06 17:22:46 +02:00
other_kept_dossier . champs_private . find_by ( type_de_champ : type_de_champ_private ) . update ( value : 'and me too' )
2019-02-19 13:11:00 +01:00
end
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-03 19:17:22 +02:00
end
context 'for etablissement table' do
context 'for entreprise_date_creation column' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'etablissement' , 'column' = > 'entreprise_date_creation' , 'value' = > '21/6/2018' } ] }
2018-10-25 15:19:29 +02:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , entreprise_date_creation : Time . zone . local ( 2018 , 6 , 21 ) ) ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , entreprise_date_creation : Time . zone . local ( 2008 , 6 , 21 ) ) ) }
2018-10-03 19:17:22 +02:00
it { is_expected . to contain_exactly ( kept_dossier . id ) }
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'etablissement' , 'column' = > 'entreprise_date_creation' , 'value' = > '21/6/2016' } ,
{ 'table' = > 'etablissement' , 'column' = > 'entreprise_date_creation' , 'value' = > '21/6/2018' }
]
end
let! ( :other_kept_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , entreprise_date_creation : Time . zone . local ( 2016 , 6 , 21 ) ) ) }
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-03 19:17:22 +02:00
end
context 'for code_postal column' do
# All columns except entreprise_date_creation work exacly the same, just testing one
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'etablissement' , 'column' = > 'code_postal' , 'value' = > '75017' } ] }
2018-10-03 19:17:22 +02:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , code_postal : '75017' ) ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , code_postal : '25000' ) ) }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'etablissement' , 'column' = > 'code_postal' , 'value' = > '75017' } ,
{ 'table' = > 'etablissement' , 'column' = > 'code_postal' , 'value' = > '88100' }
]
end
let! ( :other_kept_dossier ) { create ( :dossier , procedure : procedure , etablissement : create ( :etablissement , code_postal : '88100' ) ) }
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-03 19:17:22 +02:00
end
end
context 'for user table' do
2019-02-19 13:10:24 +01:00
let ( :filter ) { [ { 'table' = > 'user' , 'column' = > 'email' , 'value' = > 'keepmail' } ] }
2018-10-03 19:17:22 +02:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure , user : create ( :user , email : 'me@keepmail.com' ) ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure , user : create ( :user , email : 'me@discard.com' ) ) }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'user' , 'column' = > 'email' , 'value' = > 'keepmail' } ,
{ 'table' = > 'user' , 'column' = > 'email' , 'value' = > 'beta.gouv.fr' }
]
end
let! ( :other_kept_dossier ) { create ( :dossier , procedure : procedure , user : create ( :user , email : 'bazinga@beta.gouv.fr' ) ) }
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-03 19:17:22 +02:00
end
2018-10-11 11:17:58 +02:00
context 'for individual table' do
let ( :procedure ) { create ( :procedure , :for_individual ) }
2021-11-19 13:48:52 +01:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure , individual : build ( :individual , gender : 'Mme' , prenom : 'Josephine' , nom : 'Baker' ) ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure , individual : build ( :individual , gender : 'M' , prenom : 'Jean' , nom : 'Tremblay' ) ) }
2018-10-11 11:17:58 +02:00
context 'for gender column' do
let ( :filter ) { [ { 'table' = > 'individual' , 'column' = > 'gender' , 'value' = > 'Mme' } ] }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
context 'for prenom column' do
let ( :filter ) { [ { 'table' = > 'individual' , 'column' = > 'prenom' , 'value' = > 'Josephine' } ] }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
context 'for nom column' do
let ( :filter ) { [ { 'table' = > 'individual' , 'column' = > 'nom' , 'value' = > 'Baker' } ] }
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2019-02-19 13:11:00 +01:00
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'individual' , 'column' = > 'prenom' , 'value' = > 'Josephine' } ,
{ 'table' = > 'individual' , 'column' = > 'prenom' , 'value' = > 'Romuald' }
]
end
2021-11-19 13:48:52 +01:00
let! ( :other_kept_dossier ) { create ( :dossier , procedure : procedure , individual : build ( :individual , gender : 'M' , prenom : 'Romuald' , nom : 'Pistis' ) ) }
2019-02-19 13:11:00 +01:00
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
2018-10-11 11:17:58 +02:00
end
2019-04-09 14:32:29 +02:00
2019-08-06 11:02:54 +02:00
context 'for followers_instructeurs table' do
let ( :filter ) { [ { 'table' = > 'followers_instructeurs' , 'column' = > 'email' , 'value' = > 'keepmail' } ] }
2019-04-09 14:32:29 +02:00
let! ( :kept_dossier ) { create ( :dossier , procedure : procedure ) }
let! ( :discarded_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2019-08-06 11:02:54 +02:00
create ( :follow , dossier : kept_dossier , instructeur : create ( :instructeur , email : 'me@keepmail.com' ) )
create ( :follow , dossier : discarded_dossier , instructeur : create ( :instructeur , email : 'me@discard.com' ) )
2019-04-09 14:32:29 +02:00
end
it { is_expected . to contain_exactly ( kept_dossier . id ) }
context 'with multiple search values' do
let ( :filter ) do
[
2019-08-06 11:02:54 +02:00
{ 'table' = > 'followers_instructeurs' , 'column' = > 'email' , 'value' = > 'keepmail' } ,
{ 'table' = > 'followers_instructeurs' , 'column' = > 'email' , 'value' = > 'beta.gouv.fr' }
2019-04-09 14:32:29 +02:00
]
end
let ( :other_kept_dossier ) { create ( :dossier , procedure : procedure ) }
before do
2019-08-06 11:02:54 +02:00
create ( :follow , dossier : other_kept_dossier , instructeur : create ( :instructeur , email : 'bazinga@beta.gouv.fr' ) )
2019-04-09 14:32:29 +02:00
end
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
end
2019-09-18 15:25:05 +02:00
context 'for groupe_instructeur table' do
let ( :filter ) { [ { 'table' = > 'groupe_instructeur' , 'column' = > 'label' , 'value' = > 'défaut' } ] }
2021-03-03 11:32:42 +01:00
let! ( :gi_2 ) { procedure . groupe_instructeurs . create ( label : 'gi2' ) }
let! ( :gi_3 ) { procedure . groupe_instructeurs . create ( label : 'gi3' ) }
2019-09-18 15:25:05 +02:00
2021-03-09 11:21:30 +01:00
let! ( :kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :discarded_dossier ) { create ( :dossier , :en_construction , procedure : procedure , groupe_instructeur : gi_2 ) }
2019-09-18 15:25:05 +02:00
it { is_expected . to contain_exactly ( kept_dossier . id ) }
context 'with multiple search values' do
let ( :filter ) do
[
{ 'table' = > 'groupe_instructeur' , 'column' = > 'label' , 'value' = > 'défaut' } ,
2021-03-03 11:32:42 +01:00
{ 'table' = > 'groupe_instructeur' , 'column' = > 'label' , 'value' = > 'gi3' }
2019-09-18 15:25:05 +02:00
]
end
2020-09-17 11:15:21 +02:00
let! ( :other_kept_dossier ) { create ( :dossier , procedure : procedure , groupe_instructeur : gi_3 ) }
2019-09-18 15:25:05 +02:00
it 'returns every dossier that matches any of the search criteria for a given column' do
is_expected . to contain_exactly ( kept_dossier . id , other_kept_dossier . id )
end
end
end
2018-10-03 19:17:22 +02:00
end
2019-03-04 17:01:31 +01:00
2020-06-08 14:33:58 +02:00
describe " # human_value_for_filter " do
let ( :filters ) { { " suivis " = > [ { " label " = > " label1 " , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " true " } ] } }
subject { procedure_presentation . human_value_for_filter ( procedure_presentation . filters [ " suivis " ] . first ) }
context 'when type_de_champ text' do
it 'should passthrough value' do
expect ( subject ) . to eq ( " true " )
end
end
context 'when type_de_champ yes_no' do
let ( :procedure ) { create ( :procedure , :with_yes_no ) }
it 'should transform value' do
expect ( subject ) . to eq ( " oui " )
end
end
end
describe " # add_filter " do
let ( :filters ) { { " suivis " = > [ ] } }
context 'when type_de_champ yes_no' do
let ( :procedure ) { create ( :procedure , :with_yes_no ) }
it 'should downcase and transform value' do
procedure_presentation . add_filter ( " suivis " , " type_de_champ/ #{ first_type_de_champ_id } " , " Oui " )
2021-02-16 15:05:04 +01:00
expect ( procedure_presentation . filters ) . to eq ( {
" suivis " = >
[
{ " label " = > first_type_de_champ . libelle , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " true " }
]
2020-06-08 14:33:58 +02:00
} )
end
end
context 'when type_de_champ text' do
let ( :filters ) { { " suivis " = > [ ] } }
2020-06-10 15:39:01 +02:00
it 'should passthrough value' do
2020-06-08 14:33:58 +02:00
procedure_presentation . add_filter ( " suivis " , " type_de_champ/ #{ first_type_de_champ_id } " , " Oui " )
2021-02-16 15:05:04 +01:00
expect ( procedure_presentation . filters ) . to eq ( {
" suivis " = > [
{ " label " = > first_type_de_champ . libelle , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " Oui " }
]
2020-06-08 14:33:58 +02:00
} )
end
end
end
2017-10-02 17:03:38 +02:00
end