Commit 6eb476ca by cahrens Committed by Andy Armstrong

Accessibility and acceptance bok choy tests.

parent 756e07c5
......@@ -122,14 +122,15 @@
<ol class="list list--fields submission__feedback__fields {{ has_submitted_feedback|yesno:"is--hidden," }}"
{{ has_submitted_feedback|yesno:'aria-hidden=true,aria-hidden=false' }}>
<li class="field field-group field--radio feedback__overall">
<h4 class="field-group__label">{% trans "Select the statements below that best reflect your experience with peer assessments" %}:</h4>
<h4 id="feedback__overall__prompt" class="field-group__label">{% trans "Select the statements below that best reflect your experience with peer assessments" %}:</h4>
<ol class="list--options">
<li class="option option--useful">
<input type="checkbox"
name="feedback__overall__value"
id="feedback__overall__value--useful"
class="option__input feedback__overall__value"
value="These assessments were useful." />
value="These assessments were useful."
aria-labelledby="feedback__overall__prompt"/>
<label class="option__label" for="feedback__overall__value--useful">{% trans "These assessments were useful." %}</label>
</li>
<li class="option option--notuseful">
......@@ -137,7 +138,8 @@
name="feedback__overall__value"
id="feedback__overall__value--notuseful"
class="option__input feedback__overall__value"
value="These assessments were not useful." />
value="These assessments were not useful."
aria-labelledby="feedback__overall__prompt"/>
<label class="option__label" for="feedback__overall__value--notuseful">{% trans "These assessments were not useful." %}</label>
</li>
<li class="option option--disagree">
......@@ -145,7 +147,8 @@
name="feedback__overall__value"
id="feedback__overall__value--disagree"
class="option__input feedback__overall__value"
value="I disagree with one or more of the peer assessments of my response." />
value="I disagree with one or more of the peer assessments of my response."
aria-labelledby="feedback__overall__prompt"/>
<label class="option__label" for="feedback__overall__value--disagree">{% trans "I disagree with one or more of the peer assessments of my response." %}</label>
</li>
<li class="option option--inappropriate">
......@@ -153,7 +156,8 @@
name="feedback__overall__value"
id="feedback__overall__value--inappropriate"
class="option__input feedback__overall__value"
value="Some comments I received were inappropriate." />
value="Some comments I received were inappropriate."
aria-labelledby="feedback__overall__prompt"/>
<label class="option__label" for="feedback__overall__value--inappropriate">{% trans "Some comments I received were inappropriate." %}</label>
</li>
</ol>
......
......@@ -87,7 +87,7 @@
>
<h4 class="question__title ui-toggle-visibility__control">
<i class="icon fa fa-caret-right" aria-hidden="true"></i>
<span class="question__title__copy">{{ criterion.prompt }}</span>
<span id="training__assessment__rubric__prompt--{{ criterion.order_num }}" class="question__title__copy">{{ criterion.prompt }}</span>
<span class="label--required sr">* ({% trans "Required" %})</span>
</h4>
<div class="ui-toggle-visibility__content">
......@@ -113,8 +113,9 @@
name="{{ criterion.name }}"
id="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}"
class="answer__value"
value="{{ option.name }}" />
<label for="assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}"
value="{{ option.name }}"
aria-labelledby="training__assessment__rubric__prompt--{{ criterion.order_num }}"/>
<label for="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}"
class="answer__label">{{ option.label }}</label>
</div>
<div class="wrapper--metadata">
......
......@@ -3,7 +3,7 @@ UI-level acceptance tests for OpenAssessment accessibility.
"""
import os
import unittest
from tests import OpenAssessmentTest, StaffAreaPage
from tests import OpenAssessmentTest, StaffAreaPage, FullWorkflowMixin
class OpenAssessmentA11yTest(OpenAssessmentTest):
......@@ -47,6 +47,12 @@ class SelfAssessmentA11yTest(OpenAssessmentA11yTest):
self.submission_page.visit()
self._check_a11y(self.submission_page)
# TODO: There is an accessibility error on the self-review form due to TNL-3882.
# Commenting out test code so the check doesn't have to be disabled for the whole page.
# self.submission_page.visit().submit_response(self.SUBMISSION)
# self.self_asmnt_page.wait_for_page().wait_for_response()
# self._check_a11y(self.self_asmnt_page)
class PeerAssessmentA11yTest(OpenAssessmentA11yTest):
"""
......@@ -57,8 +63,18 @@ class PeerAssessmentA11yTest(OpenAssessmentA11yTest):
super(PeerAssessmentA11yTest, self).setUp('peer_only')
def test_peer_assessment_a11y(self):
# Create a submission for one learner.
self.submission_page.visit()
self._check_a11y(self.submission_page)
self.submission_page.visit().submit_response(self.SUBMISSION)
# Create a submission for a second learner.
self.auto_auth_page.visit()
self.submission_page.visit().submit_response(self.SUBMISSION)
# Check accessibility on the peer assessment page (there should be at least one available).
self.peer_asmnt_page.visit()
self._check_a11y(self.peer_asmnt_page)
class StudentTrainingA11yTest(OpenAssessmentA11yTest):
......@@ -72,6 +88,11 @@ class StudentTrainingA11yTest(OpenAssessmentA11yTest):
self.submission_page.visit()
self._check_a11y(self.submission_page)
# Check accessibility on the training page.
self.submission_page.visit().submit_response(self.SUBMISSION)
self.student_training_page.wait_for_page().wait_for_response()
self._check_a11y(self.student_training_page)
class StaffAreaA11yTest(OpenAssessmentA11yTest):
"""
......@@ -135,11 +156,61 @@ class StaffAreaA11yTest(OpenAssessmentA11yTest):
self.self_asmnt_page.wait_for_page().wait_for_response()
self.self_asmnt_page.assess("self", self.OPTIONS_SELECTED).wait_for_complete()
self.assertTrue(self.self_asmnt_page.is_complete)
self._verify_staff_grade_section("COMPLETE", None)
self._verify_staff_grade_section(self.STAFF_OVERRIDE_EXISTS, None)
self._check_a11y(self.staff_asmnt_page)
class FullWorkflowA11yTest(OpenAssessmentA11yTest, FullWorkflowMixin):
"""
Test accessibility at the end of a "full workflow" problem. In particular,
this verifies the accessibility of the "Your Grade" section and the related
sections in staff tools when all assessment steps have been completed.
"""
def setUp(self):
super(FullWorkflowA11yTest, self).setUp('full_workflow', staff=True)
self.staff_area_page = StaffAreaPage(self.browser, self.problem_loc)
def test_training_peer_self_staff_override(self):
"""
"""
# Create a learner with submission, training, and self assessment completed.
learner = self.do_submission_training_self_assessment(self.LEARNER_EMAIL, self.LEARNER_PASSWORD)
# Now create a second learner so that learner 1 has someone to assess.
# The second learner does all the steps as well (submission, training, self assessment, peer assessment).
self.do_submission_training_self_assessment("learner2@foo.com", None)
self.do_peer_assessment(options=self.PEER_ASSESSMENT)
# Go back to the first learner to complete her workflow.
self.login_user(learner)
# Learner 1 does peer assessment of learner 2 to complete workflow.
self.do_peer_assessment(options=self.SUBMITTED_ASSESSMENT)
# Continue grading by other students if necessary to ensure learner has a peer grade.
self.verify_submission_has_peer_grade(learner)
# At this point, the learner sees the peer assessment score (0). Verify the accessibility
# of the "your grade" section.
self.assertEqual(self.PEER_ASSESSMENT_SCORE, self.grade_page.wait_for_page().score)
self._check_a11y(self.grade_page)
# Now do a staff override, changing the score (to 1).
self.do_staff_override(learner)
# Refresh and check the accessibility of "your grade" section again.
self.browser.refresh()
self.assertEqual(self.STAFF_OVERRIDE_SCORE, self.grade_page.wait_for_page().score)
self._check_a11y(self.grade_page)
# Also verify the accessibility of the complete staff area information.
self.staff_area_page.visit().show_learner(learner)
self.staff_area_page.expand_learner_report_sections()
self._check_a11y(self.staff_area_page)
if __name__ == "__main__":
# Configure the screenshot directory
......
......@@ -409,6 +409,28 @@ class GradePage(OpenAssessmentPage):
score_candidates = [int(x) for x in self.q(css=".grade__value__earned").text]
return score_candidates[0] if len(score_candidates) > 0 else None
def grade_entry(self, question, column):
"""
Returns a tuple of source and value information for a specific grade source.
Args:
question: the 0-based question for which to get grade information.
column: the 0-based column of data within a question. Each column corresponds
to a source of data (for example, staff, peer, or self).
Returns: the tuple of source and value information for the requested grade
"""
source = self.q(
css=self._bounded_selector('.question--{} .answer .answer__source__value'.format(question + 1))
)[column]
value = self.q(
css=self._bounded_selector('.question--{} .answer .answer__value__value'.format(question + 1))
)[column]
return source.text.strip(), value.text.strip()
class StaffAreaPage(OpenAssessmentPage, AssessmentMixin):
"""
......
......@@ -136,7 +136,7 @@ class OpenAssessmentTest(WebAppTest):
self.submit_self_assessment(self.OPTIONS_SELECTED)
# Verify the grade
self.assertEqual(self.grade_page.wait_for_page().score, self.EXPECTED_SCORE)
self.assertEqual(self.EXPECTED_SCORE, self.grade_page.wait_for_page().score)
return username
......@@ -329,7 +329,7 @@ class PeerAssessmentTestStaffOverride(OpenAssessmentTest):
self._verify_staff_grade_section(self.STAFF_OVERRIDE_EXISTS, None)
# Verify the staff override grade
self.assertEqual(self.grade_page.wait_for_page().score, self.STAFF_OVERRIDE_SCORE)
self.assertEqual(self.STAFF_OVERRIDE_SCORE, self.grade_page.wait_for_page().score)
class StudentTrainingTest(OpenAssessmentTest):
......@@ -589,7 +589,7 @@ class StaffAreaTest(OpenAssessmentTest):
self._verify_staff_grade_section(self.STAFF_OVERRIDE_EXISTS, None)
# Verify the staff override grade
self.assertEqual(self.grade_page.wait_for_page().score, 1)
self.assertEqual(self.STAFF_OVERRIDE_SCORE, self.grade_page.wait_for_page().score)
@retry()
@attr('acceptance')
......@@ -644,9 +644,10 @@ class FileUploadTest(OpenAssessmentTest):
self.assertTrue(self.submission_page.has_file_uploaded)
class FullWorkflowTest(OpenAssessmentTest):
class FullWorkflowMixin(object):
"""
Tests of complete workflows, combining multiple required steps together.
Mixin with helper methods and constants for testing a full workflow
(training, self assessment, peer assessment, staff override).
"""
PEER_ASSESSMENT = [0, 0]
STAFF_AREA_PEER_ASSESSMENT = ['Poor', u'', u'0', u'5', u'Poor', u'', u'0', u'3']
......@@ -659,10 +660,6 @@ class FullWorkflowTest(OpenAssessmentTest):
SUBMITTED_ASSESSMENT = [0, 3]
STAFF_AREA_SUBMITTED = ['Poor', u'', u'0', u'5', u'Excellent', u'', u'3', u'3']
def setUp(self):
super(FullWorkflowTest, self).setUp('full_workflow', staff=True)
self.staff_area_page = StaffAreaPage(self.browser, self.problem_loc)
def do_submission(self, email, password):
"""
Creates a user and submission.
......@@ -741,6 +738,30 @@ class FullWorkflowTest(OpenAssessmentTest):
"Learner still not graded after {} additional attempts".format(max_attempts)
)
class FullWorkflowTest(OpenAssessmentTest, FullWorkflowMixin):
"""
Tests of complete workflows, combining multiple required steps together.
"""
def setUp(self):
super(FullWorkflowTest, self).setUp('full_workflow', staff=True)
self.staff_area_page = StaffAreaPage(self.browser, self.problem_loc)
def verify_grade_entries(self, expected_entries):
"""
Verify the grade entries (sources and values) as shown in the
"Your Grade" section.
Args:
expected_entries: array of expected entries, with each entry being an array
consisting of the data for a particular source. Note that order is important.
"""
for index, expected_entry in enumerate(expected_entries):
self.assertEqual(expected_entry[0], self.grade_page.grade_entry(0, index))
self.assertEqual(expected_entry[1], self.grade_page.grade_entry(1, index))
@retry()
@attr('acceptance')
def test_staff_override_at_end(self):
......@@ -790,7 +811,7 @@ class FullWorkflowTest(OpenAssessmentTest):
self.browser.refresh()
self._verify_staff_grade_section(self.STAFF_OVERRIDE_EXISTS, None)
self.assertEqual(self.grade_page.wait_for_page().score, self.STAFF_OVERRIDE_SCORE)
self.assertEqual(self.STAFF_OVERRIDE_SCORE, self.grade_page.wait_for_page().score)
self.verify_staff_area_fields(
learner, self.STAFF_AREA_PEER_ASSESSMENT, self.STAFF_AREA_SUBMITTED, self.STAFF_AREA_SELF_ASSESSMENT
)
......@@ -856,7 +877,7 @@ class FullWorkflowTest(OpenAssessmentTest):
# Grade is now visible to the learner (even though no student has graded the learner).
self._verify_staff_grade_section(self.STAFF_OVERRIDE_EXISTS, None)
self.assertEqual(self.grade_page.wait_for_page().score, self.STAFF_OVERRIDE_SCORE)
self.assertEqual(self.STAFF_OVERRIDE_SCORE, self.grade_page.wait_for_page().score)
self.verify_staff_area_fields(learner, [], self.STAFF_AREA_SUBMITTED, self.STAFF_AREA_SELF_ASSESSMENT)
self.staff_area_page.verify_learner_final_score(self.STAFF_AREA_SCORE.format(self.STAFF_OVERRIDE_SCORE))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment