Merge pull request #16146 from jmchilton/axe-fixes-1

Accessibility fixes for workflows, login, and registration.
This commit is contained in:
Björn Grüning
2023-06-04 13:01:14 +01:00
committed by GitHub
13 changed files with 100 additions and 31 deletions
+9 -3
View File
@@ -19,21 +19,27 @@
<b-card-body>
<div>
<!-- standard internal galaxy login -->
<b-form-group :label="labelNameAddress">
<b-form-group :label="labelNameAddress" label-for="login-form-name">
<b-form-input
v-if="!connectExternalProvider"
id="login-form-name"
v-model="login"
name="login"
type="text" />
<b-form-input
v-else
id="login-form-name"
disabled
:value="connectExternalEmail"
name="login"
type="text" />
</b-form-group>
<b-form-group :label="labelPassword">
<b-form-input v-model="password" name="password" type="password" />
<b-form-group :label="labelPassword" label-for="login-form-password">
<b-form-input
id="login-form-password"
v-model="password"
name="password"
type="password" />
<b-form-text>
<span v-localize>Forgot password?</span>
<a
+29 -10
View File
@@ -34,17 +34,29 @@
role="tabpanel"
accordion="registration_acc">
<b-card-body>
<b-form-group :label="labelEmailAddress">
<b-form-input v-model="email" name="email" type="text" />
<b-form-group :label="labelEmailAddress" label-for="register-form-email">
<b-form-input id="register-form-email" v-model="email" name="email" type="text" />
</b-form-group>
<b-form-group :label="labelPassword">
<b-form-input v-model="password" name="password" type="password" />
<b-form-group :label="labelPassword" label-for="register-form-password">
<b-form-input
id="register-form-password"
v-model="password"
name="password"
type="password" />
</b-form-group>
<b-form-group :label="labelConfirmPassword">
<b-form-input v-model="confirm" name="confirm" type="password" />
<b-form-group :label="labelConfirmPassword" label-for="register-form-confirm">
<b-form-input
id="register-form-confirm"
v-model="confirm"
name="confirm"
type="password" />
</b-form-group>
<b-form-group :label="labelPublicName">
<b-form-input v-model="username" name="username" type="text" />
<b-form-group :label="labelPublicName" label-for="register-form-username">
<b-form-input
id="register-form-username"
v-model="username"
name="username"
type="text" />
<b-form-text v-localize
>Your public name is an identifier that will be used to generate addresses for
information you share publicly. Public names must be at least three characters
@@ -52,8 +64,15 @@
dashes ('.', '_', '-').
</b-form-text>
</b-form-group>
<b-form-group v-if="mailingJoinAddr && serverMailConfigured" :label="labelSubscribe">
<input v-model="subscribe" name="subscribe" type="checkbox" />
<b-form-group
v-if="mailingJoinAddr && serverMailConfigured"
:label="labelSubscribe"
label-for="register-form-subscribe">
<input
id="register-form-subscribe"
v-model="subscribe"
name="subscribe"
type="checkbox" />
</b-form-group>
<b-button v-localize name="create" type="submit" :disabled="disableCreate"
>Create</b-button
@@ -46,7 +46,7 @@ onMounted(async () => {
</script>
<template>
<b-card body-class="p-0">
<b-card body-class="p-0" class="workflow-display">
<b-card-header v-if="!embedded">
<span class="float-right">
<b-button
@@ -72,7 +72,7 @@ async function submit(ev: SubmitEvent) {
</script>
<template>
<b-form class="mt-4" @submit="submit">
<b-form class="mt-4 workflow-import-file" @submit="submit">
<h2 class="h-sm">Import from a Galaxy workflow export URL or a workflow file</h2>
<b-form-group label="Archived Workflow URL">
<b-form-input
@@ -154,7 +154,7 @@ async function importVersionFromUrl(url: string, isRunFormRedirect = false) {
</script>
<template>
<div>
<div class="workflow-import-trs-id">
<b-card v-if="!isAnonymous" title="GA4GH Tool Registry Server (TRS) Workflow Import">
<div>
<b>TRS Server:</b>
@@ -169,7 +169,7 @@ async function importVersionFromUrl(url: string, isRunFormRedirect = false) {
</b-alert>
<div v-else>
<div class="my-3">
<b-form-group label="TRS ID:" label-class="font-weight-bold">
<b-form-group label="TRS ID:" label-for="trs-id-input" label-class="font-weight-bold">
<b-form-input id="trs-id-input" v-model="toolId" debounce="500" />
</b-form-group>
</div>
@@ -118,7 +118,7 @@ async function importVersion(trsId?: string, toolIdToImport?: string, version?:
</script>
<template>
<b-card title="GA4GH Tool Registry Server (TRS) Workflow Search">
<b-card class="workflow-import-trs-search" title="GA4GH Tool Registry Server (TRS) Workflow Search">
<b-alert :show="hasErrorMessage" variant="danger">{{ errorMessage }}</b-alert>
<div class="mb-3">
@@ -147,7 +147,7 @@ async function importVersion(trsId?: string, toolIdToImport?: string, version?:
:title="searchHelp">
<icon icon="question" />
</b-button>
<b-button size="sm" data-description="show deleted filter toggle" @click="query = ''">
<b-button size="sm" title="clear search" @click="query = ''">
<icon icon="times" />
</b-button>
</b-input-group-append>
@@ -8,16 +8,16 @@ import FromFileOrUrl from "./Import/FromFileOrUrl";
<section>
<h1 class="h-lg">Import workflow</h1>
<b-tabs fill>
<b-tab title="Archived file or url" active>
<b-tab title-link-class="workflow-import-file-link" title="Archived file or url" active>
<FromFileOrUrl />
</b-tab>
<b-tab title="GA4GH servers">
<b-tab title-link-class="workflow-import-trs-search-link" title="GA4GH servers">
<div class="mt-4">
<h2 class="h-sm">Import a Workflow from Configured GA4GH Tool Registry Servers (e.g. Dockstore)</h2>
<TrsSearch />
</div>
</b-tab>
<b-tab title="TRS ID">
<b-tab title-link-class="workflow-import-trs-id-link" title="TRS ID">
<div class="mt-4">
<h2 class="h-sm">Import from a TRS ID</h2>
<TrsImport />
@@ -1,7 +1,7 @@
<template>
<Published :item="workflow">
<template v-slot>
<WorkflowDisplay :workflow-id="id" :workflow="workflow" :expanded="true" />
<WorkflowDisplay :workflow-id="id" :expanded="true" />
</template>
</Published>
</template>
@@ -562,6 +562,13 @@ workflows:
dropdown: '[data-workflow-dropdown*="${id}"]'
run_button: '[data-workflow-run*="${id}"]'
bookmark_link: '.workflow-bookmark-link'
import_file: '.workflow-import-file'
import_trs_search: '.workflow-import-trs-search'
import_trs_id: '.workflow-import-trs-id'
import_file_link: '.workflow-import-file-link'
import_trs_search_link: '.workflow-import-trs-search-link'
import_trs_id_link: '.workflow-import-trs-id-link'
workflow_with_name:
type: xpath
selector: '//span[@class="workflow-dropdown-name" and text() = "${workflow_name}"]'
@@ -718,6 +725,7 @@ workflow_editor:
workflow_show:
selectors:
_: '.workflow-display'
title: '[data-description="workflow name"]'
import_link: '[data-description="workflow import"]'
+7 -6
View File
@@ -592,10 +592,10 @@ class NavigatesGalaxy(HasDriver):
"login": email,
"password": password,
}
form = self.wait_for_visible(self.navigation.login.selectors.form)
self.fill(form, login_info)
login = self.components.login
self.fill(login.form.wait_for_visible(), login_info)
self.snapshot("logging-in")
self.wait_for_and_click(self.navigation.login.selectors.submit)
login.submit.wait_for_and_click()
self.snapshot("login-submitted")
def register(self, email=None, password=None, username=None, confirm=None, assert_valid=True):
@@ -610,10 +610,11 @@ class NavigatesGalaxy(HasDriver):
self.home()
self.components.masthead.register_or_login.wait_for_and_click()
self.wait_for_and_click(self.navigation.registration.selectors.toggle)
form = self.wait_for_visible(self.navigation.registration.selectors.form)
registration = self.components.registration
registration.toggle.wait_for_and_click()
form = registration.form.wait_for_visible()
self.fill(form, dict(email=email, password=password, username=username, confirm=confirm))
self.wait_for_and_click(self.navigation.registration.selectors.submit)
registration.submit.wait_for_and_click()
if assert_valid is False:
self.assert_error_message()
elif assert_valid:
+7
View File
@@ -5,6 +5,13 @@ from .framework import (
class TestLogin(SeleniumTestCase):
@selenium_test
def test_login_accessibility(self):
self.home()
self.components.masthead.register_or_login.wait_for_and_click()
login = self.components.login
login.form.assert_no_axe_violations_with_impact_of_at_least("moderate")
@selenium_test
def test_logging_in(self):
email = self._get_random_email()
@@ -17,6 +17,15 @@ class TestRegistration(SeleniumTestCase):
self.home()
self.register()
@selenium_test
def test_registration_accessibility(self):
self.home()
self.components.masthead.register_or_login.wait_for_and_click()
registration = self.components.registration
registration.toggle.wait_for_and_click()
registration.form.wait_for_visible()
registration.form.assert_no_axe_violations_with_impact_of_at_least("moderate")
@selenium_test
def test_logout(self):
self.home()
@@ -24,6 +24,19 @@ class TestWorkflowManagement(SeleniumTestCase, TestsGalaxyPagers, UsesWorkflowAs
new_workflow = table_elements[0].find_element(By.CSS_SELECTOR, ".workflow-dropdown")
assert "TestWorkflow1 (imported from URL)" in new_workflow.text, new_workflow.text
@selenium_test
def test_import_accessibility(self):
self.workflow_index_open()
self.workflow_index_click_import()
workflows = self.components.workflows
workflows.import_file.assert_no_axe_violations_with_impact_of_at_least("moderate")
workflows.import_trs_search_link.wait_for_and_click()
# moderate violation relating to header ordering
workflows.import_trs_search.assert_no_axe_violations_with_impact_of_at_least("serious")
workflows.import_trs_id_link.wait_for_and_click()
# ditto - moderate violation relating to header ordering
workflows.import_trs_id.assert_no_axe_violations_with_impact_of_at_least("serious")
@selenium_test
def test_view(self):
self.workflow_index_open()
@@ -39,8 +52,14 @@ class TestWorkflowManagement(SeleniumTestCase, TestsGalaxyPagers, UsesWorkflowAs
# assert EXAMPLE_WORKFLOW_URL_1 in title_element.text
self.workflow_index_click_option("View")
workflow_show = self.components.workflow_show
title_item = self.components.workflow_show.title.wait_for_visible()
assert "TestWorkflow1" in title_item.text
@retry_assertion_during_transitions
def check_title():
title_item = self.components.workflow_show.title.wait_for_visible()
assert "TestWorkflow1" in title_item.text
check_title()
workflow_show._.assert_no_axe_violations_with_impact_of_at_least("moderate")
import_link = workflow_show.import_link.wait_for_visible()
assert "Import Workflow" in import_link.get_attribute("title")
self.screenshot("workflow_manage_view")