demarches-normaliennes/spec/system/accessibilite/wcag_usager_spec.rb
2024-05-06 15:56:22 +02:00

207 lines
6.5 KiB
Ruby

describe 'wcag rules for usager', js: true do
let(:procedure) { create(:procedure, :published, :with_all_champs, :with_service, :for_individual) }
let(:password) { 'a very complicated password' }
let(:litteraire_user) { create(:user, password: password) }
before do
procedure.active_revision.types_de_champ_public.find { |tdc| tdc.type_champ == TypeDeChamp.type_champs.fetch(:carte) }.destroy
end
shared_examples "external links have title says it opens in a new tab" do
it do
links = page.all("a[target=_blank]")
expect(links.count).to be_positive
links.each do |link|
expect(link[:title]).to include("Nouvel onglet"), "link #{link[:href]} does not have title mentioning it opens in a new tab"
end
end
end
shared_examples "aria-label do not mix with title attribute" do
it do
elements = page.all("[aria-label][title]")
elements.each do |element|
expect(element[:title]).to be_blank, "path=#{path}, element title=\"#{element[:title]}\" mixes aria-label and title attributes"
end
end
end
def expect_axe_clean_without_main_navigation
# On page without main navigation content (like anonymous home page),
# there are either a bug in axe, either dsfr markup is not conform to wcag2a.
# There is no issue on pages having a child navigation.
expect(page).to be_axe_clean.excluding("#modal-header__menu")
expect(page).to be_axe_clean.within("#modal-header__menu").skipping("aria-prohibited-attr")
end
shared_examples "axe clean without main navigation" do
it { expect_axe_clean_without_main_navigation }
end
context 'pages without the need to be logged in' do
before do
visit path
end
context 'homepage' do
let(:path) { root_path }
it_behaves_like "axe clean without main navigation"
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
context 'sign_up page' do
let(:path) { new_user_registration_path }
it_behaves_like "axe clean without main navigation"
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
scenario 'account confirmation page' do
visit new_user_registration_path
fill_in :user_email, with: "some@email.com"
fill_in :user_password, with: "epeciusetuir"
perform_enqueued_jobs do
click_button 'Créer un compte'
expect_axe_clean_without_main_navigation
end
end
context 'sign_up confirmation' do
let(:path) { user_confirmation_path("user[email]" => "some@email.com") }
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
context 'sign_in page' do
let(:path) { new_user_session_path }
it_behaves_like "axe clean without main navigation"
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
context 'contact page' do
let(:path) { contact_path }
it_behaves_like "axe clean without main navigation"
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
context 'commencer page' do
let(:path) { commencer_path(path: procedure.path) }
it_behaves_like "axe clean without main navigation"
it_behaves_like "external links have title says it opens in a new tab"
it_behaves_like "aria-label do not mix with title attribute"
end
scenario 'commencer page, help dropdown' do
visit commencer_path(path: procedure.reload.path)
page.find("#help-menu_button").click
expect_axe_clean_without_main_navigation
end
end
context "logged in, depot d'un dossier as individual" do
before do
login_as litteraire_user, scope: :user
visit commencer_path(path: procedure.reload.path)
end
scenario 'écran identité usager' do
click_on 'Commencer la démarche'
expect(page).to be_axe_clean
end
# with no surprise, there's a lot of work on this one
scenario "dépot d'un dossier" do
click_on 'Commencer la démarche'
find('label', text: 'Monsieur')
within('.individual-infos') do
fill_in('Prénom', with: 'prenom')
fill_in('Nom', with: 'nom')
end
within "#identite-form" do
click_on 'Continuer'
end
expect(page).to be_axe_clean
end
end
context "logged in, depot d'un dossier entreprise" do
let(:procedure) { create(:procedure, :with_all_champs, :with_service, :published) }
before do
login_as litteraire_user, scope: :user
visit commencer_path(path: procedure.reload.path)
end
scenario "écran identification de l'entreprise" do
click_on 'Commencer la démarche'
expect(page).to be_axe_clean
end
end
context "logged in, avec des dossiers déposés" do
let(:dossier) { create(:dossier, procedure: procedure, user: litteraire_user) }
before do
login_as litteraire_user, scope: :user
end
scenario 'liste des dossiers sans dossiers' do
visit dossiers_path
expect(page).to be_axe_clean
end
scenario 'liste des dossiers avec des dossiers' do
dossier
visit dossiers_path
expect(page).to be_axe_clean
end
scenario 'liste des dossiers et actions sur le dossier' do
dossier
visit dossiers_path
page.find("#actions_menu_dossier_#{dossier.id}_button").click
expect(page).to be_axe_clean
end
scenario 'dossier' do
visit dossier_path(dossier)
expect(page).to be_axe_clean
end
scenario 'merci' do
visit merci_dossier_path(dossier)
expect(page).to be_axe_clean
end
scenario 'demande' do
visit demande_dossier_path(dossier)
expect(page).to be_axe_clean
end
scenario 'messagerie avec des messages' do
create(:commentaire, dossier: dossier, instructeur: procedure.instructeurs.first, body: 'hello')
create(:commentaire, dossier: dossier, email: dossier.user.email, body: 'hello')
visit messagerie_dossier_path(dossier)
expect(page).to be_axe_clean
end
scenario 'modifier' do
visit modifier_dossier_path(dossier)
expect(page).to be_axe_clean
end
scenario 'brouillon' do
visit brouillon_dossier_path(dossier)
expect(page).to be_axe_clean
end
end
end