2023-03-06 15:51:08 +01:00
|
|
|
describe 'shared/dossiers/edit', type: :view do
|
2020-08-19 17:27:57 +02:00
|
|
|
before do
|
|
|
|
allow(controller).to receive(:current_user).and_return(dossier.user)
|
2022-09-19 18:27:50 +02:00
|
|
|
allow(view).to receive(:administrateur_signed_in?).and_return(false)
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
|
2023-03-06 15:51:08 +01:00
|
|
|
subject { render 'shared/dossiers/edit', dossier: dossier, apercu: false }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
|
|
|
context 'when there are some champs' do
|
|
|
|
let(:dossier) { create(:dossier) }
|
2023-01-05 12:18:27 +01:00
|
|
|
let(:champ_checkbox) { create(:champ_checkbox, dossier: dossier, value: 'true') }
|
2020-08-19 17:27:57 +02:00
|
|
|
let(:champ_header_section) { create(:champ_header_section, dossier: dossier, value: 'Section') }
|
|
|
|
let(:champ_explication) { create(:champ_explication, dossier: dossier, value: 'mazette') }
|
|
|
|
let(:champ_dossier_link) { create(:champ_dossier_link, dossier: dossier, value: dossier.id) }
|
|
|
|
let(:champ_textarea) { create(:champ_textarea, dossier: dossier, value: 'Some long text in a textarea.') }
|
|
|
|
let(:champs) { [champ_checkbox, champ_header_section, champ_explication, champ_dossier_link, champ_textarea] }
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
before { dossier.champs_public << champs }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
|
|
|
it 'renders labels and editable values of champs' do
|
|
|
|
expect(subject).to have_field(champ_checkbox.libelle, checked: true)
|
|
|
|
expect(subject).to have_css(".header-section", text: champ_header_section.libelle)
|
|
|
|
expect(subject).to have_text(champ_explication.libelle)
|
|
|
|
expect(subject).to have_field(champ_dossier_link.libelle, with: champ_dossier_link.value)
|
|
|
|
expect(subject).to have_field(champ_textarea.libelle, with: champ_textarea.value)
|
|
|
|
end
|
2022-07-04 18:37:30 +02:00
|
|
|
|
|
|
|
context "with standard champs" do
|
|
|
|
let(:champ_email) { create(:champ_email, dossier: dossier) }
|
|
|
|
let(:champ_phone) { create(:champ_phone, dossier: dossier) }
|
|
|
|
let(:champs) { [champ_email, champ_phone] }
|
|
|
|
|
2023-09-25 18:01:54 +02:00
|
|
|
it "does not render basic placeholders" do
|
|
|
|
expect(subject).not_to have_css('input[type="email"][placeholder$="exemple.fr"]')
|
|
|
|
expect(subject).not_to have_css('input[type="tel"][placeholder^="0612"]')
|
2022-07-04 18:37:30 +02:00
|
|
|
end
|
|
|
|
end
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a single-value list' do
|
|
|
|
let(:dossier) { create(:dossier) }
|
|
|
|
let(:type_de_champ) { create(:type_de_champ_drop_down_list, mandatory: mandatory, procedure: dossier.procedure) }
|
2023-01-18 09:47:22 +01:00
|
|
|
let(:champ) { create(:champ_drop_down_list, dossier: dossier, type_de_champ: type_de_champ, value: value) }
|
2020-08-19 17:27:57 +02:00
|
|
|
let(:enabled_options) { type_de_champ.drop_down_list_enabled_non_empty_options }
|
|
|
|
let(:mandatory) { true }
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
before { dossier.champs_public << champ }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
|
|
|
context 'when the list is short' do
|
2023-01-18 09:47:22 +01:00
|
|
|
let(:value) { 'val1' }
|
2023-10-27 17:39:02 +02:00
|
|
|
|
2020-08-19 17:27:57 +02:00
|
|
|
it 'renders the list as radio buttons' do
|
|
|
|
expect(subject).to have_selector('input[type=radio]', count: enabled_options.count)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the champ is optional' do
|
|
|
|
let(:mandatory) { false }
|
|
|
|
|
|
|
|
it 'allows unselecting a previously selected value' do
|
|
|
|
expect(subject).to have_selector('input[type=radio]', count: enabled_options.count + 1)
|
|
|
|
expect(subject).to have_unchecked_field('Non renseigné', count: 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the list is long' do
|
2023-01-18 09:47:22 +01:00
|
|
|
let(:value) { 'alpha' }
|
2020-08-19 17:27:57 +02:00
|
|
|
let(:type_de_champ) { create(:type_de_champ_drop_down_list, :long, procedure: dossier.procedure) }
|
|
|
|
|
|
|
|
it 'renders the list as a dropdown' do
|
2023-10-27 17:39:02 +02:00
|
|
|
expect(subject).to have_select(type_de_champ.libelle, options: enabled_options + [''])
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a multiple-values list' do
|
|
|
|
let(:dossier) { create(:dossier) }
|
2021-07-08 17:29:40 +02:00
|
|
|
let(:type_de_champ) { create(:type_de_champ_multiple_drop_down_list, procedure: dossier.procedure, drop_down_list_value: drop_down_list_value) }
|
|
|
|
let(:champ) { create(:champ_multiple_drop_down_list, dossier: dossier, type_de_champ: type_de_champ, value: champ_value) }
|
2020-08-19 17:27:57 +02:00
|
|
|
let(:options) { type_de_champ.drop_down_list_options }
|
|
|
|
let(:enabled_options) { type_de_champ.drop_down_list_enabled_non_empty_options }
|
|
|
|
|
2022-11-10 22:21:14 +01:00
|
|
|
before { dossier.champs_public << champ }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
|
|
|
context 'when the list is short' do
|
2021-07-08 17:29:40 +02:00
|
|
|
let(:drop_down_list_value) { ['valid', 'invalid', 'not sure yet'].join("\r\n") }
|
|
|
|
let(:champ_value) { ['invalid'].to_json }
|
|
|
|
|
2020-08-19 17:27:57 +02:00
|
|
|
it 'renders the list as checkboxes' do
|
|
|
|
expect(subject).to have_selector('input[type=checkbox]', count: enabled_options.count)
|
2021-07-08 17:29:40 +02:00
|
|
|
expect(subject).to have_selector('input[type=checkbox][checked=checked]', count: 1)
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
2020-08-25 12:47:36 +02:00
|
|
|
|
|
|
|
it 'adds an extra hidden input, to send a blank value even when all checkboxes are unchecked' do
|
|
|
|
expect(subject).to have_selector('input[type=hidden][value=""]')
|
|
|
|
end
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the list is long' do
|
2021-07-08 17:29:40 +02:00
|
|
|
let(:drop_down_list_value) { ['peach', 'banana', 'pear', 'apricot', 'apple', 'grapefruit'].join("\r\n") }
|
|
|
|
let(:champ_value) { ['banana', 'grapefruit'].to_json }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
|
|
|
it 'renders the list as a multiple-selection dropdown' do
|
2023-03-29 23:31:13 +02:00
|
|
|
expect(subject).to have_selector('select')
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-07-28 11:08:27 +02:00
|
|
|
context 'with a mandatory piece justificative' do
|
|
|
|
let(:dossier) { create(:dossier) }
|
|
|
|
let(:type_de_champ) { create(:type_de_champ_piece_justificative, procedure: dossier.procedure, mandatory: true) }
|
|
|
|
let(:champ) { create(:champ_piece_justificative, dossier: dossier, type_de_champ: type_de_champ) }
|
|
|
|
|
|
|
|
context 'when dossier is en construction' do
|
|
|
|
let(:dossier) { create(:dossier, :en_construction) }
|
2022-11-10 22:21:14 +01:00
|
|
|
before { dossier.champs_public << champ }
|
2022-07-28 11:08:27 +02:00
|
|
|
|
2023-03-21 18:24:39 +01:00
|
|
|
it 'can delete a piece justificative' do
|
|
|
|
expect(subject).to have_selector("[title='Supprimer le fichier #{champ.piece_justificative_file.attachments[0].filename}']")
|
2022-07-28 11:08:27 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when dossier is brouillon' do
|
2022-09-19 18:27:50 +02:00
|
|
|
before do
|
2022-11-10 22:21:14 +01:00
|
|
|
dossier.champs_public << champ
|
2022-09-19 18:27:50 +02:00
|
|
|
end
|
2022-07-28 11:08:27 +02:00
|
|
|
|
|
|
|
it 'can delete a piece justificative' do
|
2022-11-21 18:32:17 +01:00
|
|
|
expect(subject).to have_selector("[title='Supprimer le fichier #{champ.piece_justificative_file.attachments[0].filename}']")
|
2022-07-28 11:08:27 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-19 17:27:57 +02:00
|
|
|
context 'with a routed procedure' do
|
2023-06-20 15:46:12 +02:00
|
|
|
let(:procedure_routee) do
|
|
|
|
create(:procedure, :routee)
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
2023-06-20 15:46:12 +02:00
|
|
|
let!(:drop_down_tdc) { create(:type_de_champ_drop_down_list, procedure: procedure_routee, drop_down_options: options) }
|
|
|
|
let(:options) { procedure_routee.groupe_instructeurs.pluck(:label) }
|
|
|
|
let(:dossier) { create(:dossier, procedure: procedure_routee) }
|
|
|
|
let(:champs) { [champ_drop_down] }
|
|
|
|
let(:champ_drop_down) { create(:champ_drop_down_list, dossier: dossier, type_de_champ: drop_down_tdc, value: options.first) }
|
2020-08-19 17:27:57 +02:00
|
|
|
|
2023-06-20 15:46:12 +02:00
|
|
|
before { dossier.champs_public << champs }
|
|
|
|
|
|
|
|
it 'renders the libelle of the type de champ used for routing' do
|
|
|
|
expect(subject).to include(champ_drop_down.libelle)
|
2021-03-09 11:21:30 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when groupe instructeur is selected' do
|
|
|
|
before do
|
|
|
|
dossier.groupe_instructeur = dossier.procedure.defaut_groupe_instructeur
|
|
|
|
end
|
|
|
|
|
2023-06-20 15:46:12 +02:00
|
|
|
it 'renders the routing libelle and its value' do
|
|
|
|
expect(subject).to include(champ_drop_down.libelle)
|
2021-03-09 11:21:30 +01:00
|
|
|
expect(subject).to include(dossier.groupe_instructeur.label)
|
|
|
|
end
|
2020-08-19 17:27:57 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|