diff --git a/spec/features/accessibility/idv_pages_spec.rb b/spec/features/accessibility/idv_pages_spec.rb index 9df1adaab0b..a17def9927e 100644 --- a/spec/features/accessibility/idv_pages_spec.rb +++ b/spec/features/accessibility/idv_pages_spec.rb @@ -10,9 +10,7 @@ visit idv_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'cancel idv' do @@ -21,9 +19,7 @@ visit idv_cancel_path expect(current_path).to eq idv_cancel_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'phone info' do @@ -32,9 +28,7 @@ complete_all_doc_auth_steps expect(current_path).to eq idv_phone_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'review page' do @@ -43,9 +37,7 @@ complete_all_doc_auth_steps_before_password_step expect(page).to have_current_path(idv_review_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'personal key / confirmation page' do @@ -56,9 +48,7 @@ click_continue expect(current_path).to eq idv_personal_key_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'doc auth steps accessibility' do @@ -69,9 +59,7 @@ click_continue expect(current_path).to eq idv_personal_key_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'doc auth steps accessibility on mobile', driver: :headless_chrome_mobile do @@ -82,9 +70,7 @@ click_continue expect(current_path).to eq idv_personal_key_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end end diff --git a/spec/features/accessibility/static_pages_spec.rb b/spec/features/accessibility/static_pages_spec.rb index 173f16502ed..2496a5b2c51 100644 --- a/spec/features/accessibility/static_pages_spec.rb +++ b/spec/features/accessibility/static_pages_spec.rb @@ -5,48 +5,36 @@ scenario 'not found page', allow_browser_log: true do visit '/non_existent_page' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario '401 page' do visit '/401' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario '406 page' do visit '/406' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario '422 page' do visit '/422' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario '429 page' do visit '/429' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario '500 page' do visit '/500' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end diff --git a/spec/features/accessibility/user_pages_spec.rb b/spec/features/accessibility/user_pages_spec.rb index 788fe3e789a..70b03958e06 100644 --- a/spec/features/accessibility/user_pages_spec.rb +++ b/spec/features/accessibility/user_pages_spec.rb @@ -7,9 +7,7 @@ sign_up_with(email) expect(current_path).to eq(sign_up_verify_email_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end describe 'user confirmation page' do @@ -18,18 +16,14 @@ confirm_last_user expect(current_path).to eq(sign_up_enter_password_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'invalid confirmation token' do visit sign_up_create_email_confirmation_path(confirmation_token: '123456') expect(current_path).to eq(sign_up_email_resend_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end @@ -38,9 +32,7 @@ sign_up_and_set_password expect(current_path).to eq(authentication_methods_setup_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'phone setup page' do @@ -49,9 +41,7 @@ click_button t('forms.buttons.continue') expect(current_path).to eq(phone_setup_path) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'two factor auth page' do @@ -59,9 +49,7 @@ sign_in_before_2fa(user) expect(current_path).to eq(login_two_factor_path(otp_delivery_preference: 'sms')) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end describe 'SMS' do @@ -71,9 +59,7 @@ visit login_two_factor_path(otp_delivery_preference: 'sms') expect(current_path).to eq login_two_factor_path(otp_delivery_preference: 'sms') - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end @@ -84,9 +70,7 @@ visit login_two_factor_path(otp_delivery_preference: 'voice') expect(current_path).to eq login_two_factor_path(otp_delivery_preference: 'voice') - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end end @@ -95,9 +79,7 @@ sign_in_and_2fa_user visit manage_personal_key_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'profile page' do @@ -105,9 +87,7 @@ visit account_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'delete email page' do @@ -116,9 +96,7 @@ visit manage_email_confirm_delete_path(id: user.email_addresses.take.id) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'edit password page' do @@ -126,9 +104,7 @@ visit manage_password_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'edit email language page' do @@ -136,9 +112,7 @@ visit account_email_language_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'add phone page' do @@ -146,9 +120,7 @@ visit add_phone_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'edit phone page' do @@ -156,9 +128,7 @@ visit manage_phone_path(id: user.phone_configurations.first.id) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'generate new personal key page' do @@ -166,9 +136,7 @@ visit manage_personal_key_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'set up authenticator app page' do @@ -176,9 +144,7 @@ visit '/authenticator_setup' - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'device events page' do @@ -188,9 +154,7 @@ visit account_events_path(id: device.id) - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'delete user page' do @@ -198,8 +162,6 @@ visit account_delete_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end diff --git a/spec/features/accessibility/visitor_pages_spec.rb b/spec/features/accessibility/visitor_pages_spec.rb index 38f5c665789..731de492971 100644 --- a/spec/features/accessibility/visitor_pages_spec.rb +++ b/spec/features/accessibility/visitor_pages_spec.rb @@ -5,40 +5,30 @@ scenario 'login / root path' do visit root_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'forgot password page' do visit new_user_password_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'new user start registration page' do visit new_user_session_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'new user registration page' do visit sign_up_email_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end scenario 'new user cancel registration page' do visit sign_up_cancel_path - expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa - expect(page).to label_required_fields - expect(page).to be_uniquely_titled + expect_page_to_have_no_accessibility_violations(page) end end diff --git a/spec/support/matchers/accessibility.rb b/spec/support/matchers/accessibility.rb index 3b152125431..5727c1fc1b1 100644 --- a/spec/support/matchers/accessibility.rb +++ b/spec/support/matchers/accessibility.rb @@ -1,3 +1,27 @@ +RSpec::Matchers.define :have_valid_idrefs do + invalid_idref_messages = [] + + match do |page| + ['aria-describedby', 'aria-labelledby'].each do |idref_attribute| + page.all(:css, "[#{idref_attribute}]").each do |element| + page.find_by_id(element[idref_attribute]) # rubocop:disable Rails/DynamicFindBy + rescue Capybara::ElementNotFound + invalid_idref_messages << "[#{idref_attribute}=\"#{element[idref_attribute]}\"]" + end + end + + invalid_idref_messages.blank? + end + + failure_message do |page| + <<~STR + Found #{invalid_idref_messages.count} elements with invalid ID reference links: + + #{invalid_idref_messages.join("\n")} + STR + end +end + RSpec::Matchers.define :label_required_fields do elements = [] @@ -57,3 +81,10 @@ def descriptors(element) "Page '#{page.current_path}' should have a unique and descriptive title. Found '#{page.title}'." end end + +def expect_page_to_have_no_accessibility_violations(page) + expect(page).to be_axe_clean.according_to :section508, :"best-practice", :wcag21aa + expect(page).to have_valid_idrefs + expect(page).to label_required_fields + expect(page).to be_uniquely_titled +end