172 lines
7.2 KiB
Ruby
172 lines
7.2 KiB
Ruby
describe 'BatchOperation a dossier:', js: true, retry: 3 do
|
||
include ActionView::RecordIdentifier
|
||
include ActiveJob::TestHelper
|
||
|
||
let(:password) { 'demarches-simplifiees' }
|
||
let(:instructeur) { create(:instructeur, password: password) }
|
||
let(:procedure) { create(:simple_procedure, :published, instructeurs: [instructeur], administrateurs: [create(:administrateur)]) }
|
||
|
||
context 'with an instructeur' do
|
||
scenario 'create a BatchOperation' do
|
||
dossier_1 = create(:dossier, :accepte, procedure: procedure)
|
||
dossier_2 = create(:dossier, :accepte, procedure: procedure)
|
||
dossier_3 = create(:dossier, :accepte, procedure: procedure)
|
||
log_in(instructeur.email, password)
|
||
|
||
# visit a page without batch operation and make sure there is no checkboxes in table
|
||
visit instructeur_procedure_path(procedure, statut: 'tous')
|
||
expect(page).not_to have_selector("#checkbox_all_batch_operation")
|
||
expect(page).not_to have_selector("#checkbox_#{dossier_1.id}_batch_operation")
|
||
|
||
visit instructeur_procedure_path(procedure, statut: 'traites')
|
||
|
||
# check a11y with enabled checkbox
|
||
expect(page).to be_axe_clean
|
||
# ensure button is disabled by default
|
||
expect(page).to have_button("Archiver les dossiers", disabled: true)
|
||
|
||
checkbox_id = dom_id(BatchOperation.new, "checkbox_#{dossier_1.id}")
|
||
# batch one dossier
|
||
check(checkbox_id)
|
||
expect(page).to have_button("Archiver les dossiers")
|
||
|
||
# ensure batch is created
|
||
|
||
page.accept_alert do
|
||
click_on "Archiver les dossiers"
|
||
end
|
||
|
||
# ensure batched dossier is disabled
|
||
expect(page).to have_selector("##{checkbox_id}[disabled]")
|
||
# ensure Batch is created
|
||
expect(BatchOperation.count).to eq(1)
|
||
# check a11y with disabled checkbox
|
||
expect(page).to be_axe_clean
|
||
|
||
# ensure alert is present
|
||
expect(page).to have_content("Information : Une action de masse est en cours")
|
||
expect(page).to have_content("1 dossier est en cours d'archivage")
|
||
|
||
# ensure jobs are queued
|
||
perform_enqueued_jobs(only: [BatchOperationEnqueueAllJob])
|
||
expect { perform_enqueued_jobs(only: [BatchOperationProcessOneJob]) }
|
||
.to change { dossier_1.reload.archived }
|
||
.from(false).to(true)
|
||
|
||
# ensure alert updates when jobs are run
|
||
click_on "Recharger la page"
|
||
expect(page).to have_content("L’action de masse est terminée")
|
||
expect(page).to have_content("1 dossier a été archivé")
|
||
|
||
# clean alert after reload
|
||
visit instructeur_procedure_path(procedure, statut: 'traites')
|
||
expect(page).not_to have_content("L’action de masse est terminée")
|
||
|
||
# try checkall
|
||
find("##{dom_id(BatchOperation.new, :checkbox_all)}").check
|
||
|
||
# multiple select notice don't appear if all the dossiers are on the same page
|
||
expect(page).to have_selector('#js_batch_select_more', visible: false)
|
||
|
||
[dossier_2, dossier_3].map do |dossier|
|
||
dossier_checkbox_id = dom_id(BatchOperation.new, "checkbox_#{dossier.id}")
|
||
expect(page).to have_selector("##{dossier_checkbox_id}:checked")
|
||
end
|
||
|
||
# submit checkall
|
||
page.accept_alert do
|
||
click_on "Archiver les dossiers"
|
||
end
|
||
|
||
# reload
|
||
visit instructeur_procedure_path(procedure, statut: 'traites')
|
||
|
||
expect(BatchOperation.count).to eq(2)
|
||
expect(BatchOperation.last.dossiers).to match_array([dossier_2, dossier_3])
|
||
end
|
||
|
||
scenario 'create a BatchOperation with more dossiers than pagination' do
|
||
stub_const "Instructeurs::ProceduresController::ITEMS_PER_PAGE", 2
|
||
dossier_1 = create(:dossier, :en_instruction, procedure: procedure)
|
||
dossier_2 = create(:dossier, :en_instruction, procedure: procedure)
|
||
dossier_3 = create(:dossier, :en_instruction, procedure: procedure)
|
||
log_in(instructeur.email, password)
|
||
|
||
visit instructeur_procedure_path(procedure, statut: 'a-suivre')
|
||
|
||
expect(page).to have_content("1 - 2 sur 3 dossiers")
|
||
|
||
# click on check_all make the notice appear
|
||
find("##{dom_id(BatchOperation.new, :checkbox_all)}").check
|
||
expect(page).to have_selector('#js_batch_select_more')
|
||
expect(page).to have_content('Les 2 dossiers de cette page sont sélectionnés. Sélectionner tous les 3 dossiers.')
|
||
|
||
# click on selection link fill checkbox value with dossier_ids
|
||
click_on("Sélectionner tous les 3 dossiers")
|
||
expect(page).to have_content('3 dossiers sont sélectionnés. Effacer la sélection ')
|
||
expect(find_field("batch_operation[dossier_ids][]", type: :hidden).value).to eq "#{dossier_3.id},#{dossier_2.id},#{dossier_1.id}"
|
||
|
||
# click on delete link empty checkbox value and hide notice
|
||
click_on("Effacer la sélection")
|
||
expect(page).to have_selector('#js_batch_select_more', visible: false)
|
||
expect(page).to have_button("Suivre les dossiers", disabled: true)
|
||
expect(find_field("batch_operation[dossier_ids][]", type: :hidden).value).to eq ""
|
||
|
||
# click on check_all + notice link and submit
|
||
find("##{dom_id(BatchOperation.new, :checkbox_all)}").check
|
||
click_on("Sélectionner tous les 3 dossiers")
|
||
|
||
accept_alert do
|
||
click_on "Suivre les dossiers"
|
||
end
|
||
|
||
# reload
|
||
visit instructeur_procedure_path(procedure, statut: 'a-suivre')
|
||
|
||
expect(BatchOperation.count).to eq(1)
|
||
expect(BatchOperation.last.dossiers).to match_array([dossier_1, dossier_2, dossier_3])
|
||
end
|
||
|
||
scenario 'create a BatchOperation within the limit of selection' do
|
||
stub_const "Instructeurs::ProceduresController::ITEMS_PER_PAGE", 2
|
||
stub_const "Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT", 3
|
||
dossier_1 = create(:dossier, :en_instruction, procedure: procedure)
|
||
dossier_2 = create(:dossier, :en_instruction, procedure: procedure)
|
||
dossier_3 = create(:dossier, :en_instruction, procedure: procedure)
|
||
dossier_4 = create(:dossier, :en_instruction, procedure: procedure)
|
||
log_in(instructeur.email, password)
|
||
|
||
visit instructeur_procedure_path(procedure, statut: 'a-suivre')
|
||
|
||
# click on check_all make the notice appear
|
||
find("##{dom_id(BatchOperation.new, :checkbox_all)}").check
|
||
expect(page).to have_selector('#js_batch_select_more')
|
||
expect(page).to have_content('Les 2 dossiers de cette page sont sélectionnés. Sélectionner les 3 premiers dossiers sur les 4')
|
||
|
||
# click on selection link fill checkbox value with dossier_ids
|
||
click_on("Sélectionner les 3 premiers dossiers sur les 4")
|
||
expect(page).to have_content('3 dossiers sont sélectionnés. Effacer la sélection')
|
||
expect(find_field("batch_operation[dossier_ids][]", type: :hidden).value).to eq "#{dossier_4.id},#{dossier_3.id},#{dossier_2.id}"
|
||
|
||
# create batch
|
||
accept_alert do
|
||
click_on "Suivre les dossiers"
|
||
end
|
||
|
||
# reload
|
||
visit instructeur_procedure_path(procedure, statut: 'a-suivre')
|
||
|
||
expect(BatchOperation.count).to eq(1)
|
||
expect(BatchOperation.last.dossiers).to match_array([dossier_2, dossier_3, dossier_4])
|
||
end
|
||
end
|
||
|
||
def log_in(email, password, check_email: true)
|
||
visit new_user_session_path
|
||
expect(page).to have_current_path(new_user_session_path)
|
||
|
||
sign_in_with(email, password, check_email)
|
||
|
||
expect(page).to have_current_path(instructeur_procedures_path)
|
||
end
|
||
end
|