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
82092bdd
Commit
82092bdd
authored
Nov 20, 2013
by
Christina Roberts
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1697 from edx/christina/i4x_test
Test HTML returned from view methods for "i4X".
parents
729f2e3b
f01b36b5
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
127 additions
and
36 deletions
+127
-36
cms/djangoapps/contentstore/tests/test_contentstore.py
+111
-27
cms/static/js/models/course_info.js
+1
-4
cms/templates/asset_index.html
+1
-1
cms/templates/course_info.html
+0
-1
cms/templates/settings.html
+1
-1
cms/templates/widgets/segment-io.html
+13
-2
No files found.
cms/djangoapps/contentstore/tests/test_contentstore.py
View file @
82092bdd
#pylint: disable=E1101
import
json
import
shutil
import
mock
...
...
@@ -15,6 +14,7 @@ from fs.osfs import OSFS
import
copy
from
json
import
loads
from
datetime
import
timedelta
from
django.test
import
TestCase
from
django.contrib.auth.models
import
User
from
django.dispatch
import
Signal
...
...
@@ -53,6 +53,7 @@ from pytz import UTC
from
uuid
import
uuid4
from
pymongo
import
MongoClient
from
student.models
import
CourseEnrollment
import
re
from
contentstore.utils
import
delete_course_and_groups
from
xmodule.modulestore.django
import
loc_mapper
...
...
@@ -135,6 +136,8 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
descriptor
.
location
.
url
()}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment after edit_unit no longer using locations.
# _test_no_locations(self, resp)
for
expected
in
expected_types
:
self
.
assertIn
(
expected
,
resp
.
content
)
...
...
@@ -160,15 +163,21 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
location
.
url
()}))
self
.
assertEqual
(
resp
.
status_code
,
400
)
_test_no_locations
(
self
,
resp
,
status_code
=
400
)
def
check_edit_unit
(
self
,
test_course_name
):
import_from_xml
(
modulestore
(
'direct'
),
'common/test/data/'
,
[
test_course_name
])
for
descriptor
in
modulestore
()
.
get_items
(
Location
(
None
,
None
,
'vertical'
,
None
,
None
)):
items
=
modulestore
()
.
get_items
(
Location
(
'i4x'
,
'edX'
,
test_course_name
,
'vertical'
,
None
,
None
))
# Assert is here to make sure that the course being tested actually has verticals.
self
.
assertGreater
(
len
(
items
),
0
)
for
descriptor
in
items
:
print
"Checking "
,
descriptor
.
location
.
url
()
print
descriptor
.
__class__
,
descriptor
.
location
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
descriptor
.
location
.
url
()}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment after edit_unit not using locations.
# _test_no_locations(self, resp)
def
lockAnAsset
(
self
,
content_store
,
course_location
):
"""
...
...
@@ -483,6 +492,8 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
)
resp
=
self
.
client
.
get_html
(
locator
.
url_reverse
(
'xblock'
))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when preview no longer has locations being returned.
# _test_no_locations(self, resp)
return
resp
def
test_delete
(
self
):
...
...
@@ -841,6 +852,7 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
def
test_bad_contentstore_request
(
self
):
resp
=
self
.
client
.
get_html
(
'http://localhost:8001/c4x/CDX/123123/asset/&images_circuits_Lab7Solution2.png'
)
self
.
assertEqual
(
resp
.
status_code
,
400
)
_test_no_locations
(
self
,
resp
,
400
)
def
test_rewrite_nonportable_links_on_import
(
self
):
module_store
=
modulestore
(
'direct'
)
...
...
@@ -1026,12 +1038,11 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase):
items
=
module_store
.
get_items
(
stub_location
.
replace
(
category
=
'vertical'
,
name
=
None
))
self
.
assertGreater
(
len
(
items
),
0
)
for
descriptor
in
items
:
# don't try to look at private verticals. Right now we're running
# the service in non-draft aware
if
getattr
(
descriptor
,
'is_draft'
,
False
):
print
"Checking {0}...."
.
format
(
descriptor
.
location
.
url
())
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
descriptor
.
location
.
url
()}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when edit_unit no longer has locations.
# _test_no_locations(self, resp)
# verify that we have the content in the draft store as well
vertical
=
draft_store
.
get_item
(
...
...
@@ -1508,6 +1519,7 @@ class ContentStoreTest(ModuleStoreTestCase):
status_code
=
200
,
html
=
True
)
_test_no_locations
(
self
,
resp
)
def
test_course_factory
(
self
):
"""Test that the course factory works correctly."""
...
...
@@ -1530,6 +1542,8 @@ class ContentStoreTest(ModuleStoreTestCase):
status_code
=
200
,
html
=
True
)
# TODO: uncomment when course index no longer has locations being returned.
# _test_no_locations(self, resp)
def
test_course_overview_view_with_course
(
self
):
"""Test viewing the course overview page with an existing course"""
...
...
@@ -1589,6 +1603,13 @@ class ContentStoreTest(ModuleStoreTestCase):
Import and walk through some common URL endpoints. This just verifies non-500 and no other
correct behavior, so it is not a deep test
"""
def
test_get_html
(
page
):
# Helper function for getting HTML for a page in Studio and
# checking that it does not error.
resp
=
self
.
client
.
get_html
(
new_location
.
url_reverse
(
page
))
self
.
assertEqual
(
resp
.
status_code
,
200
)
_test_no_locations
(
self
,
resp
)
import_from_xml
(
modulestore
(
'direct'
),
'common/test/data/'
,
[
'simple'
])
loc
=
Location
([
'i4x'
,
'edX'
,
'simple'
,
'course'
,
'2012_Fall'
,
None
])
new_location
=
loc_mapper
()
.
translate_location
(
loc
.
course_id
,
loc
,
False
,
True
)
...
...
@@ -1598,42 +1619,46 @@ class ContentStoreTest(ModuleStoreTestCase):
self
.
assertContains
(
resp
,
'Chapter 2'
)
# go to various pages
test_get_html
(
'import'
)
test_get_html
(
'export'
)
test_get_html
(
'course_team'
)
test_get_html
(
'course_info'
)
test_get_html
(
'checklists'
)
test_get_html
(
'assets'
)
# import page
resp
=
self
.
client
.
get_html
(
new_location
.
url_reverse
(
'import/'
,
''
))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# export page
resp
=
self
.
client
.
get_html
(
new_location
.
url_reverse
(
'export/'
,
''
))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# course team
url
=
new_location
.
url_reverse
(
'course_team/'
,
''
)
resp
=
self
.
client
.
get_html
(
url
)
self
.
assertEqual
(
resp
.
status_code
,
200
)
# course info
resp
=
self
.
client
.
get
(
new_location
.
url_reverse
(
'course_info'
))
# settings_details
resp
=
self
.
client
.
get_html
(
reverse
(
'settings_details'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
_test_no_locations
(
self
,
resp
)
# settings_details
resp
=
self
.
client
.
get
(
reverse
(
'settings_details
'
,
resp
=
self
.
client
.
get
_html
(
reverse
(
'settings_grading
'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when grading is not using old locations.
# _test_no_locations(self, resp)
#
settings_detail
s
resp
=
self
.
client
.
get
(
reverse
(
'settings_grading
'
,
#
advanced setting
s
resp
=
self
.
client
.
get
_html
(
reverse
(
'course_advanced_settings
'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when advanced settings not using old locations.
# _test_no_locations(self, resp)
# assets_handler (HTML for full page content)
url
=
new_location
.
url_reverse
(
'assets/'
,
''
)
resp
=
self
.
client
.
get_html
(
url
)
# textbook index
resp
=
self
.
client
.
get_html
(
reverse
(
'textbook_index'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
_test_no_locations
(
self
,
resp
)
# go look at a subsection page
subsection_location
=
loc
.
replace
(
category
=
'sequential'
,
name
=
'test_sequence'
)
...
...
@@ -1641,12 +1666,23 @@ class ContentStoreTest(ModuleStoreTestCase):
reverse
(
'edit_subsection'
,
kwargs
=
{
'location'
:
subsection_location
.
url
()})
)
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when grading and outline not using old locations.
# _test_no_locations(self, resp)
# go look at the Edit page
unit_location
=
loc
.
replace
(
category
=
'vertical'
,
name
=
'test_vertical'
)
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
unit_location
.
url
()}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
# TODO: uncomment when edit_unit not using old locations.
# _test_no_locations(self, resp)
resp
=
self
.
client
.
get_html
(
reverse
(
'edit_tabs'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'coursename'
:
loc
.
name
}))
self
.
assertEqual
(
resp
.
status_code
,
200
)
_test_no_locations
(
self
,
resp
)
def
delete_item
(
category
,
name
):
""" Helper method for testing the deletion of an xblock item. """
...
...
@@ -1654,6 +1690,7 @@ class ContentStoreTest(ModuleStoreTestCase):
del_location
=
loc_mapper
()
.
translate_location
(
loc
.
course_id
,
del_loc
,
False
,
True
)
resp
=
self
.
client
.
delete
(
del_location
.
url_reverse
(
'xblock'
))
self
.
assertEqual
(
resp
.
status_code
,
204
)
_test_no_locations
(
self
,
resp
,
status_code
=
204
,
html
=
False
)
# delete a component
delete_item
(
category
=
'html'
,
name
=
'test_html'
)
...
...
@@ -1853,7 +1890,10 @@ class ContentStoreTest(ModuleStoreTestCase):
Show the course overview page.
"""
new_location
=
loc_mapper
()
.
translate_location
(
location
.
course_id
,
location
,
False
,
True
)
return
self
.
client
.
get_html
(
new_location
.
url_reverse
(
'course/'
,
''
))
resp
=
self
.
client
.
get_html
(
new_location
.
url_reverse
(
'course/'
,
''
))
# TODO: uncomment when i4x no longer in overview.
# _test_no_locations(self, resp)
return
resp
@override_settings
(
MODULESTORE
=
TEST_MODULESTORE
)
...
...
@@ -1920,6 +1960,32 @@ class MetadataSaveTestCase(ModuleStoreTestCase):
pass
class
EntryPageTestCase
(
TestCase
):
"""
Tests entry pages that aren't specific to a course.
"""
def
setUp
(
self
):
self
.
client
=
AjaxEnabledTestClient
()
def
_test_page
(
self
,
page
,
status_code
=
200
):
resp
=
self
.
client
.
get_html
(
reverse
(
page
))
self
.
assertEqual
(
resp
.
status_code
,
status_code
)
_test_no_locations
(
self
,
resp
,
status_code
)
def
test_how_it_works
(
self
):
self
.
_test_page
(
"howitworks"
)
def
test_signup
(
self
):
self
.
_test_page
(
"signup"
)
def
test_login
(
self
):
self
.
_test_page
(
"login"
)
def
test_logout
(
self
):
# Logout redirects.
self
.
_test_page
(
"logout"
,
302
)
def
_create_course
(
test
,
course_data
):
"""
Creates a course via an AJAX request and verifies the URL returned in the response.
...
...
@@ -1945,3 +2011,21 @@ def _course_factory_create_course():
def
_get_course_id
(
test_course_data
):
"""Returns the course ID (org/number/run)."""
return
"{org}/{number}/{run}"
.
format
(
**
test_course_data
)
def
_test_no_locations
(
test
,
resp
,
status_code
=
200
,
html
=
True
):
"""
Verifies that "i4x", which appears in old locations, but not
new locators, does not appear in the HTML response output.
Used to verify that database refactoring is complete.
"""
test
.
assertNotContains
(
resp
,
'i4x'
,
status_code
=
status_code
,
html
=
html
)
if
html
:
# For HTML pages, it is nice to call the method with html=True because
# it checks that the HTML properly parses. However, it won't find i4x usages
# in JavaScript blocks.
content
=
resp
.
content
num_jump_to
=
len
(
re
.
findall
(
r"8000(\S)*jump_to/i4x"
,
content
))
total_i4x
=
len
(
re
.
findall
(
r"i4x"
,
content
))
test
.
assertEqual
(
total_i4x
-
num_jump_to
,
0
,
"i4x found outside of LMS jump-to links"
)
cms/static/js/models/course_info.js
View file @
82092bdd
...
...
@@ -5,12 +5,9 @@ define(["backbone"], function(Backbone) {
url
:
''
,
defaults
:
{
"courseId"
:
""
,
// the location url
"updates"
:
null
,
// UpdateCollection
"handouts"
:
null
// HandoutCollection
},
idAttribute
:
"courseId"
}
});
return
CourseInfo
;
});
cms/templates/asset_index.html
View file @
82092bdd
...
...
@@ -187,7 +187,7 @@ require(["domReady", "jquery", "gettext", "js/models/asset", "js/collections/ass
<a
href=
"#"
class=
"close-button"
><i
class=
"icon-remove-sign"
></i>
<span
class=
"sr"
>
${_('close')}
</span></a>
<div
class=
"modal-body"
>
<h1
class=
"title"
>
${_("Upload New File")}
</h1>
<p
class=
"file-name"
>
</a>
<p
class=
"file-name"
>
<div
class=
"progress-bar"
>
<div
class=
"progress-fill"
></div>
</div>
...
...
cms/templates/course_info.html
View file @
82092bdd
...
...
@@ -33,7 +33,6 @@ require(["domReady!", "jquery", "js/collections/course_update", "js/models/modul
var
editor
=
new
CourseInfoEditView
({
el
:
$
(
'.main-wrapper'
),
model
:
new
CourseInfoModel
({
courseId
:
'${context_course.location}'
,
updates
:
course_updates
,
base_asset_url
:
'${base_asset_url}'
,
handouts
:
course_handouts
...
...
cms/templates/settings.html
View file @
82092bdd
...
...
@@ -87,7 +87,7 @@ require(["domReady!", "jquery", "js/models/settings/course_details", "js/views/s
<div
class=
"note note-promotion note-promotion-courseURL has-actions"
>
<h3
class=
"title"
>
${_("Course Summary Page")}
<span
class=
"tip"
>
${_("(for student enrollment and access)")}
</span></h3>
<div
class=
"copy"
>
<p><a
class=
"link-courseURL"
rel=
"external"
href=
"https:${utils.get_lms_link_for_about_page(course_location)}"
/
>
https:${utils.get_lms_link_for_about_page(course_location)}
</a></p>
<p><a
class=
"link-courseURL"
rel=
"external"
href=
"https:${utils.get_lms_link_for_about_page(course_location)}"
>
https:${utils.get_lms_link_for_about_page(course_location)}
</a></p>
</div>
<ul
class=
"list-actions"
>
...
...
cms/templates/widgets/segment-io.html
View file @
82092bdd
<
%!
from
xmodule
.
modulestore
.
django
import
loc_mapper
%
>
% if context_course:
<
%
ctx_loc =
context_course.location
locator =
loc_mapper().translate_location(ctx_loc.course_id,
ctx_loc
,
False
,
True
)
%
>
% endif
% if settings.MITX_FEATURES.get('SEGMENT_IO'):
<!-- begin Segment.io -->
<script
type=
"text/javascript"
>
// if inside course, inject the course location into the JS namespace
%
if
context_course
:
var
course_location_analytics
=
"${context_course.location
}"
;
var
course_location_analytics
=
"${locator
}"
;
%
endif
var
analytics
=
analytics
||
[];
analytics
.
load
=
function
(
e
){
var
t
=
document
.
createElement
(
"script"
);
t
.
type
=
"text/javascript"
,
t
.
async
=!
0
,
t
.
src
=
(
"https:"
===
document
.
location
.
protocol
?
"https://"
:
"http://"
)
+
"d2dq2ahtl5zl1z.cloudfront.net/analytics.js/v1/"
+
e
+
"/analytics.min.js"
;
var
n
=
document
.
getElementsByTagName
(
"script"
)[
0
];
n
.
parentNode
.
insertBefore
(
t
,
n
);
var
r
=
function
(
e
){
return
function
(){
analytics
.
push
([
e
].
concat
(
Array
.
prototype
.
slice
.
call
(
arguments
,
0
)))}},
i
=
[
"identify"
,
"track"
,
"trackLink"
,
"trackForm"
,
"trackClick"
,
"trackSubmit"
,
"pageview"
,
"ab"
,
"alias"
,
"ready"
];
for
(
var
s
=
0
;
s
<
i
.
length
;
s
++
)
analytics
[
i
[
s
]]
=
r
(
i
[
s
])};
...
...
@@ -22,7 +33,7 @@
<!-- dummy segment.io -->
<script
type=
"text/javascript"
>
%
if
context_course
:
var
course_location_analytics
=
"${
context_course.location
}"
;
var
course_location_analytics
=
"${
locator
}"
;
%
endif
var
analytics
=
{
"track"
:
function
()
{}
...
...
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