2017-10-02 17:03:38 +02:00
describe ProcedurePresentation do
2023-06-08 18:58:47 +02:00
include ActiveSupport :: Testing :: TimeHelpers
2023-04-11 17:00:25 +02:00
let ( :procedure ) { create ( :procedure , :published , types_de_champ_public : [ { } ] , types_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 ) }
2022-11-16 12:46:33 +01:00
let ( :first_type_de_champ ) { assign_to . procedure . active_revision . types_de_champ_public . 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
2024-01-23 09:52:20 +01:00
let ( :procedure ) do
create ( :procedure ,
types_de_champ_public : Array . new ( 4 ) { { type : :text } } ,
types_de_champ_private : Array . new ( 4 ) { { type : :text } } )
end
2022-11-16 12:46:33 +01:00
let ( :tdc_1 ) { procedure . active_revision . types_de_champ_public [ 0 ] }
let ( :tdc_2 ) { procedure . active_revision . types_de_champ_public [ 1 ] }
let ( :tdc_private_1 ) { procedure . active_revision . types_de_champ_private [ 0 ] }
let ( :tdc_private_2 ) { procedure . active_revision . types_de_champ_private [ 1 ] }
2018-10-11 10:45:03 +02:00
let ( :expected ) {
[
2023-08-29 17:52:14 +02:00
{ " label " = > 'Créé le' , " table " = > 'self' , " column " = > 'created_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Mis à jour le' , " table " = > 'self' , " column " = > 'updated_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Déposé le' , " table " = > 'self' , " column " = > 'depose_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'En construction le' , " table " = > 'self' , " column " = > 'en_construction_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'En instruction le' , " table " = > 'self' , " column " = > 'en_instruction_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Terminé le' , " table " = > 'self' , " column " = > 'processed_at' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " Mis à jour depuis " , " table " = > " self " , " column " = > " updated_since " , " classname " = > " " , 'virtual' = > true , 'type' = > :date , 'scope' = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " Déposé depuis " , " table " = > " self " , " column " = > " depose_since " , " classname " = > " " , 'virtual' = > true , 'type' = > :date , 'scope' = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " En construction depuis " , " table " = > " self " , " column " = > " en_construction_since " , " classname " = > " " , 'virtual' = > true , 'type' = > :date , 'scope' = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " En instruction depuis " , " table " = > " self " , " column " = > " en_instruction_since " , " classname " = > " " , 'virtual' = > true , 'type' = > :date , 'scope' = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " Terminé depuis " , " table " = > " self " , " column " = > " processed_since " , " classname " = > " " , 'virtual' = > true , 'type' = > :date , 'scope' = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > " Statut " , " table " = > " self " , " column " = > " state " , " classname " = > " " , 'virtual' = > true , 'scope' = > 'instructeurs.dossiers.filterable_state' , 'type' = > :enum , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Demandeur' , " table " = > 'user' , " column " = > 'email' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Email instructeur' , " table " = > 'followers_instructeurs' , " column " = > 'email' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Groupe instructeur' , " table " = > 'groupe_instructeur' , " column " = > 'id' , 'classname' = > '' , 'virtual' = > false , 'type' = > :enum , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Avis oui/non' , " table " = > 'avis' , " column " = > 'question_answer' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > false } ,
{ " label " = > 'SIREN' , " table " = > 'etablissement' , " column " = > 'entreprise_siren' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Forme juridique' , " table " = > 'etablissement' , " column " = > 'entreprise_forme_juridique' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Nom commercial' , " table " = > 'etablissement' , " column " = > 'entreprise_nom_commercial' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Raison sociale' , " table " = > 'etablissement' , " column " = > 'entreprise_raison_sociale' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'SIRET siège social' , " table " = > 'etablissement' , " column " = > 'entreprise_siret_siege_social' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Date de création' , " table " = > 'etablissement' , " column " = > 'entreprise_date_creation' , 'classname' = > '' , 'virtual' = > false , 'type' = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'SIRET' , " table " = > 'etablissement' , " column " = > 'siret' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Libellé NAF' , " table " = > 'etablissement' , " column " = > 'libelle_naf' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > 'Code postal' , " table " = > 'etablissement' , " column " = > 'code_postal' , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > tdc_1 . libelle , " table " = > 'type_de_champ' , " column " = > tdc_1 . stable_id . to_s , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > tdc_2 . libelle , " table " = > 'type_de_champ' , " column " = > tdc_2 . stable_id . to_s , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > tdc_private_1 . libelle , " table " = > 'type_de_champ_private' , " column " = > tdc_private_1 . stable_id . to_s , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } ,
{ " label " = > tdc_private_2 . libelle , " table " = > 'type_de_champ_private' , " column " = > tdc_private_2 . stable_id . to_s , 'classname' = > '' , 'virtual' = > false , 'type' = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true }
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
2022-11-16 12:46:33 +01:00
procedure . active_revision . types_de_champ_public [ 2 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :header_section ) )
procedure . active_revision . types_de_champ_public [ 3 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :explication ) )
procedure . active_revision . types_de_champ_private [ 2 ] . update_attribute ( :type_champ , TypeDeChamp . type_champs . fetch ( :header_section ) )
procedure . active_revision . 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
2023-08-29 17:52:14 +02:00
let ( :name_field ) { { " label " = > " Prénom " , " table " = > " individual " , " column " = > " prenom " , 'classname' = > '' , 'virtual' = > false , " type " = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
let ( :surname_field ) { { " label " = > " Nom " , " table " = > " individual " , " column " = > " nom " , 'classname' = > '' , 'virtual' = > false , " type " = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
let ( :gender_field ) { { " label " = > " Civilité " , " table " = > " individual " , " column " = > " gender " , 'classname' = > '' , 'virtual' = > false , " type " = > :text , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
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
2023-06-08 18:58:47 +02:00
2023-08-31 15:25:29 +02:00
context 'when the procedure is sva' do
2023-06-08 18:58:47 +02:00
let ( :procedure ) { create ( :procedure , :for_individual , :sva ) }
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : assign_to ) }
2023-08-29 17:52:14 +02:00
let ( :decision_on ) { { " label " = > " Date décision SVA " , " table " = > " self " , " column " = > " sva_svr_decision_on " , 'classname' = > '' , 'virtual' = > false , " type " = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
let ( :decision_before_field ) { { " label " = > " Date décision SVA avant " , " table " = > " self " , " column " = > " sva_svr_decision_before " , 'classname' = > '' , 'virtual' = > true , " type " = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
2023-06-08 18:58:47 +02:00
subject { procedure_presentation . fields }
it { is_expected . to include ( decision_on , decision_before_field ) }
end
2023-08-31 15:25:29 +02:00
context 'when the procedure is svr' do
let ( :procedure ) { create ( :procedure , :for_individual , :svr ) }
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : assign_to ) }
let ( :decision_on ) { { " label " = > " Date décision SVR " , " table " = > " self " , " column " = > " sva_svr_decision_on " , 'classname' = > '' , 'virtual' = > false , " type " = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
let ( :decision_before_field ) { { " label " = > " Date décision SVR avant " , " table " = > " self " , " column " = > " sva_svr_decision_before " , 'classname' = > '' , 'virtual' = > true , " type " = > :date , " scope " = > '' , " value_column " = > :value , 'filterable' = > true } }
subject { procedure_presentation . fields }
it { is_expected . to include ( decision_on , decision_before_field ) }
end
2018-10-03 16:05:27 +02:00
end
2022-06-14 07:46:12 +02:00
describe " # displayable_fields_for_select " do
2020-07-20 16:13:51 +02:00
subject { create ( :procedure_presentation , assign_to : assign_to ) }
2022-06-14 07:46:12 +02:00
let ( :excluded_displayable_field ) { { " label " = > " depose_since " , " table " = > " self " , " column " = > " depose_since " , 'virtual' = > true } }
let ( :included_displayable_field ) { { " label " = > " label1 " , " table " = > " table1 " , " column " = > " column1 " , 'virtual' = > false } }
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 ( [
2022-06-14 07:46:12 +02:00
excluded_displayable_field ,
included_displayable_field
2018-10-03 14:46:12 +02:00
] )
end
2022-06-14 07:46:12 +02:00
it { expect ( subject . displayable_fields_for_select ) . to eq ( [ [ [ " label1 " , " table1/column1 " ] ] , [ " user/email " ] ] ) }
end
describe " # filterable_fields_options " do
subject { create ( :procedure_presentation , assign_to : assign_to ) }
let ( :included_displayable_field ) do
[
{ " label " = > " label1 " , " table " = > " table1 " , " column " = > " column1 " , 'virtual' = > false } ,
{ " label " = > " depose_since " , " table " = > " self " , " column " = > " depose_since " , 'virtual' = > true }
]
end
before do
allow ( subject ) . to receive ( :fields ) . and_return ( included_displayable_field )
end
it { expect ( subject . filterable_fields_options ) . to eq ( [ [ " label1 " , " table1/column1 " ] , [ " depose_since " , " self/depose_since " ] ] ) }
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' }
2022-11-16 12:46:33 +01:00
let ( :column ) { procedure . active_revision . types_de_champ_public . 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
2022-11-10 22:21:14 +01:00
beurre_dossier . champs_public . first . update ( value : 'beurre' )
tartine_dossier . champs_public . first . update ( value : 'tartine' )
2021-07-22 18:16:04 +02:00
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' }
2022-11-16 12:46:33 +01:00
let ( :column ) { procedure . active_revision . types_de_champ_public . last . stable_id . to_s }
2021-07-22 18:16:04 +02:00
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!
2022-11-10 22:21:14 +01:00
beurre_dossier . champs_public . last . update ( value : 'beurre' )
tartine_dossier . champs_public . last . update ( value : 'tartine' )
2021-07-22 18:16:04 +02:00
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' }
2022-11-16 12:46:33 +01:00
let ( :column ) { procedure . active_revision . 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' }
2022-11-16 12:46:33 +01:00
let ( :column ) { procedure . active_revision . types_de_champ_private . last . stable_id . to_s }
2021-07-22 18:16:04 +02:00
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
2023-06-02 17:05:19 +02:00
context 'for avis table' do
let ( :table ) { 'avis' }
2023-08-29 17:52:14 +02:00
let ( :column ) { 'question_answer' }
2023-06-02 17:05:19 +02:00
let ( :order ) { 'asc' }
let! ( :dossier_yes ) { create ( :dossier , procedure : ) }
let! ( :dossier_no ) { create ( :dossier , procedure : ) }
before do
create_list ( :avis , 2 , dossier : dossier_yes , question_answer : true )
create ( :avis , dossier : dossier_no , question_answer : true )
create ( :avis , dossier : dossier_no , question_answer : false )
end
2023-08-29 17:52:14 +02:00
it { is_expected . to eq ( [ dossier_no , dossier_yes ] . map ( & :id ) ) }
2023-06-02 17:05:19 +02:00
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
2022-06-09 14:01:22 +02:00
context 'for updated_since column' do
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'updated_since' , 'value' = > '18/9/2018' } ] }
let ( :kept_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :later_dossier ) { create ( :dossier , procedure : procedure ) }
let ( :discarded_dossier ) { create ( :dossier , procedure : procedure ) }
before do
kept_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 18 , 14 , 28 ) )
later_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 19 , 14 , 28 ) )
discarded_dossier . touch ( time : Time . zone . local ( 2018 , 9 , 17 , 14 , 28 ) )
end
it { is_expected . to match_array ( [ kept_dossier . id , later_dossier . id ] ) }
end
2023-06-08 18:58:47 +02:00
context 'for sva_svr_decision_before column' do
before do
travel_to Time . zone . local ( 2023 , 6 , 10 , 10 )
end
let ( :procedure ) { create ( :procedure , :published , :sva , types_de_champ_public : [ { } ] , types_de_champ_private : [ { } ] ) }
let ( :filter ) { [ { 'table' = > 'self' , 'column' = > 'sva_svr_decision_before' , 'value' = > '15/06/2023' } ] }
let! ( :kept_dossier ) { create ( :dossier , :en_instruction , procedure : , sva_svr_decision_on : Date . current ) }
let! ( :later_dossier ) { create ( :dossier , :en_instruction , procedure : , sva_svr_decision_on : Date . current + 2 . days ) }
let! ( :discarded_dossier ) { create ( :dossier , :en_instruction , procedure : , sva_svr_decision_on : Date . current + 10 . days ) }
let! ( :en_construction_dossier ) { create ( :dossier , :en_construction , procedure : , sva_svr_decision_on : Date . current + 2 . days ) }
let! ( :accepte_dossier ) { create ( :dossier , :accepte , procedure : , sva_svr_decision_on : Date . current + 2 . days ) }
it { is_expected . to match_array ( [ kept_dossier . id , later_dossier . id , en_construction_dossier . id ] ) }
end
2022-06-09 14:01:22 +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 ) ) }
2022-10-03 15:18:46 +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
context 'with multiple state filters' do
let ( :filter ) do
[
{ 'table' = > 'self' , 'column' = > 'state' , 'value' = > 'en_construction' } ,
{ 'table' = > 'self' , 'column' = > 'state' , 'value' = > 'en_instruction' }
]
end
let! ( :kept_dossier ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :other_kept_dossier ) { create ( :dossier , :en_instruction , procedure : procedure ) }
let! ( :discarded_dossier ) { create ( :dossier , :accepte , procedure : procedure ) }
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
2023-09-26 16:36:39 +02:00
context 'with en_construction state filters' do
let ( :filter ) do
[
{ 'table' = > 'self' , 'column' = > 'state' , 'value' = > 'en_construction' }
]
end
let! ( :en_construction ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :en_construction_with_correction ) { create ( :dossier , :en_construction , procedure : procedure ) }
let! ( :correction ) { create ( :dossier_correction , dossier : en_construction_with_correction ) }
it 'excludes dossier en construction with pending correction' do
is_expected . to contain_exactly ( en_construction . 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 ) }
2022-11-16 12:46:33 +01:00
let ( :type_de_champ ) { procedure . active_revision . types_de_champ_public . first }
2018-10-03 19:17:22 +02:00
2020-06-08 14:33:58 +02:00
context 'with single value' do
before do
2024-07-01 15:31:32 +02:00
kept_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'keep me' )
discarded_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'discard me' )
2020-06-08 14:33:58 +02:00
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
2024-07-01 15:31:32 +02:00
kept_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'keep me' )
discarded_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'discard me' )
other_kept_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . 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' } ] }
2023-06-20 16:11:18 +02:00
let ( :types_de_champ_public ) { [ { type : :yes_no } ] }
2020-06-08 14:33:58 +02:00
before do
2024-07-01 15:31:32 +02:00
kept_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'true' )
discarded_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( value : 'false' )
2020-06-08 14:33:58 +02:00
end
it { is_expected . to contain_exactly ( kept_dossier . id ) }
end
2023-06-20 16:11:18 +02:00
context 'with departement type_de_champ' do
let ( :filter ) { [ { 'table' = > 'type_de_champ' , 'column' = > type_de_champ . stable_id . to_s , 'value_column' = > :external_id , 'value' = > '13' } ] }
let ( :types_de_champ_public ) { [ { type : :departements } ] }
before do
2024-07-01 15:31:32 +02:00
kept_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( external_id : '13' )
discarded_dossier . champs . find_by ( stable_id : type_de_champ . stable_id ) . update ( external_id : '69' )
2023-06-20 16:11:18 +02:00
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 ) }
2022-11-16 12:46:33 +01:00
let ( :type_de_champ_private ) { procedure . active_revision . types_de_champ_private . first }
2018-10-03 19:17:22 +02:00
before do
2024-07-01 15:31:32 +02:00
kept_dossier . champs . find_by ( stable_id : type_de_champ_private . stable_id ) . update ( value : 'keep me' )
discarded_dossier . champs . find_by ( stable_id : type_de_champ_private . stable_id ) . 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
2024-07-01 15:31:32 +02:00
other_kept_dossier . champs . find_by ( stable_id : type_de_champ_private . stable_id ) . 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
2023-01-13 16:40:48 +01:00
let ( :filter ) { [ { 'table' = > 'groupe_instructeur' , 'column' = > 'id' , 'value' = > procedure . defaut_groupe_instructeur . id . to_s } ] }
2019-09-18 15:25:05 +02:00
2023-06-29 11:45:20 +02:00
let! ( :gi_2 ) { create ( :groupe_instructeur , label : 'gi2' , procedure : procedure ) }
let! ( :gi_3 ) { create ( :groupe_instructeur , label : 'gi3' , procedure : procedure ) }
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
[
2023-01-13 16:40:48 +01:00
{ 'table' = > 'groupe_instructeur' , 'column' = > 'id' , 'value' = > procedure . defaut_groupe_instructeur . id . to_s } ,
{ 'table' = > 'groupe_instructeur' , 'column' = > 'id' , 'value' = > gi_3 . id . to_s }
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
2024-01-23 09:52:20 +01:00
let ( :procedure ) { create ( :procedure , types_de_champ_public : [ { type : :yes_no } ] ) }
2020-06-08 14:33:58 +02:00
it 'should transform value' do
expect ( subject ) . to eq ( " oui " )
end
end
2022-12-14 23:13:54 +01:00
context 'when filter is state' do
let ( :filters ) { { " suivis " = > [ { " table " = > " self " , " column " = > " state " , " value " = > " en_construction " } ] } }
it 'should get i18n value' do
2023-04-18 13:09:22 +02:00
expect ( subject ) . to eq ( " En construction " )
2022-12-14 23:13:54 +01:00
end
end
2023-06-08 19:01:23 +02:00
context 'when filter is a date' do
let ( :filters ) { { " suivis " = > [ { " table " = > " self " , " column " = > " en_instruction_at " , " value " = > " 15/06/2023 " } ] } }
it 'should get formatted value' do
expect ( subject ) . to eq ( " 15/06/2023 " )
end
end
2020-06-08 14:33:58 +02:00
end
describe " # add_filter " do
let ( :filters ) { { " suivis " = > [ ] } }
context 'when type_de_champ yes_no' do
2024-01-23 09:52:20 +01:00
let ( :procedure ) { create ( :procedure , types_de_champ_public : [ { type : :yes_no } ] ) }
2020-06-08 14:33:58 +02:00
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 " = >
[
2023-06-20 16:11:18 +02:00
{ " label " = > first_type_de_champ . libelle , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " true " , " value_column " = > " value " }
2021-02-16 15:05:04 +01:00
]
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 " = > [
2023-06-20 16:11:18 +02:00
{ " label " = > first_type_de_champ . libelle , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " Oui " , " value_column " = > " value " }
]
} )
end
end
context 'when type_de_champ departements' do
let ( :procedure ) { create ( :procedure , types_de_champ_public : [ { type : :departements } ] ) }
let ( :filters ) { { " suivis " = > [ ] } }
it 'should set value_column' do
procedure_presentation . add_filter ( " suivis " , " type_de_champ/ #{ first_type_de_champ_id } " , " 13 " )
expect ( procedure_presentation . filters ) . to eq ( {
" suivis " = > [
{ " label " = > first_type_de_champ . libelle , " table " = > " type_de_champ " , " column " = > first_type_de_champ_id , " value " = > " 13 " , " value_column " = > " external_id " }
2021-02-16 15:05:04 +01:00
]
2020-06-08 14:33:58 +02:00
} )
end
end
end
2022-04-15 12:13:32 +02:00
describe '#filtered_sorted_ids' do
2023-05-04 18:24:18 +02:00
let ( :procedure_presentation ) { create ( :procedure_presentation , assign_to : ) }
2022-04-15 12:13:32 +02:00
let ( :dossier_1 ) { create ( :dossier ) }
let ( :dossier_2 ) { create ( :dossier ) }
let ( :dossier_3 ) { create ( :dossier ) }
let ( :dossiers ) { Dossier . where ( id : [ dossier_1 , dossier_2 , dossier_3 ] . map ( & :id ) ) }
let ( :sorted_ids ) { [ dossier_2 , dossier_3 , dossier_1 ] . map ( & :id ) }
2023-05-04 18:24:18 +02:00
let ( :statut ) { 'tous' }
2022-04-15 12:13:32 +02:00
2023-05-04 18:24:18 +02:00
subject { procedure_presentation . filtered_sorted_ids ( dossiers , statut ) }
2022-04-15 12:13:32 +02:00
2023-05-04 18:24:18 +02:00
context 'with no filters' do
let ( :statut ) { 'suivis' }
let ( :dossiers ) { procedure . dossiers }
before do
create ( :follow , dossier : en_construction_dossier , instructeur : procedure_presentation . instructeur )
create ( :follow , dossier : accepte_dossier , instructeur : procedure_presentation . instructeur )
end
2022-04-15 12:13:32 +02:00
2023-05-04 18:24:18 +02:00
let ( :en_construction_dossier ) { create ( :dossier , :en_construction , procedure : ) }
let ( :accepte_dossier ) { create ( :dossier , :accepte , procedure : ) }
2022-04-15 12:13:32 +02:00
2023-05-04 18:24:18 +02:00
it { is_expected . to contain_exactly ( en_construction_dossier . id ) }
end
2022-04-15 12:13:32 +02:00
2023-05-04 18:24:18 +02:00
context 'with mocked sorted_ids' do
2022-04-15 12:13:32 +02:00
before do
2023-05-04 18:24:18 +02:00
expect ( procedure_presentation ) . to receive ( :sorted_ids ) . and_return ( sorted_ids )
2022-04-15 12:13:32 +02:00
end
it { is_expected . to eq ( sorted_ids ) }
2023-05-04 18:24:18 +02:00
context 'when a filter is present' do
let ( :filtered_ids ) { [ dossier_1 , dossier_2 , dossier_3 ] . map ( & :id ) }
before do
procedure_presentation . filters [ 'tous' ] = 'some_filter'
expect ( procedure_presentation ) . to receive ( :filtered_ids ) . and_return ( filtered_ids )
end
it { is_expected . to eq ( sorted_ids ) }
end
2022-04-15 12:13:32 +02:00
end
end
2023-01-31 12:38:47 +01:00
describe '#field_enum' do
context " field is groupe_instructeur " do
let! ( :gi_2 ) { instructeur . groupe_instructeurs . create ( label : 'gi2' , procedure : ) }
let! ( :gi_3 ) { instructeur . groupe_instructeurs . create ( label : 'gi3' , procedure : create ( :procedure ) ) }
subject { procedure_presentation . field_enum ( 'groupe_instructeur/id' ) }
it { is_expected . to eq ( [ [ 'défaut' , procedure . defaut_groupe_instructeur . id ] , [ 'gi2' , gi_2 . id ] ] ) }
end
2023-11-14 09:31:48 +01:00
context 'when field is dropdown' do
let ( :procedure ) { create ( :procedure , :published , types_de_champ_public : [ { type : :text } ] , types_de_champ_private : [ { } ] ) }
let ( :tdc ) { procedure . published_revision . types_de_champ_public . first }
before do
procedure . draft_revision
. find_and_ensure_exclusive_use ( tdc . stable_id )
. update ( type_champ : :drop_down_list ,
drop_down_list_value : " Paris \n Lyon \n Marseille " )
procedure . publish_revision!
end
subject { procedure_presentation . field_enum ( " type_de_champ/ #{ tdc . id } " ) }
it 'find most recent tdc' do
expect ( subject ) . to eq ( [ " Paris " , " Lyon " , " Marseille " ] )
end
end
2023-01-31 12:38:47 +01:00
end
2017-10-02 17:03:38 +02:00
end