2024-04-29 00:17:15 +02:00
# frozen_string_literal: true
2024-03-27 11:31:41 +01:00
RSpec . describe DossierChampsConcern do
let ( :procedure ) do
create ( :procedure , types_de_champ_public : , types_de_champ_private : )
end
let ( :types_de_champ_public ) do
[
{ type : :text , libelle : " Un champ text " , stable_id : 99 } ,
{ type : :text , libelle : " Un autre champ text " , stable_id : 991 } ,
{ type : :yes_no , libelle : " Un champ yes no " , stable_id : 992 } ,
{ type : :repetition , libelle : " Un champ répétable " , stable_id : 993 , mandatory : true , children : [ { type : :text , libelle : 'Nom' , stable_id : 994 } ] }
]
end
let ( :types_de_champ_private ) do
[
{ type : :text , libelle : " Une annotation " , stable_id : 995 }
]
end
let ( :dossier ) { create ( :dossier , procedure : ) }
describe " # find_type_de_champ_by_stable_id(public) " do
subject { dossier . find_type_de_champ_by_stable_id ( 992 , :public ) }
it { is_expected . to be_truthy }
end
describe " # find_type_de_champ_by_stable_id(private) " do
subject { dossier . find_type_de_champ_by_stable_id ( 995 , :private ) }
it { is_expected . to be_truthy }
end
describe " # project_champ " do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 99 ) }
let ( :type_de_champ_private ) { dossier . find_type_de_champ_by_stable_id ( 995 ) }
context " public champ " do
let ( :row_id ) { nil }
subject { dossier . project_champ ( type_de_champ_public , row_id ) }
it { expect ( subject . persisted? ) . to be_truthy }
context " in repetition " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 994 ) }
2024-09-20 14:54:26 +02:00
let ( :row_id ) { dossier . project_champ ( type_de_champ_repetition , nil ) . row_ids . first }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
}
2024-09-20 14:54:26 +02:00
context " invalid row_id " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 99 ) }
it {
2024-09-23 17:05:10 +02:00
expect { subject } . to raise_error ( " type_de_champ #{ type_de_champ_public . stable_id } in revision #{ dossier . revision_id } can not have a row_id because it is not part of a repetition " )
2024-09-20 14:54:26 +02:00
}
end
2024-03-27 11:31:41 +01:00
end
context " missing champ " do
2024-09-27 15:37:11 +02:00
before { dossier . champs . where ( type : 'Champs::TextChamp' ) . destroy_all ; dossier . reload }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . new_record? ) . to be_truthy
expect ( subject . is_a? ( Champs :: TextChamp ) ) . to be_truthy
2024-10-05 22:22:04 +02:00
expect ( subject . updated_at ) . not_to be_nil
2024-03-27 11:31:41 +01:00
}
context " in repetition " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 994 ) }
2024-09-20 14:54:26 +02:00
let ( :row_id ) { ULID . generate }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . new_record? ) . to be_truthy
expect ( subject . is_a? ( Champs :: TextChamp ) ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
2024-10-05 22:22:04 +02:00
expect ( subject . updated_at ) . not_to be_nil
2024-03-27 11:31:41 +01:00
}
2024-09-20 14:54:26 +02:00
context " invalid row_id " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 99 ) }
it {
2024-09-23 17:05:10 +02:00
expect { subject } . to raise_error ( " type_de_champ #{ type_de_champ_public . stable_id } in revision #{ dossier . revision_id } can not have a row_id because it is not part of a repetition " )
2024-09-20 14:54:26 +02:00
}
end
2024-03-27 11:31:41 +01:00
end
end
end
context " private champ " do
subject { dossier . project_champ ( type_de_champ_private , nil ) }
it { expect ( subject . persisted? ) . to be_truthy }
context " missing champ " do
2024-09-27 15:37:11 +02:00
before { dossier . champs . where ( type : 'Champs::TextChamp' ) . destroy_all ; dossier . reload }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . new_record? ) . to be_truthy
expect ( subject . is_a? ( Champs :: TextChamp ) ) . to be_truthy
2024-10-05 22:22:04 +02:00
expect ( subject . updated_at ) . not_to be_nil
2024-03-27 11:31:41 +01:00
}
end
end
end
2024-08-27 10:29:10 +02:00
describe '#project_champs_public' do
subject { dossier . project_champs_public }
it { expect ( subject . size ) . to eq ( 4 ) }
2024-10-07 11:45:05 +02:00
it { expect ( subject . find { _1 . libelle == 'Nom' } ) . to be_falsey }
2024-08-27 10:29:10 +02:00
end
describe '#project_champs_private' do
subject { dossier . project_champs_private }
it { expect ( subject . size ) . to eq ( 1 ) }
end
2024-10-07 11:45:05 +02:00
describe '#filled_champs_public' do
let ( :types_de_champ_public ) do
[
{ type : :header_section } ,
{ type : :text , libelle : " Un champ text " } ,
{ type : :text , libelle : " Un autre champ text " } ,
{ type : :yes_no , libelle : " Un champ yes no " } ,
{ type : :repetition , libelle : " Un champ répétable " , mandatory : true , children : [ { type : :text , libelle : 'Nom' } ] } ,
{ type : :explication }
]
end
subject { dossier . filled_champs_public }
it { expect ( subject . size ) . to eq ( 4 ) }
it { expect ( subject . find { _1 . libelle == 'Nom' } ) . to be_truthy }
end
describe '#filled_champs_private' do
let ( :types_de_champ_private ) do
[
{ type : :header_section } ,
{ type : :text , libelle : " Une annotation " } ,
{ type : :explication }
]
end
subject { dossier . filled_champs_private }
it { expect ( subject . size ) . to eq ( 1 ) }
end
2024-08-27 10:29:10 +02:00
describe '#repetition_row_ids' do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
subject { dossier . repetition_row_ids ( type_de_champ_repetition ) }
it { expect ( subject . size ) . to eq ( 1 ) }
end
describe '#project_rows_for' do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
subject { dossier . project_rows_for ( type_de_champ_repetition ) }
it { expect ( subject . size ) . to eq ( 1 ) }
it { expect ( subject . first . size ) . to eq ( 1 ) }
end
describe '#repetition_add_row' do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
let ( :row_ids ) { dossier . repetition_row_ids ( type_de_champ_repetition ) }
2024-09-27 15:44:57 +02:00
subject { dossier . repetition_add_row ( type_de_champ_repetition , updated_by : 'test' ) }
2024-08-27 10:29:10 +02:00
it { expect { subject } . to change { dossier . repetition_row_ids ( type_de_champ_repetition ) . size } . by ( 1 ) }
it { expect ( subject ) . to be_in ( row_ids ) }
end
describe '#repetition_remove_row' do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
let ( :row_id ) { dossier . repetition_row_ids ( type_de_champ_repetition ) . first }
let ( :row_ids ) { dossier . repetition_row_ids ( type_de_champ_repetition ) }
subject { dossier . repetition_remove_row ( type_de_champ_repetition , row_id , updated_by : 'test' ) }
it { expect { subject } . to change { dossier . repetition_row_ids ( type_de_champ_repetition ) . size } . by ( - 1 ) }
it { row_id ; subject ; expect ( row_id ) . not_to be_in ( row_ids ) }
end
2024-03-27 11:31:41 +01:00
2024-10-25 15:29:03 +02:00
describe " # champ_values_for_export " do
subject { dossier . champ_values_for_export ( dossier . revision . types_de_champ_public ) }
2024-03-27 11:31:41 +01:00
it { expect ( subject . size ) . to eq ( 4 ) }
it { expect ( subject . first ) . to eq ( [ " Un champ text " , nil ] ) }
end
describe " # champs_for_prefill " do
subject { dossier . champs_for_prefill ( [ 991 , 995 ] ) }
it {
expect ( subject . size ) . to eq ( 2 )
expect ( subject . map ( & :libelle ) ) . to eq ( [ " Une annotation " , " Un autre champ text " ] )
expect ( subject . all? ( & :persisted? ) ) . to be_truthy
}
context " missing champ " do
before { dossier ; Champs :: TextChamp . destroy_all }
it {
expect ( subject . size ) . to eq ( 2 )
expect ( subject . map ( & :libelle ) ) . to eq ( [ " Une annotation " , " Un autre champ text " ] )
expect ( subject . all? ( & :persisted? ) ) . to be_truthy
}
end
end
describe " # champ_for_update " do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 99 ) }
let ( :type_de_champ_private ) { dossier . find_type_de_champ_by_stable_id ( 995 ) }
let ( :row_id ) { nil }
context " public champ " do
2024-05-13 16:53:33 +02:00
subject { dossier . champ_for_update ( type_de_champ_public , row_id , updated_by : dossier . user . email ) }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
}
context " in repetition " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 994 ) }
2024-09-20 14:54:26 +02:00
let ( :row_id ) { ULID . generate }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
}
end
context " missing champ " do
before { dossier ; Champs :: TextChamp . destroy_all }
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . is_a? ( Champs :: TextChamp ) ) . to be_truthy
}
context " in repetition " do
let ( :type_de_champ_public ) { dossier . find_type_de_champ_by_stable_id ( 994 ) }
2024-09-20 14:54:26 +02:00
let ( :row_id ) { ULID . generate }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . is_a? ( Champs :: TextChamp ) ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
}
end
end
end
context " private champ " do
2024-05-13 16:53:33 +02:00
subject { dossier . champ_for_update ( type_de_champ_private , row_id , updated_by : dossier . user . email ) }
2024-03-27 11:31:41 +01:00
it {
expect ( subject . persisted? ) . to be_truthy
expect ( subject . row_id ) . to eq ( row_id )
}
end
end
describe " # update_champs_attributes(public) " do
let ( :type_de_champ_repetition ) { dossier . find_type_de_champ_by_stable_id ( 993 ) }
2024-09-20 14:54:26 +02:00
let ( :row_id ) { ULID . generate }
2024-03-27 11:31:41 +01:00
let ( :attributes ) do
{
2024-03-28 12:42:29 +01:00
" 99 " = > { value : " Hello " } ,
" 991 " = > { value : " World " } ,
" 994- #{ row_id } " = > { value : " Greer " }
2024-03-27 11:31:41 +01:00
}
end
let ( :champ_99 ) { dossier . project_champ ( dossier . find_type_de_champ_by_stable_id ( 99 ) , nil ) }
let ( :champ_991 ) { dossier . project_champ ( dossier . find_type_de_champ_by_stable_id ( 991 ) , nil ) }
let ( :champ_994 ) { dossier . project_champ ( dossier . find_type_de_champ_by_stable_id ( 994 ) , row_id ) }
2024-05-13 16:53:33 +02:00
subject { dossier . update_champs_attributes ( attributes , :public , updated_by : dossier . user . email ) }
2024-03-27 11:31:41 +01:00
it {
subject
expect ( dossier . champs . any? ( & :changed_for_autosave? ) ) . to be_truthy
expect ( champ_99 . changed? ) . to be_truthy
expect ( champ_991 . changed? ) . to be_truthy
expect ( champ_994 . changed? ) . to be_truthy
expect ( champ_99 . value ) . to eq ( " Hello " )
expect ( champ_991 . value ) . to eq ( " World " )
expect ( champ_994 . value ) . to eq ( " Greer " )
}
context " missing champs " do
before { dossier ; Champs :: TextChamp . destroy_all ; }
it {
subject
expect ( dossier . champs . any? ( & :changed_for_autosave? ) ) . to be_truthy
expect ( champ_99 . changed? ) . to be_truthy
expect ( champ_991 . changed? ) . to be_truthy
expect ( champ_994 . changed? ) . to be_truthy
expect ( champ_99 . value ) . to eq ( " Hello " )
expect ( champ_991 . value ) . to eq ( " World " )
expect ( champ_994 . value ) . to eq ( " Greer " )
}
end
end
describe " # update_champs_attributes(private) " do
let ( :attributes ) do
{
2024-03-28 12:42:29 +01:00
" 995 " = > { value : " Hello " }
2024-03-27 11:31:41 +01:00
}
end
let ( :annotation_995 ) { dossier . project_champ ( dossier . find_type_de_champ_by_stable_id ( 995 ) , nil ) }
2024-05-13 16:53:33 +02:00
subject { dossier . update_champs_attributes ( attributes , :private , updated_by : dossier . user . email ) }
2024-03-27 11:31:41 +01:00
it {
subject
expect ( dossier . champs . any? ( & :changed_for_autosave? ) ) . to be_truthy
expect ( annotation_995 . changed? ) . to be_truthy
expect ( annotation_995 . value ) . to eq ( " Hello " )
}
context " missing champs " do
before { dossier ; Champs :: TextChamp . destroy_all ; }
it {
subject
expect ( dossier . champs . any? ( & :changed_for_autosave? ) ) . to be_truthy
expect ( annotation_995 . changed? ) . to be_truthy
expect ( annotation_995 . value ) . to eq ( " Hello " )
}
end
end
end