diff --git a/Gemfile b/Gemfile index 2d77d694c..332359f98 100644 --- a/Gemfile +++ b/Gemfile @@ -97,6 +97,7 @@ group :development do end group :test do + gem "axe-core-rspec" gem "capybara", require: false gem "capybara-lockstep" gem "capybara-screenshot" @@ -105,7 +106,6 @@ group :test do gem "simplecov", require: false gem "timecop", "~> 0.9.4" gem "webmock", require: false - gem 'axe-core-rspec' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/spec/features/accessibility_spec.rb b/spec/features/accessibility_spec.rb index ce1e89d18..62842e69b 100644 --- a/spec/features/accessibility_spec.rb +++ b/spec/features/accessibility_spec.rb @@ -4,18 +4,33 @@ RSpec.describe "Accessibility", js: true do let(:user) { create(:user, :support) } let!(:other_user) { create(:user, name: "new user", organisation: user.organisation, email: "new_user@example.com", confirmation_token: "abc") } + def find_routes(type, resource, subresource) + routes = Rails.application.routes.routes.select do |route| + route.verb == "GET" && route.path.spec.to_s.start_with?("/#{type}") + end + + routes.map do |route| + route_path = route.path.spec.to_s + route_path + .gsub("/#{type}s/:id", "/#{type}s/#{resource.id}") + .gsub(":#{type.underscore}_id", resource.id.to_s) + .gsub(":id", subresource.id.to_s) + .gsub("(.:format)", "") + end + end + before do allow(user).to receive(:need_two_factor_authentication?).and_return(false) sign_in(user) end context "when viewing user pages" do - let(:user_paths) { - Rails.application.routes.routes.select {|route| route.verb == "GET" && route.path.spec.to_s.start_with?("/user")} .map do |route| + let(:user_paths) do + Rails.application.routes.routes.select { |route| route.verb == "GET" && route.path.spec.to_s.start_with?("/user") }.map { |route| route_path = route.path.spec.to_s route_path.gsub(":id", other_user.id.to_s).gsub(":user_id", other_user.id.to_s).gsub("(.:format)", "") - end.uniq - } + }.uniq + end it "is has accessible pages" do user_paths.each do |path| @@ -27,15 +42,10 @@ RSpec.describe "Accessibility", js: true do end context "when viewing organisation pages" do - let(:organisation_paths) { - Rails.application.routes.routes.select {|route| route.verb == "GET" && route.path.spec.to_s.start_with?("/organisation")} .map do |route| - route_path = route.path.spec.to_s - route_path.gsub(":id", other_user.organisation_id.to_s) - .gsub(":organisation_id", other_user.organisation_id.to_s) - .gsub("(.:format)", "") - .gsub(/\A\/organisations\/#{other_user.organisation_id}\z/, "/organisations/#{other_user.organisation_id}/details") - end.uniq - } + let(:organisation_paths) do + routes = find_routes("organisation", other_user.organisation, other_user.organisation).reject { |route| route.match?(/\A\/organisations\/#{other_user.organisation_id}\z/) } + routes << "/organisations/#{other_user.organisation_id}/details" + end it "is has accessible pages" do organisation_paths.each do |path| @@ -56,34 +66,23 @@ RSpec.describe "Accessibility", js: true do context "when viewing lettings log pages" do let(:bulk_upload) { create(:bulk_upload) } let(:lettings_log) { create(:lettings_log, :completed, assigned_to: other_user, bulk_upload_id: bulk_upload.id) } - let(:organisation_relationship) {create(:organisation_relationship, parent_organisation: user.organisation) } + let(:organisation_relationship) { create(:organisation_relationship, parent_organisation: user.organisation) } let(:lettings_log_paths) do + routes = find_routes("lettings-log", lettings_log, bulk_upload) all_page_ids = FormHandler.instance.lettings_forms.values.flat_map(&:pages).map(&:id).uniq lettings_log_pages = lettings_log.form.pages other_form_page_ids = all_page_ids - lettings_log_pages.map(&:id) - - filtered_routes = Rails.application.routes.routes.select do |route| - route.verb == "GET" && route.path.spec.to_s.start_with?("/lettings-log") - end - - filtered_routes.map do |route| - route_path = route.path.spec.to_s - route_path - .gsub("/lettings-logs/:id", "/lettings-logs/#{lettings_log.id}") - .gsub(":lettings_log_id", "#{lettings_log.id}") - .gsub(":id", "#{bulk_upload.id}") - .gsub("(.:format)", "") - end.reject do |path| + + routes.reject { |path| path.include?("/edit") || path.include?("/new") || path.include?("*page") || - path.include?("local-authority/check-answers") || path.include?("declaration/check-answers") || + path.include?("local-authority/check-answers") || path.include?("declaration/check-answers") || other_form_page_ids.any? { |page_id| path.include?(page_id.dasherize) } || lettings_log_pages.any? { |page| path.include?(page.id.dasherize) && !page.routed_to?(lettings_log, user) } - end.uniq + }.uniq end - - before do + before do allow(FormHandler.instance).to receive(:in_crossover_period?).and_return(true) end @@ -104,34 +103,20 @@ RSpec.describe "Accessibility", js: true do context "when viewing sales log pages" do let(:bulk_upload) { create(:bulk_upload) } let(:sales_log) { create(:sales_log, :completed, assigned_to: other_user, bulk_upload_id: bulk_upload.id) } - let(:organisation_relationship) {create(:organisation_relationship, parent_organisation: user.organisation) } + let(:organisation_relationship) { create(:organisation_relationship, parent_organisation: user.organisation) } let(:sales_log_paths) do all_page_ids = FormHandler.instance.sales_forms.values.flat_map(&:pages).map(&:id).uniq sales_log_pages = sales_log.form.pages other_form_page_ids = all_page_ids - sales_log_pages.map(&:id) - - filtered_routes = Rails.application.routes.routes.select do |route| - route.verb == "GET" && route.path.spec.to_s.start_with?("/sales-log") - end - - filtered_routes.map do |route| - route_path = route.path.spec.to_s - route_path - .gsub("/sales-logs/:id", "/sales-logs/#{sales_log.id}") - .gsub(":sales_log_id", "#{sales_log.id}") - .gsub(":id", "#{bulk_upload.id}") - .gsub("(.:format)", "") - end.reject do |path| + + routes = find_routes("sales-log", sales_log, bulk_upload) + + routes.reject { |path| path.include?("/edit") || path.include?("/new") || path.include?("*page") || other_form_page_ids.any? { |page_id| path.include?(page_id.dasherize) } || sales_log_pages.any? { |page| path.include?(page.id.dasherize) && !page.routed_to?(sales_log, user) } - end.uniq - end - - - before do - allow(FormHandler.instance).to receive(:in_crossover_period?).and_return(true) + }.uniq end it "is has accessible pages" do @@ -152,24 +137,12 @@ RSpec.describe "Accessibility", js: true do let(:scheme) { create(:scheme, owning_organisation: other_user.organisation) } let!(:location) { create(:location, scheme:) } let(:scheme_paths) do - filtered_routes = Rails.application.routes.routes.select do |route| - route.verb == "GET" && route.path.spec.to_s.start_with?("/scheme") - end - - filtered_routes.map do |route| - route_path = route.path.spec.to_s - route_path - .gsub("/scheme/:id", "/scheme/#{scheme.id}") - .gsub(":scheme_id", "#{scheme.id}") - .gsub(":id", "#{location.id}") - .gsub("(.:format)", "") - end.reject do |path| - path.include?("/edit") || path.include?("/new") || path.include?("*page") - end.uniq + routes = find_routes("scheme", scheme, location) + + routes.reject { |path| path.include?("/edit") || path.include?("/new") || path.include?("*page") }.uniq end - - before do + before do allow(FormHandler.instance).to receive(:in_crossover_period?).and_return(true) end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index c70d4b717..5f7529554 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -10,14 +10,14 @@ require "capybara-screenshot/rspec" require "selenium-webdriver" require "view_component/test_helpers" require "pundit/rspec" -require 'axe-rspec' +require "axe-rspec" Capybara.register_driver :headless do |app| options = Selenium::WebDriver::Firefox::Options.new options.add_argument("--headless") - options.add_argument('--no-sandbox') - options.add_argument('--disable-dev-shm-usage') - options.add_argument('--window-size=1400,1400') + options.add_argument("--no-sandbox") + options.add_argument("--disable-dev-shm-usage") + options.add_argument("--window-size=1400,1400") Capybara::Selenium::Driver.new(app, browser: :firefox, options:) end