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
fde6d1ba
Commit
fde6d1ba
authored
Feb 04, 2013
by
Jay Zoldak
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor tests for cms contentstore.
parent
33246152
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
73 additions
and
78 deletions
+73
-78
cms/djangoapps/contentstore/tests/test_contentstore.py
+0
-0
cms/djangoapps/contentstore/tests/test_course_settings.py
+30
-41
cms/djangoapps/contentstore/tests/tests.py
+1
-18
cms/djangoapps/contentstore/tests/utils.py
+28
-13
cms/djangoapps/contentstore/views.py
+10
-2
common/lib/xmodule/xmodule/modulestore/tests/factories.py
+4
-4
No files found.
cms/djangoapps/contentstore/tests/test_contentstore.py
View file @
fde6d1ba
This diff is collapsed.
Click to expand it.
cms/djangoapps/contentstore/tests/test_course_settings.py
View file @
fde6d1ba
from
django.test.testcases
import
TestCase
import
datetime
import
time
from
django.contrib.auth.models
import
User
import
xmodule
from
django.test.client
import
Client
from
django.core.urlresolvers
import
reverse
from
xmodule.modulestore
import
Location
from
cms.djangoapps.models.settings.course_details
import
CourseDetails
,
\
CourseSettingsEncoder
import
json
from
util
import
converters
import
calendar
import
copy
from
util
import
converters
from
util.converters
import
jsdate_to_time
from
django.test.testcases
import
TestCase
from
django.contrib.auth.models
import
User
from
django.test.client
import
Client
from
django.core.urlresolvers
import
reverse
from
django.utils.timezone
import
UTC
import
xmodule
from
xmodule.modulestore
import
Location
from
cms.djangoapps.models.settings.course_details
import
(
CourseDetails
,
CourseSettingsEncoder
)
from
cms.djangoapps.models.settings.course_grading
import
CourseGradingModel
from
cms.djangoapps.contentstore.utils
import
get_modulestore
import
copy
from
utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
# YYYY-MM-DDThh:mm:ss.s+/-HH:MM
class
ConvertersTestCase
(
TestCase
):
...
...
@@ -36,8 +42,15 @@ class ConvertersTestCase(TestCase):
self
.
compare_dates
(
converters
.
jsdate_to_time
(
"2013-01-01T00:00:00"
),
converters
.
jsdate_to_time
(
"2012-12-31T23:59:59"
),
datetime
.
timedelta
(
seconds
=
1
))
class
CourseTestCase
(
TestCase
):
class
CourseTestCase
(
ModuleStore
TestCase
):
def
setUp
(
self
):
"""
These tests need a user in the DB so that the django Test Client
can log them in.
They inherit from the ModuleStoreTestCase class so that the mongodb collection
will be cleared out before each test case execution and deleted
afterwards.
"""
uname
=
'testuser'
email
=
'test+courses@edx.org'
password
=
'foo'
...
...
@@ -52,36 +65,15 @@ class CourseTestCase(TestCase):
self
.
user
.
is_staff
=
True
self
.
user
.
save
()
# Flush and initialize the module store
# It needs the templates because it creates new records
# by cloning from the template.
# Note that if your test module gets in some weird state
# (though it shouldn't), do this manually
# from the bash shell to drop it:
# $ mongo test_xmodule --eval "db.dropDatabase()"
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
xmodule
.
modulestore
.
django
.
modulestore
()
.
collection
.
drop
()
xmodule
.
templates
.
update_templates
()
self
.
client
=
Client
()
self
.
client
.
login
(
username
=
uname
,
password
=
password
)
self
.
course_data
=
{
'template'
:
'i4x://edx/templates/course/Empty'
,
'org'
:
'MITx'
,
'number'
:
'999'
,
'display_name'
:
'Robot Super Course'
,
}
self
.
course_location
=
Location
(
'i4x'
,
'MITx'
,
'999'
,
'course'
,
'Robot_Super_Course'
)
self
.
create_course
()
def
tearDown
(
self
):
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
xmodule
.
modulestore
.
django
.
modulestore
()
.
collection
.
drop
()
def
create_course
(
self
):
"""Create new course"""
self
.
client
.
post
(
reverse
(
'create_new_course'
),
self
.
course_data
)
t
=
'i4x://edx/templates/course/Empty'
o
=
'MITx'
n
=
'999'
dn
=
'Robot Super Course'
self
.
course_location
=
Location
(
'i4x'
,
o
,
n
,
'course'
,
'Robot_Super_Course'
)
CourseFactory
.
create
(
template
=
t
,
org
=
o
,
number
=
n
,
display_name
=
dn
)
class
CourseDetailsTestCase
(
CourseTestCase
):
def
test_virgin_fetch
(
self
):
...
...
@@ -145,7 +137,6 @@ class CourseDetailsViewTest(CourseTestCase):
return
datetime
.
isoformat
(
"T"
)
else
:
return
None
def
test_update_and_fetch
(
self
):
details
=
CourseDetails
.
fetch
(
self
.
course_location
)
...
...
@@ -271,5 +262,3 @@ class CourseGradingTest(CourseTestCase):
test_grader
.
graders
[
1
][
'drop_count'
]
=
test_grader
.
graders
[
1
]
.
get
(
'drop_count'
)
+
1
altered_grader
=
CourseGradingModel
.
update_grader_from_json
(
test_grader
.
course_location
,
test_grader
.
graders
[
1
])
self
.
assertDictEqual
(
test_grader
.
graders
[
1
],
altered_grader
,
"drop_count[1] + 2"
)
cms/djangoapps/contentstore/tests/tests.py
View file @
fde6d1ba
...
...
@@ -11,8 +11,6 @@ import json
from
fs.osfs
import
OSFS
import
copy
from
student.models
import
Registration
from
django.contrib.auth.models
import
User
from
cms.djangoapps.contentstore.utils
import
get_modulestore
from
xmodule.modulestore
import
Location
...
...
@@ -29,22 +27,7 @@ from xmodule.course_module import CourseDescriptor
from
xmodule.seq_module
import
SequenceDescriptor
from
xmodule.modulestore.tests.factories
import
CourseFactory
,
ItemFactory
from
.utils
import
CmsTestCase
def
parse_json
(
response
):
"""Parse response, which is assumed to be json"""
return
json
.
loads
(
response
.
content
)
def
user
(
email
):
"""look up a user by email"""
return
User
.
objects
.
get
(
email
=
email
)
def
registration
(
email
):
"""look up registration object by email"""
return
Registration
.
objects
.
get
(
user__email
=
email
)
from
utils
import
ModuleStoreTestCase
,
parse_json
,
user
,
registration
class
ContentStoreTestCase
(
TestCase
):
def
_login
(
self
,
email
,
pw
):
...
...
cms/djangoapps/contentstore/tests/utils.py
View file @
fde6d1ba
from
django.test
import
TestCase
from
xmodule.modulestore.django
import
modulestore
,
_MODULESTORES
import
json
from
student.models
import
Registration
from
django.contrib.auth.models
import
User
import
xmodule.modulestore.django
from
xmodule.templates
import
update_templates
# Subclass TestCase and use to initialize the contentstore
class
Cms
TestCase
(
TestCase
):
class
ModuleStore
TestCase
(
TestCase
):
""" Subclass for any test case that uses the mongodb
module store. This clears it out before running the TestCase
and reinitilizes it with the templates afterwards. """
def
_pre_setup
(
self
):
super
(
Cms
TestCase
,
self
)
.
_pre_setup
()
super
(
ModuleStore
TestCase
,
self
)
.
_pre_setup
()
# Flush and initialize the module store
# It needs the templates because it creates new records
# by cloning from the template.
...
...
@@ -17,16 +22,27 @@ class CmsTestCase(TestCase):
# (though it shouldn't), do this manually
# from the bash shell to drop it:
# $ mongo test_xmodule --eval "db.dropDatabase()"
_MODULESTORES
=
{}
modulestore
()
.
collection
.
drop
()
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
xmodule
.
modulestore
.
django
.
modulestore
()
.
collection
.
drop
()
update_templates
()
def
_post_teardown
(
self
):
# Make sure you flush out the test modulestore after the end
# of the last test because otherwise on the next run
# cms/djangoapps/contentstore/__init__.py
# update_templates() will try to update the templates
# via upsert and it sometimes seems to be messing things up.
_MODULESTORES
=
{}
modulestore
()
.
collection
.
drop
()
super
(
CmsTestCase
,
self
)
.
_post_teardown
()
\ No newline at end of file
# of the last test so the collection will be deleted.
# Otherwise there will be lingering collections leftover
# from executing the tests.
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
xmodule
.
modulestore
.
django
.
modulestore
()
.
collection
.
drop
()
super
(
ModuleStoreTestCase
,
self
)
.
_post_teardown
()
def
parse_json
(
response
):
"""Parse response, which is assumed to be json"""
return
json
.
loads
(
response
.
content
)
def
user
(
email
):
"""look up a user by email"""
return
User
.
objects
.
get
(
email
=
email
)
def
registration
(
email
):
"""look up registration object by email"""
return
Registration
.
objects
.
get
(
user__email
=
email
)
cms/djangoapps/contentstore/views.py
View file @
fde6d1ba
...
...
@@ -1240,6 +1240,11 @@ def edge(request):
@login_required
@expect_json
def
create_new_course
(
request
):
# This logic is repeated in xmodule/modulestore/tests/factories.py
# so if you change anything here, you need to also change it there.
# TODO: write a test that creates two courses, one with the factory and
# the other with this method, then compare them to make sure they are
# equivalent.
template
=
Location
(
request
.
POST
[
'template'
])
org
=
request
.
POST
.
get
(
'org'
)
number
=
request
.
POST
.
get
(
'number'
)
...
...
@@ -1289,8 +1294,11 @@ def initialize_course_tabs(course):
# at least a list populated with the minimal times
# @TODO: I don't like the fact that the presentation tier is away of these data related constraints, let's find a better
# place for this. Also rather than using a simple list of dictionaries a nice class model would be helpful here
course
.
tabs
=
[{
"type"
:
"courseware"
},
{
"type"
:
"course_info"
,
"name"
:
"Course Info"
},
# This logic is repeated in xmodule/modulestore/tests/factories.py
# so if you change anything here, you need to also change it there.
course
.
tabs
=
[{
"type"
:
"courseware"
},
{
"type"
:
"course_info"
,
"name"
:
"Course Info"
},
{
"type"
:
"discussion"
,
"name"
:
"Discussion"
},
{
"type"
:
"wiki"
,
"name"
:
"Wiki"
},
{
"type"
:
"progress"
,
"name"
:
"Progress"
}]
...
...
common/lib/xmodule/xmodule/modulestore/tests/factories.py
View file @
fde6d1ba
from
factory
import
Factory
# from datetime import datetime
from
time
import
gmtime
from
uuid
import
uuid4
from
xmodule.modulestore
import
Location
...
...
@@ -22,7 +21,8 @@ class XModuleCourseFactory(Factory):
@classmethod
def
_create
(
cls
,
target_class
,
*
args
,
**
kwargs
):
# This logic was taken from the create_new_course method in
# cms/djangoapps/contentstore/views.py
template
=
Location
(
'i4x'
,
'edx'
,
'templates'
,
'course'
,
'Empty'
)
org
=
kwargs
.
get
(
'org'
)
number
=
kwargs
.
get
(
'number'
)
...
...
@@ -41,6 +41,7 @@ class XModuleCourseFactory(Factory):
new_course
.
metadata
[
'data_dir'
]
=
uuid4
()
.
hex
new_course
.
metadata
[
'start'
]
=
stringify_time
(
gmtime
())
new_course
.
tabs
=
[{
"type"
:
"courseware"
},
{
"type"
:
"course_info"
,
"name"
:
"Course Info"
},
{
"type"
:
"discussion"
,
"name"
:
"Discussion"
},
...
...
@@ -114,4 +115,4 @@ class ItemFactory(XModuleItemFactory):
parent_location
=
'i4x://MITx/999/course/Robot_Super_Course'
template
=
'i4x://edx/templates/chapter/Empty'
display_name
=
'Section One'
\ No newline at end of file
display_name
=
'Section One'
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