2021-10-26 11:44:53 +02:00
|
|
|
|
describe 'Instructing a dossier:', js: true do
|
2018-05-25 18:05:28 +02:00
|
|
|
|
include ActiveJob::TestHelper
|
|
|
|
|
|
2020-07-21 16:49:26 +02:00
|
|
|
|
let(:password) { 'my-s3cure-p4ssword' }
|
2019-08-06 11:02:54 +02:00
|
|
|
|
let!(:instructeur) { create(:instructeur, password: password) }
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
2022-06-13 22:54:57 +02:00
|
|
|
|
let!(:procedure) { create(:procedure, :with_type_de_champ, :published, instructeurs: [instructeur]) }
|
2021-01-28 13:53:18 +01:00
|
|
|
|
let!(:dossier) { create(:dossier, :en_construction, :with_entreprise, procedure: procedure) }
|
2019-08-08 16:55:51 +02:00
|
|
|
|
context 'the instructeur is also a user' do
|
2019-08-06 11:02:54 +02:00
|
|
|
|
scenario 'a instructeur can fill a dossier' do
|
2018-11-22 18:11:00 +01:00
|
|
|
|
visit commencer_path(path: procedure.path)
|
2019-01-16 11:57:58 +01:00
|
|
|
|
click_on 'J’ai déjà un compte'
|
2018-11-22 18:11:00 +01:00
|
|
|
|
|
|
|
|
|
expect(page).to have_current_path new_user_session_path
|
2019-08-06 11:02:54 +02:00
|
|
|
|
sign_in_with(instructeur.email, password, true)
|
2018-11-22 18:11:00 +01:00
|
|
|
|
|
2019-08-08 16:24:30 +02:00
|
|
|
|
# connexion link erase user stored location
|
|
|
|
|
# expect(page).to have_current_path(commencer_path(path: procedure.path))
|
|
|
|
|
|
|
|
|
|
visit commencer_path(path: procedure.path)
|
2019-01-16 16:16:15 +01:00
|
|
|
|
click_on 'Commencer la démarche'
|
|
|
|
|
|
|
|
|
|
expect(page).to have_content('Identifier votre établissement')
|
2019-01-16 11:57:58 +01:00
|
|
|
|
expect(page).to have_current_path(siret_dossier_path(procedure.reload.dossiers.last))
|
2018-11-22 18:11:00 +01:00
|
|
|
|
expect(page).to have_content(procedure.libelle)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
scenario 'A instructeur can accept a dossier', :js do
|
|
|
|
|
log_in(instructeur.email, password)
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedures_path)
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedure_path(procedure))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
|
|
|
|
click_on dossier.user.email
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_dossier_path(procedure, dossier))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
2018-09-13 17:13:09 +02:00
|
|
|
|
click_on 'En construction'
|
|
|
|
|
accept_confirm do
|
|
|
|
|
click_on 'Passer en instruction'
|
|
|
|
|
end
|
|
|
|
|
expect(page).to have_text('En instruction')
|
|
|
|
|
|
2017-09-25 14:57:55 +02:00
|
|
|
|
dossier.reload
|
2018-08-28 14:10:55 +02:00
|
|
|
|
expect(dossier.state).to eq(Dossier.states.fetch(:en_instruction))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
2018-09-13 17:13:09 +02:00
|
|
|
|
click_on 'En instruction'
|
|
|
|
|
|
2019-03-13 16:48:38 +01:00
|
|
|
|
within('.state-button') do
|
2018-09-13 17:13:09 +02:00
|
|
|
|
click_on 'Accepter'
|
|
|
|
|
end
|
|
|
|
|
|
2017-11-29 11:47:18 +01:00
|
|
|
|
within('.accept.motivation') do
|
|
|
|
|
fill_in('dossier_motivation', with: 'a good reason')
|
2018-09-13 17:13:09 +02:00
|
|
|
|
|
|
|
|
|
accept_confirm do
|
|
|
|
|
click_on 'Valider la décision'
|
|
|
|
|
end
|
2017-11-29 11:47:18 +01:00
|
|
|
|
end
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
2018-09-13 17:13:09 +02:00
|
|
|
|
expect(page).to have_text('Dossier traité avec succès.')
|
2019-08-12 16:46:38 +02:00
|
|
|
|
expect(page).to have_link('Archiver le dossier')
|
2018-09-13 17:13:09 +02:00
|
|
|
|
|
2017-09-25 14:57:55 +02:00
|
|
|
|
dossier.reload
|
2018-08-28 14:10:55 +02:00
|
|
|
|
expect(dossier.state).to eq(Dossier.states.fetch(:accepte))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
expect(dossier.motivation).to eq('a good reason')
|
2021-06-16 16:03:57 +02:00
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
|
|
|
|
click_on 'traité'
|
2022-05-16 15:54:16 +02:00
|
|
|
|
click_on 'Actions' # destroy from list
|
2022-03-11 13:57:09 +01:00
|
|
|
|
click_on 'Supprimer le dossier'
|
2021-06-16 16:03:57 +02:00
|
|
|
|
click_on 'traité'
|
|
|
|
|
expect(page).not_to have_button('Actions')
|
2017-09-25 14:57:55 +02:00
|
|
|
|
end
|
|
|
|
|
|
2022-05-16 15:54:16 +02:00
|
|
|
|
scenario 'An instructeur can destroy a dossier from view' do
|
|
|
|
|
log_in(instructeur.email, password)
|
|
|
|
|
|
|
|
|
|
dossier.passer_en_instruction(instructeur: instructeur)
|
|
|
|
|
dossier.accepter!(instructeur: instructeur)
|
|
|
|
|
visit instructeur_dossier_path(procedure, dossier)
|
|
|
|
|
click_on 'Actions' # destroy from view
|
|
|
|
|
within '.user-dossier-actions' do
|
|
|
|
|
click_on 'Supprimer le dossier'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
scenario 'A instructeur can follow/unfollow a dossier' do
|
|
|
|
|
log_in(instructeur.email, password)
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
|
|
|
|
test_statut_bar(a_suivre: 1, tous_les_dossiers: 1)
|
|
|
|
|
dossier_present?(dossier.id, 'en construction')
|
|
|
|
|
|
2017-10-05 19:21:21 +02:00
|
|
|
|
click_on 'Suivre le dossier'
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedure_path(procedure))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
test_statut_bar(suivi: 1, tous_les_dossiers: 1)
|
|
|
|
|
expect(page).to have_text('Aucun dossier')
|
|
|
|
|
|
|
|
|
|
click_on 'suivi'
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedure_path(procedure, statut: 'suivis'))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
dossier_present?(dossier.id, 'en construction')
|
|
|
|
|
|
2017-10-05 19:21:21 +02:00
|
|
|
|
click_on 'Ne plus suivre'
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedure_path(procedure, statut: 'suivis'))
|
2017-09-25 14:57:55 +02:00
|
|
|
|
test_statut_bar(a_suivre: 1, tous_les_dossiers: 1)
|
|
|
|
|
expect(page).to have_text('Aucun dossier')
|
|
|
|
|
end
|
|
|
|
|
|
2021-06-16 11:46:25 +02:00
|
|
|
|
scenario 'A instructeur can request an export' do
|
|
|
|
|
log_in(instructeur.email, password)
|
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
|
|
|
|
test_statut_bar(a_suivre: 1, tous_les_dossiers: 1)
|
|
|
|
|
assert_performed_jobs 1
|
|
|
|
|
|
2022-04-05 15:57:19 +02:00
|
|
|
|
click_on "Télécharger un dossier"
|
|
|
|
|
within(:css, '.dossiers-export') do
|
|
|
|
|
click_on "Demander un export au format .csv"
|
|
|
|
|
end
|
2022-07-04 16:13:15 +02:00
|
|
|
|
|
2022-04-05 15:57:19 +02:00
|
|
|
|
expect(page).to have_text('Nous générons cet export.')
|
2022-07-04 16:13:15 +02:00
|
|
|
|
click_on "Télécharger un dossier"
|
2022-04-05 15:57:19 +02:00
|
|
|
|
expect(page).to have_text('Un export au format .csv est en train d’être généré')
|
2021-06-16 11:46:25 +02:00
|
|
|
|
perform_enqueued_jobs(only: ExportJob)
|
2022-05-06 19:25:12 +02:00
|
|
|
|
assert_performed_jobs 2
|
2021-06-16 11:46:25 +02:00
|
|
|
|
page.driver.browser.navigate.refresh
|
|
|
|
|
|
2022-04-05 15:57:19 +02:00
|
|
|
|
click_on "Télécharger un dossier"
|
2022-05-06 19:25:12 +02:00
|
|
|
|
expect(page).to have_text('Télécharger l’export au format .csv')
|
2021-06-16 11:46:25 +02:00
|
|
|
|
end
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
scenario 'A instructeur can see the personnes impliquées' do
|
2020-08-27 19:56:34 +02:00
|
|
|
|
instructeur2 = create(:instructeur, password: password)
|
2017-12-01 15:03:19 +01:00
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
log_in(instructeur.email, password)
|
2017-12-01 15:03:19 +01:00
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
|
|
|
|
click_on dossier.user.email
|
|
|
|
|
|
|
|
|
|
click_on 'Avis externes'
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(avis_instructeur_dossier_path(procedure, dossier))
|
2017-12-01 15:03:19 +01:00
|
|
|
|
|
2021-04-01 12:00:07 +02:00
|
|
|
|
expert_email_formated = "[\"expert@tps.com\"]"
|
2017-12-01 15:03:19 +01:00
|
|
|
|
expert_email = 'expert@tps.com'
|
2021-04-01 12:00:07 +02:00
|
|
|
|
ask_confidential_avis(expert_email_formated, 'a good introduction')
|
2017-12-01 15:03:19 +01:00
|
|
|
|
|
2021-04-01 12:00:07 +02:00
|
|
|
|
expert_email_formated = "[\"#{instructeur2.email}\"]"
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expert_email = instructeur2.email
|
2021-04-01 12:00:07 +02:00
|
|
|
|
ask_confidential_avis(expert_email_formated, 'a good introduction')
|
2017-12-01 15:03:19 +01:00
|
|
|
|
|
|
|
|
|
click_on 'Personnes impliquées'
|
|
|
|
|
expect(page).to have_text(expert_email)
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_text(instructeur2.email)
|
2017-12-01 15:03:19 +01:00
|
|
|
|
end
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
scenario 'A instructeur can send a dossier to several instructeurs', js: true do
|
2020-08-27 19:56:34 +02:00
|
|
|
|
instructeur_2 = create(:instructeur)
|
|
|
|
|
instructeur_3 = create(:instructeur)
|
2019-08-21 14:09:56 +02:00
|
|
|
|
procedure.defaut_groupe_instructeur.instructeurs << [instructeur_2, instructeur_3]
|
2018-09-10 17:52:49 +02:00
|
|
|
|
|
|
|
|
|
send_dossier = double()
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(InstructeurMailer).to receive(:send_dossier).and_return(send_dossier).twice
|
2018-09-10 17:52:49 +02:00
|
|
|
|
expect(send_dossier).to receive(:deliver_later).twice
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
log_in(instructeur.email, password)
|
2018-09-10 17:52:49 +02:00
|
|
|
|
|
|
|
|
|
click_on procedure.libelle
|
|
|
|
|
click_on dossier.user.email
|
|
|
|
|
|
|
|
|
|
click_on 'Personnes impliquées'
|
|
|
|
|
|
2022-01-13 13:18:49 +01:00
|
|
|
|
select_combobox('Emails', instructeur_2.email, instructeur_2.email, check: false)
|
|
|
|
|
select_combobox('Emails', instructeur_3.email, instructeur_3.email, check: false)
|
2018-09-10 17:52:49 +02:00
|
|
|
|
|
|
|
|
|
click_on 'Envoyer'
|
|
|
|
|
|
|
|
|
|
expect(page).to have_text("Dossier envoyé")
|
|
|
|
|
end
|
|
|
|
|
|
2022-08-23 14:30:15 +02:00
|
|
|
|
context 'A instructeur can ask for an Archive' do
|
|
|
|
|
let(:procedure) { create(:procedure, :published, :with_piece_justificative, instructeurs: [instructeur]) }
|
|
|
|
|
let(:dossier) { create(:dossier, :accepte, procedure: procedure) }
|
|
|
|
|
before do
|
|
|
|
|
log_in(instructeur.email, password)
|
|
|
|
|
visit instructeur_archives_path(procedure)
|
|
|
|
|
end
|
|
|
|
|
scenario 'download' do
|
|
|
|
|
expect {
|
|
|
|
|
page.first(".archive-table .button").click
|
|
|
|
|
}.to have_enqueued_job(ArchiveCreationJob).with(procedure, an_instance_of(Archive), instructeur)
|
|
|
|
|
expect(Archive.first.month).not_to be_nil
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-07-21 17:11:40 +02:00
|
|
|
|
context 'with dossiers having attached files', js: true do
|
2020-07-20 17:20:12 +02:00
|
|
|
|
let(:procedure) { create(:procedure, :published, :with_piece_justificative, instructeurs: [instructeur]) }
|
|
|
|
|
let(:dossier) { create(:dossier, :en_construction, procedure: procedure) }
|
|
|
|
|
let(:champ) { dossier.champs.first }
|
|
|
|
|
let(:path) { 'spec/fixtures/files/piece_justificative_0.pdf' }
|
|
|
|
|
let(:commentaire) { create(:commentaire, instructeur: instructeur, dossier: dossier) }
|
|
|
|
|
|
2020-07-21 17:11:40 +02:00
|
|
|
|
before do
|
2021-11-26 12:19:40 +01:00
|
|
|
|
dossier.passer_en_instruction!(instructeur: instructeur)
|
2022-04-08 15:27:35 +02:00
|
|
|
|
champ.piece_justificative_file
|
|
|
|
|
.attach(io: File.open(path),
|
|
|
|
|
filename: "piece_justificative_0.pdf",
|
|
|
|
|
content_type: "application/pdf",
|
|
|
|
|
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE })
|
2020-07-20 17:20:12 +02:00
|
|
|
|
|
|
|
|
|
log_in(instructeur.email, password)
|
|
|
|
|
visit instructeur_dossier_path(procedure, dossier)
|
2020-07-21 17:11:40 +02:00
|
|
|
|
end
|
2020-07-20 17:20:12 +02:00
|
|
|
|
|
2020-07-21 17:11:40 +02:00
|
|
|
|
scenario 'A instructeur can download an archive containing a single attachment' do
|
2022-04-08 15:27:35 +02:00
|
|
|
|
find(:css, '[aria-controls=print-pj-menu]').click
|
2021-03-08 11:43:37 +01:00
|
|
|
|
click_on 'Télécharger le dossier et toutes ses pièces jointes'
|
2020-07-20 17:20:12 +02:00
|
|
|
|
# For some reason, clicking the download link does not trigger the download in the headless browser ;
|
|
|
|
|
# So we need to go to the download link directly
|
|
|
|
|
visit telecharger_pjs_instructeur_dossier_path(procedure, dossier)
|
|
|
|
|
|
|
|
|
|
DownloadHelpers.wait_for_download
|
|
|
|
|
files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download))
|
|
|
|
|
|
|
|
|
|
expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip"
|
2021-03-08 11:35:20 +01:00
|
|
|
|
expect(files.size).to be 3
|
2021-04-29 17:29:47 +02:00
|
|
|
|
expect(files[0].filename.include?('export')).to be_truthy
|
|
|
|
|
expect(files[1].filename.include?('piece_justificative_0')).to be_truthy
|
|
|
|
|
expect(files[1].uncompressed_size).to be File.size(path)
|
|
|
|
|
expect(files[2].filename.include?('horodatage/operation')).to be_truthy
|
2020-07-20 17:20:12 +02:00
|
|
|
|
end
|
|
|
|
|
|
2020-07-21 17:11:40 +02:00
|
|
|
|
scenario 'A instructeur can download an archive containing several identical attachments' do
|
2022-04-08 15:27:35 +02:00
|
|
|
|
commentaire
|
|
|
|
|
.piece_jointe
|
|
|
|
|
.attach(io: File.open(path),
|
|
|
|
|
filename: "piece_justificative_0.pdf",
|
|
|
|
|
content_type: "application/pdf",
|
|
|
|
|
metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE })
|
2020-07-20 17:20:12 +02:00
|
|
|
|
|
|
|
|
|
visit telecharger_pjs_instructeur_dossier_path(procedure, dossier)
|
|
|
|
|
DownloadHelpers.wait_for_download
|
|
|
|
|
files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download))
|
|
|
|
|
|
|
|
|
|
expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip"
|
2021-03-08 11:35:20 +01:00
|
|
|
|
expect(files.size).to be 4
|
2021-04-29 17:29:47 +02:00
|
|
|
|
expect(files[0].filename.include?('export')).to be_truthy
|
2020-07-20 17:20:12 +02:00
|
|
|
|
expect(files[1].filename.include?('piece_justificative_0')).to be_truthy
|
2021-04-29 17:29:47 +02:00
|
|
|
|
expect(files[2].filename.include?('piece_justificative_0')).to be_truthy
|
|
|
|
|
expect(files[1].filename).not_to eq files[2].filename
|
2020-07-20 17:20:12 +02:00
|
|
|
|
expect(files[1].uncompressed_size).to be File.size(path)
|
2021-04-29 17:29:47 +02:00
|
|
|
|
expect(files[2].uncompressed_size).to be File.size(path)
|
|
|
|
|
expect(files[3].filename.include?('horodatage/operation')).to be_truthy
|
2020-07-20 17:20:12 +02:00
|
|
|
|
end
|
|
|
|
|
|
2021-02-09 15:12:06 +01:00
|
|
|
|
before { DownloadHelpers.clear_downloads }
|
2020-07-20 17:20:12 +02:00
|
|
|
|
after { DownloadHelpers.clear_downloads }
|
|
|
|
|
end
|
|
|
|
|
|
2018-10-03 11:11:02 +02:00
|
|
|
|
def log_in(email, password, check_email: true)
|
2017-09-25 14:57:55 +02:00
|
|
|
|
visit '/'
|
|
|
|
|
click_on 'Connexion'
|
|
|
|
|
expect(page).to have_current_path(new_user_session_path)
|
|
|
|
|
|
2018-10-03 11:11:02 +02:00
|
|
|
|
sign_in_with(email, password, check_email)
|
|
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
|
expect(page).to have_current_path(instructeur_procedures_path)
|
2017-09-25 14:57:55 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def log_out
|
|
|
|
|
click_on 'Se déconnecter'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def ask_confidential_avis(to, introduction)
|
2021-04-01 12:00:07 +02:00
|
|
|
|
page.execute_script("document.querySelector('#avis_emails').value = '#{to}'")
|
2017-09-25 14:57:55 +02:00
|
|
|
|
fill_in 'avis_introduction', with: introduction
|
|
|
|
|
select 'confidentiel', from: 'avis_confidentiel'
|
|
|
|
|
click_on 'Demander un avis'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def test_statut_bar(a_suivre: 0, suivi: 0, traite: 0, tous_les_dossiers: 0, archive: 0)
|
|
|
|
|
texts = [
|
2021-04-26 17:15:28 +02:00
|
|
|
|
"#{a_suivre} à suivre",
|
|
|
|
|
"#{suivi} suivi",
|
|
|
|
|
"#{traite} traité",
|
|
|
|
|
"#{tous_les_dossiers} au total",
|
|
|
|
|
"#{archive} archivé"
|
2018-01-15 19:17:01 +01:00
|
|
|
|
]
|
2017-09-25 14:57:55 +02:00
|
|
|
|
|
|
|
|
|
texts.each { |text| expect(page).to have_text(text) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def dossier_present?(id, statut)
|
|
|
|
|
within(:css, '.dossiers-table') do
|
|
|
|
|
expect(page).to have_text(id)
|
|
|
|
|
expect(page).to have_text(statut)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|