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
edffa735
Commit
edffa735
authored
Sep 29, 2014
by
Don Mitchell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Convert acceptance to opaque keys
parent
785a3c82
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
53 additions
and
67 deletions
+53
-67
lms/djangoapps/courseware/features/certificates.py
+14
-17
lms/djangoapps/courseware/features/common.py
+0
-1
lms/djangoapps/courseware/features/conditional.py
+1
-0
lms/djangoapps/courseware/features/lti.feature
+4
-4
lms/djangoapps/courseware/features/lti.py
+9
-20
lms/djangoapps/courseware/features/navigation.py
+3
-4
lms/djangoapps/courseware/features/problems.py
+0
-2
lms/djangoapps/courseware/features/problems_setup.py
+11
-9
lms/djangoapps/instructor/features/bulk_email.py
+4
-3
lms/djangoapps/instructor/features/common.py
+2
-3
lms/djangoapps/instructor/features/data_download.py
+5
-4
No files found.
lms/djangoapps/courseware/features/certificates.py
View file @
edffa735
...
...
@@ -3,22 +3,20 @@
from
lettuce
import
world
,
step
from
lettuce.django
import
django_url
from
course_modes.models
import
CourseMode
from
nose.tools
import
assert_equal
UPSELL_LINK_CSS
=
'.message-upsell a.action-upgrade[href*="edx/999/Certificates"]'
def
create_cert_course
():
world
.
clear_courses
()
org
=
'edx'
number
=
'999'
name
=
'Certificates'
course_id
=
'{org}/{number}/{name}'
.
format
(
org
=
org
,
number
=
number
,
name
=
name
)
world
.
scenario_dict
[
'course_id'
]
=
course_id
world
.
scenario_dict
[
'COURSE'
]
=
world
.
CourseFactory
.
create
(
org
=
org
,
number
=
number
,
display_name
=
name
)
world
.
scenario_dict
[
'course_id'
]
=
world
.
scenario_dict
[
'COURSE'
]
.
id
world
.
UPSELL_LINK_CSS
=
u'.message-upsell a.action-upgrade[href*="{}"]'
.
format
(
world
.
scenario_dict
[
'course_id'
]
)
honor_mode
=
world
.
CourseModeFactory
.
create
(
course_id
=
world
.
scenario_dict
[
'course_id'
],
...
...
@@ -28,7 +26,7 @@ def create_cert_course():
)
verfied_mode
=
world
.
CourseModeFactory
.
create
(
course_id
=
course_id
,
course_id
=
world
.
scenario_dict
[
'course_id'
]
,
mode_slug
=
'verified'
,
mode_display_name
=
'verified cert course'
,
min_price
=
16
,
...
...
@@ -38,8 +36,7 @@ def create_cert_course():
def
register
():
url
=
'courses/{org}/{number}/{name}/about'
.
format
(
org
=
'edx'
,
number
=
'999'
,
name
=
'Certificates'
)
url
=
u'courses/{}/about'
.
format
(
world
.
scenario_dict
[
'course_id'
])
world
.
browser
.
visit
(
django_url
(
url
))
world
.
css_click
(
'section.intro a.register'
)
...
...
@@ -147,7 +144,7 @@ def approve_my_photo(step, name):
# HACK: for now don't bother clicking the approve button for
# id_photo, because it is sending you back to Step 1.
# Come back and figure it out later. JZ Aug 29 2013
if
name
==
'face'
:
if
name
==
'face'
:
world
.
css_click
(
button_css
[
name
])
# Make sure you didn't advance the carousel
...
...
@@ -234,27 +231,27 @@ def navigate_to_my_dashboard(step):
@step
(
u'I see the course on my dashboard'
)
def
see_the_course_on_my_dashboard
(
step
):
course_link_css
=
'section.my-courses a[href*="edx/999/Certificates"]'
course_link_css
=
u'section.my-courses a[href*="{}"]'
.
format
(
world
.
scenario_dict
[
'course_id'
])
assert
world
.
is_css_present
(
course_link_css
)
@step
(
u'I see the upsell link on my dashboard'
)
def
see_upsell_link_on_my_dashboard
(
step
):
course_link_css
=
UPSELL_LINK_CSS
course_link_css
=
world
.
UPSELL_LINK_CSS
assert
world
.
is_css_present
(
course_link_css
)
@step
(
u'I do not see the upsell link on my dashboard'
)
def
see_
upsell_link_on_my_dashboard
(
step
):
course_link_css
=
UPSELL_LINK_CSS
def
see_
no_upsell_link
(
step
):
course_link_css
=
world
.
UPSELL_LINK_CSS
assert
world
.
is_css_not_present
(
course_link_css
)
@step
(
u'I select the upsell link on my dashboard'
)
def
se
e
_upsell_link_on_my_dashboard
(
step
):
def
se
lect
_upsell_link_on_my_dashboard
(
step
):
# expand the upsell section
world
.
css_click
(
'.message-upsell'
)
course_link_css
=
UPSELL_LINK_CSS
course_link_css
=
world
.
UPSELL_LINK_CSS
# click the actual link
world
.
css_click
(
course_link_css
)
...
...
@@ -267,7 +264,7 @@ def see_that_i_am_on_the_verified_track(step):
@step
(
u'I leave the flow and return$'
)
def
leave_the_flow_and_return
(
step
):
world
.
visit
(
'verify_student/verified/edx/999/Certificates/'
)
world
.
visit
(
u'verify_student/verified/{}/'
.
format
(
world
.
scenario_dict
[
'course_id'
])
)
@step
(
u'I am at the verified page$'
)
...
...
lms/djangoapps/courseware/features/common.py
View file @
edffa735
...
...
@@ -11,7 +11,6 @@ from django.contrib.auth.models import User
from
django.core.urlresolvers
import
reverse
from
student.models
import
CourseEnrollment
from
xmodule.modulestore.django
import
modulestore
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
from
xmodule.course_module
import
CourseDescriptor
from
courseware.courses
import
get_course_by_id
from
xmodule
import
seq_module
,
vertical_module
...
...
lms/djangoapps/courseware/features/conditional.py
View file @
edffa735
...
...
@@ -7,6 +7,7 @@ from nose.tools import assert_in, assert_true # pylint: disable=no-name-in-modu
from
common
import
i_am_registered_for_the_course
,
visit_scenario_item
from
problems_setup
import
add_problem_to_course
,
answer_problem
@steps
class
ConditionalSteps
(
object
):
COURSE_NUM
=
'test_course'
...
...
lms/djangoapps/courseware/features/lti.feature
View file @
edffa735
...
...
@@ -44,7 +44,7 @@ Feature: LMS.LTI component
Scenario
:
Graded LTI component in LMS is correctly works
Given
the course has correct LTI credentials with registered Instructor
And the course has an LTI component with correct fields
:
|
open_in_a_new_page
|
weight
|
is_graded
|
has_score
|
|
open_in_a_new_page
|
weight
|
graded
|
has_score
|
|
False
|
10
|
True
|
True
|
And
I submit answer to LTI 1 question
And
I click on the
"Progress"
tab
...
...
@@ -71,7 +71,7 @@ Feature: LMS.LTI component
Scenario
:
Graded LTI component in LMS is correctly works with beta testers
Given
the course has correct LTI credentials with registered BetaTester
And the course has an LTI component with correct fields
:
|
open_in_a_new_page
|
weight
|
is_graded
|
has_score
|
|
open_in_a_new_page
|
weight
|
graded
|
has_score
|
|
False
|
10
|
True
|
True
|
And
I submit answer to LTI 1 question
And
I click on the
"Progress"
tab
...
...
@@ -82,7 +82,7 @@ Feature: LMS.LTI component
Scenario
:
Graded LTI component in LMS is correctly works with LTI2v0 PUT callback
Given
the course has correct LTI credentials with registered Instructor
And the course has an LTI component with correct fields
:
|
open_in_a_new_page
|
weight
|
is_graded
|
has_score
|
|
open_in_a_new_page
|
weight
|
graded
|
has_score
|
|
False
|
10
|
True
|
True
|
And
I submit answer to LTI 2 question
And
I click on the
"Progress"
tab
...
...
@@ -101,7 +101,7 @@ Feature: LMS.LTI component
Scenario
:
Graded LTI component in LMS is correctly works with LTI2v0 PUT delete callback
Given
the course has correct LTI credentials with registered Instructor
And the course has an LTI component with correct fields
:
|
open_in_a_new_page
|
weight
|
is_graded
|
has_score
|
|
open_in_a_new_page
|
weight
|
graded
|
has_score
|
|
False
|
10
|
True
|
True
|
And
I submit answer to LTI 2 question
And
I visit the LTI component
...
...
lms/djangoapps/courseware/features/lti.py
View file @
edffa735
...
...
@@ -13,7 +13,7 @@ from courseware.tests.factories import InstructorFactory, BetaTesterFactory
from
courseware.access
import
has_access
from
student.tests.factories
import
UserFactory
from
common
import
course_id
,
visit_scenario_item
from
common
import
visit_scenario_item
@step
(
'I view the LTI and error is shown$'
)
...
...
@@ -29,7 +29,7 @@ def lti_is_not_rendered(_step):
def
check_lti_iframe_content
(
text
):
#inside iframe test content is presented
#
inside iframe test content is presented
location
=
world
.
scenario_dict
[
'LTI'
]
.
location
.
html_id
()
iframe_name
=
'ltiFrame-'
+
location
with
world
.
browser
.
get_iframe
(
iframe_name
)
as
iframe
:
...
...
@@ -95,7 +95,7 @@ def incorrect_lti_is_rendered(_step):
assert
not
world
.
is_css_present
(
'.link_lti_new_window'
,
wait_time
=
0
)
assert
not
world
.
is_css_present
(
'.error_message'
,
wait_time
=
0
)
#inside iframe test content is presented
#
inside iframe test content is presented
check_lti_iframe_content
(
"Wrong LTI signature"
)
...
...
@@ -119,7 +119,7 @@ def set_incorrect_lti_passport(_step):
i_am_registered_for_the_course
(
coursenum
,
metadata
)
@step
(
'the course has an LTI component with (.*) fields(?:
\
:)?$'
)
#, new_page is(.*), is_
graded is(.*)
@step
(
'the course has an LTI component with (.*) fields(?:
\
:)?$'
)
# , new_page is(.*),
graded is(.*)
def
add_correct_lti_to_course
(
_step
,
fields
):
category
=
'lti'
metadata
=
{
...
...
@@ -176,7 +176,6 @@ def create_course_for_lti(course, metadata):
},
]
}
metadata
.
update
(
grading_policy
)
# Create the course
# We always use the same org and display name,
...
...
@@ -186,17 +185,7 @@ def create_course_for_lti(course, metadata):
number
=
course
,
display_name
=
'Test Course'
,
metadata
=
metadata
,
grading_policy
=
{
"GRADER"
:
[
{
"type"
:
"Homework"
,
"min_count"
:
1
,
"drop_count"
:
0
,
"short_label"
:
"HW"
,
"weight"
:
weight
},
]
},
grading_policy
=
grading_policy
,
)
# Add a section to the course to contain problems
...
...
@@ -248,7 +237,7 @@ def check_lti_popup(parent_window):
assert
len
(
world
.
browser
.
windows
)
!=
1
for
window
in
world
.
browser
.
windows
:
world
.
browser
.
switch_to_window
(
window
)
# Switch to a different window (the pop-up)
world
.
browser
.
switch_to_window
(
window
)
# Switch to a different window (the pop-up)
# Check if this is the one we want by comparing the url
url
=
world
.
browser
.
url
basename
=
os
.
path
.
basename
(
url
)
...
...
@@ -260,8 +249,8 @@ def check_lti_popup(parent_window):
assert
result
==
u'This is LTI tool. Success.'
world
.
browser
.
driver
.
close
()
# Close the pop-up window
world
.
browser
.
switch_to_window
(
parent_window
)
# Switch to the main window again
world
.
browser
.
driver
.
close
()
# Close the pop-up window
world
.
browser
.
switch_to_window
(
parent_window
)
# Switch to the main window again
def
click_and_check_lti_popup
():
...
...
@@ -314,7 +303,7 @@ def see_value_in_the_gradebook(_step, label, text):
for
i
,
element
in
enumerate
(
table_headers
):
if
element
.
text
.
strip
()
==
label
:
index
=
i
break
;
break
assert_true
(
world
.
css_has_text
(
'{0} tbody td'
.
format
(
table_selector
),
text
,
index
=
index
))
...
...
lms/djangoapps/courseware/features/navigation.py
View file @
edffa735
...
...
@@ -2,10 +2,9 @@
# pylint: disable=W0621
from
lettuce
import
world
,
step
from
common
import
course_
id
,
course_
location
from
common
import
course_location
from
problems_setup
import
PROBLEM_DICT
from
nose.tools
import
assert_in
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
@step
(
u'I am viewing a course with multiple sections'
)
...
...
@@ -149,9 +148,9 @@ def create_course():
def
create_user_and_visit_course
():
world
.
register_by_course_key
(
SlashSeparatedCourseKey
(
'edx'
,
'999'
,
'Test_Course'
)
)
world
.
register_by_course_key
(
world
.
scenario_dict
[
'COURSE'
]
.
id
)
world
.
log_in
()
world
.
visit
(
'/courses/edx/999/Test_Course/courseware/'
)
world
.
visit
(
u'/courses/{}/courseware/'
.
format
(
world
.
scenario_dict
[
'COURSE'
]
.
id
)
)
def
add_problem_to_course_section
(
parent_location
,
display_name
):
...
...
lms/djangoapps/courseware/features/problems.py
View file @
edffa735
...
...
@@ -6,10 +6,8 @@ Steps for problem.feature lettuce tests
# pylint: disable=W0621
from
lettuce
import
world
,
step
from
lettuce.django
import
django_url
from
common
import
i_am_registered_for_the_course
,
visit_scenario_item
from
problems_setup
import
PROBLEM_DICT
,
answer_problem
,
problem_has_answer
,
add_problem_to_course
from
nose.tools
import
assert_equal
def
_view_problem
(
step
,
problem_type
,
problem_settings
=
None
):
...
...
lms/djangoapps/courseware/features/problems_setup.py
View file @
edffa735
# pylint: disable=C0111
# pylint: disable=W0621
#EVERY PROBLEM TYPE MUST HAVE THE FOLLOWING:
#
EVERY PROBLEM TYPE MUST HAVE THE FOLLOWING:
# -Section in Dictionary containing:
# -factory
# -kwargs
...
...
@@ -187,7 +187,9 @@ def answer_problem(course, problem_type, correctness):
section_loc
=
section_location
(
course
)
if
problem_type
==
"drop down"
:
select_name
=
"input_i4x-{0.org}-{0.course}-problem-drop_down_2_1"
.
format
(
section_loc
)
select_name
=
"input_{}_2_1"
.
format
(
section_loc
.
course_key
.
make_usage_key
(
'problem'
,
'drop_down'
)
.
html_id
()
)
option_text
=
'Option 2'
if
correctness
==
'correct'
else
'Option 3'
world
.
select_option
(
select_name
,
option_text
)
...
...
@@ -263,8 +265,9 @@ def answer_problem(course, problem_type, correctness):
offset
=
25
if
correctness
==
"correct"
else
-
25
def
try_click
():
image_selector
=
"#imageinput_i4x-{0.org}-{0.course}-problem-image_2_1"
.
format
(
section_loc
)
input_selector
=
"#input_i4x-{0.org}-{0.course}-problem-image_2_1"
.
format
(
section_loc
)
problem_html_loc
=
section_loc
.
course_key
.
make_usage_key
(
'problem'
,
'image'
)
.
html_id
()
image_selector
=
"#imageinput_{}_2_1"
.
format
(
problem_html_loc
)
input_selector
=
"#input_{}_2_1"
.
format
(
problem_html_loc
)
world
.
browser
.
execute_script
(
'$("body").on("click", function(event) {console.log(event);})'
)
...
...
@@ -385,16 +388,15 @@ def inputfield(course, problem_type, choice=None, input_num=1):
section_loc
=
section_location
(
course
)
ptype
=
problem_type
.
replace
(
" "
,
"_"
)
# this is necessary due to naming requirement for this problem type
if
problem_type
in
(
"radio_text"
,
"checkbox_text"
):
selector_template
=
"input#
i4x-{org}-{course}-problem-{ptype
}_2_{input}"
selector_template
=
"input#
{
}_2_{input}"
else
:
selector_template
=
"input#input_
i4x-{org}-{course}-problem-{ptype
}_2_{input}"
selector_template
=
"input#input_
{
}_2_{input}"
sel
=
selector_template
.
format
(
org
=
section_loc
.
org
,
course
=
section_loc
.
course
,
ptype
=
problem_type
.
replace
(
" "
,
"_"
),
section_loc
.
course_key
.
make_usage_key
(
'problem'
,
ptype
)
.
html_id
(),
input
=
input_num
,
)
...
...
lms/djangoapps/instructor/features/bulk_email.py
View file @
edffa735
...
...
@@ -7,7 +7,7 @@ Define steps for bulk email acceptance test.
from
lettuce
import
world
,
step
from
lettuce.django
import
mail
from
nose.tools
import
assert_in
,
assert_
true
,
assert_
equal
# pylint: disable=E0611
from
nose.tools
import
assert_in
,
assert_equal
# pylint: disable=E0611
from
django.core.management
import
call_command
from
django.conf
import
settings
...
...
@@ -115,8 +115,9 @@ def when_i_send_an_email(step, recipient): # pylint: disable=unused-argument
call_command
(
'loaddata'
,
'course_email_template.json'
)
# Go to the email section of the instructor dash
world
.
visit
(
'/courses/edx/888/Bulk_Email_Test_Course'
)
world
.
css_click
(
'a[href="/courses/edx/888/Bulk_Email_Test_Course/instructor"]'
)
url
=
'/courses/{}'
.
format
(
world
.
bulk_email_course_key
)
world
.
visit
(
url
)
world
.
css_click
(
'a[href="{}/instructor"]'
.
format
(
url
))
world
.
css_click
(
'a[data-section="send_email"]'
)
# Select the recipient
...
...
lms/djangoapps/instructor/features/common.py
View file @
edffa735
...
...
@@ -7,7 +7,6 @@ Define common steps for instructor dashboard acceptance tests.
from
__future__
import
absolute_import
from
django.conf
import
settings
from
lettuce
import
world
,
step
from
mock
import
patch
from
nose.tools
import
assert_in
# pylint: disable=E0611
...
...
@@ -75,8 +74,8 @@ def i_am_staff_or_instructor(step, role): # pylint: disable=unused-argument
def
go_to_section
(
section_name
):
# section name should be one of
# course_info, membership, student_admin, data_download, analytics, send_email
world
.
visit
(
'/courses/edx/999/Test_Course'
)
world
.
css_click
(
'a[href="/courses/edx/999/Test_Course/instructor"]'
)
world
.
visit
(
u'/courses/{}'
.
format
(
world
.
course_key
)
)
world
.
css_click
(
u'a[href="/courses/{}/instructor"]'
.
format
(
world
.
course_key
)
)
world
.
css_click
(
'a[data-section="{0}"]'
.
format
(
section_name
))
...
...
lms/djangoapps/instructor/features/data_download.py
View file @
edffa735
...
...
@@ -9,7 +9,7 @@ acceptance tests.
from
lettuce
import
world
,
step
from
nose.tools
import
assert_in
,
assert_regexp_matches
# pylint: disable=E0611
from
terrain.steps
import
reload_the_page
from
splinter.request_handler.request_handler
import
RequestHandler
from
django.utils
import
http
@step
(
u'I see a table of student profiles'
)
...
...
@@ -60,11 +60,11 @@ Graded sections:
subgrader=<class 'xmodule.graders.AssignmentFormatGrader'>, type=Midterm Exam, category=Midterm Exam, weight=0.3
subgrader=<class 'xmodule.graders.AssignmentFormatGrader'>, type=Final Exam, category=Final Exam, weight=0.4
-----------------------------------------------------------------------------
Listing grading context for course
edx/999/Test_Course
Listing grading context for course
{}
graded sections:
[]
all descriptors:
length=0"""
length=0"""
.
format
(
world
.
course_key
)
assert_in
(
expected_config
,
world
.
css_text
(
'#data-grade-config-text'
))
...
...
@@ -74,7 +74,8 @@ def find_grade_report_csv_link(step): # pylint: disable=unused-argument
reload_the_page
(
step
)
world
.
wait_for_visible
(
'#report-downloads-table'
)
# Find table and assert a .csv file is present
expected_file_regexp
=
'edx_999_Test_Course_grade_report_
\
d{4}-
\
d{2}-
\
d{2}-
\
d{4}
\
.csv'
quoted_id
=
http
.
urlquote
(
world
.
course_key
)
.
replace
(
'/'
,
'_'
)
expected_file_regexp
=
quoted_id
+
'_grade_report_
\
d{4}-
\
d{2}-
\
d{2}-
\
d{4}
\
.csv'
assert_regexp_matches
(
world
.
css_html
(
'#report-downloads-table'
),
expected_file_regexp
,
msg
=
"Expected grade report filename was not found."
...
...
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