Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
af504fc6
Commit
af504fc6
authored
Nov 28, 2016
by
Christina Roberts
Committed by
GitHub
Nov 28, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #13805 from edx/christina/ac-583
Christina/ac 583
parents
a9960e93
e095da59
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
153 additions
and
14 deletions
+153
-14
common/test/acceptance/pages/lms/progress.py
+36
-0
common/test/acceptance/tests/lms/test_progress_page.py
+116
-6
lms/djangoapps/courseware/features/lti.py
+1
-8
lms/templates/courseware/progress.html
+0
-0
lms/templates/courseware/progress_graph.js
+0
-0
No files found.
common/test/acceptance/pages/lms/progress.py
View file @
af504fc6
...
...
@@ -74,6 +74,42 @@ class ProgressPage(CoursePage):
"""
return
text
in
self
.
q
(
css
=
".view-in-course"
)
.
html
[
0
]
def
x_tick_label
(
self
,
tick_index
):
"""
Returns the label for the X-axis tick index,
and a boolean indicating whether or not it is aria-hidden
"""
selector
=
self
.
q
(
css
=
'#grade-detail-graph .xAxis .tickLabel'
)[
tick_index
]
tick_label
=
selector
.
find_elements_by_tag_name
(
'span'
)[
0
]
return
[
tick_label
.
text
,
tick_label
.
get_attribute
(
'aria-hidden'
)]
def
x_tick_sr_text
(
self
,
tick_index
):
"""
Return an array of the sr text for a specific x-Axis tick on the
progress chart.
"""
selector
=
self
.
q
(
css
=
'#grade-detail-graph .tickLabel'
)[
tick_index
]
sr_fields
=
selector
.
find_elements_by_class_name
(
'sr'
)
return
[
field
.
text
for
field
in
sr_fields
]
def
y_tick_label
(
self
,
tick_index
):
"""
Returns the label for the Y-axis tick index,
and a boolean indicating whether or not it is aria-hidden
"""
selector
=
self
.
q
(
css
=
'#grade-detail-graph .yAxis .tickLabel'
)[
tick_index
]
tick_label
=
selector
.
find_elements_by_tag_name
(
'span'
)[
0
]
return
[
tick_label
.
text
,
tick_label
.
get_attribute
(
'aria-hidden'
)]
def
graph_overall_score
(
self
):
"""
Returns the sr-only text for overall score on the progress chart,
and the complete text for overall score (including the same sr-text).
"""
selector
=
self
.
q
(
css
=
'#grade-detail-graph .overallGrade'
)[
0
]
label
=
selector
.
find_elements_by_class_name
(
'sr'
)[
0
]
return
[
label
.
text
,
selector
.
text
]
def
_chapter_index
(
self
,
title
):
"""
Return the CSS index of the chapter with `title`.
...
...
common/test/acceptance/tests/lms/test_progress_page.py
View file @
af504fc6
...
...
@@ -4,8 +4,8 @@ End-to-end tests for the LMS that utilize the
progress page.
"""
from
contextlib
import
contextmanager
import
ddt
from
nose.plugins.attrib
import
attr
from
..helpers
import
(
UniqueCourseTest
,
auto_auth
,
create_multiple_choice_problem
,
create_multiple_choice_xml
,
get_modal_alert
...
...
@@ -64,6 +64,13 @@ class ProgressPageBaseTest(UniqueCourseTest):
XBlockFixtureDesc
(
'sequential'
,
self
.
SUBSECTION_NAME
)
.
add_children
(
XBlockFixtureDesc
(
'vertical'
,
self
.
UNIT_NAME
)
.
add_children
(
self
.
problem1
,
self
.
problem2
)
)
),
XBlockFixtureDesc
(
'chapter'
,
"Lab Section"
)
.
add_children
(
XBlockFixtureDesc
(
'sequential'
,
"Lab Subsection"
)
.
add_children
(
XBlockFixtureDesc
(
'vertical'
,
"Lab Unit"
)
.
add_children
(
create_multiple_choice_problem
(
"Lab Exercise"
)
)
)
)
)
.
install
()
...
...
@@ -268,16 +275,17 @@ class SubsectionGradingPolicyTest(ProgressPageBaseTest):
"""
def
setUp
(
self
):
super
(
SubsectionGradingPolicyTest
,
self
)
.
setUp
()
self
.
_set_policy_for_subsection
(
"Homework"
)
self
.
_set_policy_for_subsection
(
"Homework"
,
0
)
self
.
_set_policy_for_subsection
(
"Lab"
,
1
)
def
_set_policy_for_subsection
(
self
,
policy
):
def
_set_policy_for_subsection
(
self
,
policy
,
section
=
0
):
"""
Set the grading policy for the
subsection in the test
.
Set the grading policy for the
first subsection in the specified section.
If a section index is not provided, 0 is assumed
.
"""
with
self
.
_logged_in_session
(
staff
=
True
):
self
.
course_outline
.
visit
()
modal
=
self
.
course_outline
.
section_at
(
0
)
.
subsection_at
(
0
)
.
edit
()
modal
=
self
.
course_outline
.
section_at
(
section
)
.
subsection_at
(
0
)
.
edit
()
modal
.
policy
=
policy
modal
.
save
()
...
...
@@ -290,6 +298,93 @@ class SubsectionGradingPolicyTest(ProgressPageBaseTest):
self
.
assertEqual
(
self
.
_get_section_score
(),
section_score
)
self
.
assertTrue
(
self
.
progress_page
.
text_on_page
(
text
))
def
_check_tick_text
(
self
,
index
,
sr_text
,
label
,
label_hidden
=
True
):
"""
Check the label and sr text for a horizontal (X-axis) tick.
"""
self
.
assertEqual
(
sr_text
,
self
.
progress_page
.
x_tick_sr_text
(
index
))
self
.
assertEqual
([
label
,
'true'
if
label_hidden
else
None
],
self
.
progress_page
.
x_tick_label
(
index
))
def
test_axis_a11y
(
self
):
"""
Tests that the progress chart axes have appropriate a11y (screenreader) markup.
"""
with
self
.
_logged_in_session
():
self
.
courseware_page
.
visit
()
# Answer the first HW problem (the unit contains 2 problems, only one will be answered correctly)
self
.
_answer_problem_correctly
()
self
.
courseware_page
.
click_next_button_on_top
()
# Answer the first Lab problem (unit only contains a single problem)
self
.
_answer_problem_correctly
()
self
.
progress_page
.
visit
()
# Verify that y-Axis labels are aria-hidden
self
.
assertEqual
([
'100
%
'
,
'true'
],
self
.
progress_page
.
y_tick_label
(
0
))
self
.
assertEqual
([
'0
%
'
,
'true'
],
self
.
progress_page
.
y_tick_label
(
1
))
self
.
assertEqual
([
'Pass 50
%
'
,
'true'
],
self
.
progress_page
.
y_tick_label
(
2
))
# Verify x-Axis labels and sr-text
self
.
_check_tick_text
(
0
,
[
u'Homework 1 - Test Subsection 1 - 50
%
(1/2)'
],
u'HW 01'
)
# Homeworks 2-10 are checked in the for loop below.
self
.
_check_tick_text
(
10
,
[
u'Homework 11 Unreleased - 0
%
(?/?)'
,
u'The lowest 2 Homework scores are dropped.'
],
u'HW 11'
)
self
.
_check_tick_text
(
11
,
[
u'Homework 12 Unreleased - 0
%
(?/?)'
,
u'The lowest 2 Homework scores are dropped.'
],
u'HW 12'
)
self
.
_check_tick_text
(
12
,
[
u'Homework Average = 5
%
'
],
u'HW Avg'
)
self
.
_check_tick_text
(
13
,
[
u'Lab 1 - Lab Subsection - 100
%
(1/1)'
],
u'Lab 01'
)
# Labs 2-10 are checked in the for loop below.
self
.
_check_tick_text
(
23
,
[
u'Lab 11 Unreleased - 0
%
(?/?)'
,
u'The lowest 2 Lab scores are dropped.'
],
u'Lab 11'
)
self
.
_check_tick_text
(
24
,
[
u'Lab 12 Unreleased - 0
%
(?/?)'
,
u'The lowest 2 Lab scores are dropped.'
],
u'Lab 12'
)
self
.
_check_tick_text
(
25
,
[
u'Lab Average = 10
%
'
],
u'Lab Avg'
)
self
.
_check_tick_text
(
26
,
[
u'Midterm Exam = 0
%
'
],
u'Midterm'
)
self
.
_check_tick_text
(
27
,
[
u'Final Exam = 0
%
'
],
u'Final'
)
self
.
_check_tick_text
(
28
,
[
u'Homework = 0.75
%
of a possible 15.00
%
'
,
u'Lab = 1.50
%
of a possible 15.00
%
'
],
u'Total'
,
False
# The label "Total" should NOT be aria-hidden
)
# The grading policy has 12 Homeworks and 12 Labs. Most of them are unpublished,
# with no additional information.
for
i
in
range
(
1
,
10
):
self
.
_check_tick_text
(
i
,
[
u'Homework {index} Unreleased - 0
%
(?/?)'
.
format
(
index
=
i
+
1
)],
u'HW 0{index}'
.
format
(
index
=
i
+
1
)
if
i
<
9
else
u'HW {index}'
.
format
(
index
=
i
+
1
)
)
self
.
_check_tick_text
(
i
+
13
,
[
u'Lab {index} Unreleased - 0
%
(?/?)'
.
format
(
index
=
i
+
1
)],
u'Lab 0{index}'
.
format
(
index
=
i
+
1
)
if
i
<
9
else
u'Lab {index}'
.
format
(
index
=
i
+
1
)
)
# Verify the overall score. The first element in the array is the sr-only text, and the
# second is the total text (including the sr-only text).
self
.
assertEqual
([
'Overall Score'
,
'Overall Score
\n
2
%
'
],
self
.
progress_page
.
graph_overall_score
())
def
test_subsection_grading_policy_on_progress_page
(
self
):
with
self
.
_logged_in_session
():
self
.
_check_scores_and_page_text
([(
0
,
1
),
(
0
,
1
)],
(
0
,
2
),
"Homework 1 - Test Subsection 1 - 0
%
(0/2)"
)
...
...
@@ -306,5 +401,20 @@ class SubsectionGradingPolicyTest(ProgressPageBaseTest):
self
.
assertFalse
(
self
.
progress_page
.
text_on_page
(
"Homework 1 - Test Subsection 1"
))
self
.
_set_policy_for_subsection
(
"Homework"
)
with
self
.
_logged_in_session
():
self
.
_check_scores_and_page_text
([(
1
,
1
),
(
0
,
1
)],
(
1
,
2
),
"Homework 1 - Test Subsection 1 - 50
%
(1/2)"
)
@attr
(
'a11y'
)
class
ProgressPageA11yTest
(
ProgressPageBaseTest
):
"""
Class to test the accessibility of the progress page.
"""
def
test_progress_page_a11y
(
self
):
"""
Test the accessibility of the progress page.
"""
self
.
progress_page
.
visit
()
self
.
progress_page
.
a11y_audit
.
check_for_accessibility_errors
()
lms/djangoapps/courseware/features/lti.py
View file @
af504fc6
...
...
@@ -332,14 +332,7 @@ def check_progress(_step, text):
@step
(
'I see graph with total progress "([^"]*)"$'
)
def
see_graph
(
_step
,
progress
):
selector
=
'grade-detail-graph'
xpath
=
'//div[@id="{parent}"]//div[text()="{progress}"]'
.
format
(
parent
=
selector
,
progress
=
progress
,
)
node
=
world
.
browser
.
find_by_xpath
(
xpath
)
assert
node
assert_equal
(
progress
,
world
.
css_find
(
'#grade-detail-graph .overallGrade'
)
.
first
.
text
.
split
(
'
\n
'
)[
1
])
@step
(
'I see in the gradebook table that "([^"]*)" is "([^"]*)"$'
)
...
...
lms/templates/courseware/progress.html
View file @
af504fc6
This diff is collapsed.
Click to expand it.
lms/templates/courseware/progress_graph.js
View file @
af504fc6
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment