71741c5f98
The check for whether the checkbox should be checked or not was made by matching the whole string. Thus, given two options 'valid' and 'invalid', the check for the presence of 'valid' would succeed even when only 'invalid' was present in the values (because `'valid'.includes?('invalid')`. The code now checks against the list of items in the selected_options.
119 lines
5 KiB
Ruby
119 lines
5 KiB
Ruby
describe 'shared/dossiers/edit.html.haml', type: :view do
|
|
before do
|
|
allow(controller).to receive(:current_user).and_return(dossier.user)
|
|
end
|
|
|
|
subject { render 'shared/dossiers/edit.html.haml', dossier: dossier, apercu: false }
|
|
|
|
context 'when there are some champs' do
|
|
let(:dossier) { create(:dossier) }
|
|
let(:champ_checkbox) { create(:champ_checkbox, dossier: dossier, value: 'on') }
|
|
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] }
|
|
|
|
before { dossier.champs << champs }
|
|
|
|
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
|
|
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) }
|
|
let(:champ) { create(:champ_drop_down_list, dossier: dossier, type_de_champ: type_de_champ) }
|
|
let(:options) { type_de_champ.drop_down_list_options }
|
|
let(:enabled_options) { type_de_champ.drop_down_list_enabled_non_empty_options }
|
|
let(:mandatory) { true }
|
|
|
|
before { dossier.champs << champ }
|
|
|
|
context 'when the list is short' do
|
|
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
|
|
let(:type_de_champ) { create(:type_de_champ_drop_down_list, :long, procedure: dossier.procedure) }
|
|
|
|
it 'renders the list as a dropdown' do
|
|
expect(subject).to have_select(type_de_champ.libelle, options: options)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with a multiple-values list' do
|
|
let(:dossier) { create(:dossier) }
|
|
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) }
|
|
let(:options) { type_de_champ.drop_down_list_options }
|
|
let(:enabled_options) { type_de_champ.drop_down_list_enabled_non_empty_options }
|
|
|
|
before { dossier.champs << champ }
|
|
|
|
context 'when the list is short' do
|
|
let(:drop_down_list_value) { ['valid', 'invalid', 'not sure yet'].join("\r\n") }
|
|
let(:champ_value) { ['invalid'].to_json }
|
|
|
|
it 'renders the list as checkboxes' do
|
|
expect(subject).to have_selector('input[type=checkbox]', count: enabled_options.count)
|
|
expect(subject).to have_selector('input[type=checkbox][checked=checked]', count: 1)
|
|
end
|
|
|
|
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
|
|
end
|
|
|
|
context 'when the list is long' do
|
|
let(:drop_down_list_value) { ['peach', 'banana', 'pear', 'apricot', 'apple', 'grapefruit'].join("\r\n") }
|
|
let(:champ_value) { ['banana', 'grapefruit'].to_json }
|
|
|
|
it 'renders the list as a multiple-selection dropdown' do
|
|
expect(subject).to have_selector('[data-react-class="ComboMultipleDropdownList"]')
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with a routed procedure' do
|
|
let(:procedure) do
|
|
create(:procedure,
|
|
:routee,
|
|
routing_criteria_name: 'departement')
|
|
end
|
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
|
let(:champs) { [] }
|
|
|
|
it 'renders the routing criteria name and its value' do
|
|
expect(subject).to have_field(procedure.routing_criteria_name)
|
|
end
|
|
|
|
context 'when groupe instructeur is selected' do
|
|
before do
|
|
dossier.groupe_instructeur = dossier.procedure.defaut_groupe_instructeur
|
|
end
|
|
|
|
it 'renders the routing criteria name and its value' do
|
|
expect(subject).to have_field(procedure.routing_criteria_name)
|
|
expect(subject).to include(dossier.groupe_instructeur.label)
|
|
end
|
|
end
|
|
end
|
|
end
|