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
e69a0731
Commit
e69a0731
authored
Feb 11, 2013
by
Ned Batchelder
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add a test for the Python in schemaresponse, and refactor the tests while I was in there.
parent
0c47f1e0
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
171 additions
and
30 deletions
+171
-30
common/test/data/embedded_python/course.xml
+1
-0
common/test/data/embedded_python/course/2013_Spring.xml
+95
-0
common/test/data/embedded_python/roots/2013_Spring.xml
+1
-0
lms/djangoapps/courseware/tests/tests.py
+74
-30
No files found.
common/test/data/embedded_python/course.xml
0 → 100644
View file @
e69a0731
<course
org=
"edX"
course=
"embedded_python"
url_name=
"2013_Spring"
/>
common/test/data/embedded_python/course/2013_Spring.xml
0 → 100644
View file @
e69a0731
<course>
<chapter
url_name=
"GradedChapter"
>
<vertical
url_name=
"Homework1"
>
<problem
url_name=
"H1P1"
>
<schematicresponse><center><schematic
height=
"500"
width=
"600"
parts=
"g,n,s"
analyses=
"dc,tran"
submit_analyses=
"{"tran":[["Z",0.0000004,0.0000009,0.0000014,0.0000019,0.0000024,0.0000029,0.0000034,0.000039]]}"
initial_value=
"[["w",[112,96,128,96]],["w",[256,96,240,96]],["w",[192,96,240,96]],["s",[240,96,0],{"color":"cyan","offset":"","plot offset":"0","_json_":3},["Z"]],["w",[32,224,192,224]],["w",[96,48,192,48]],["L",[256,96,3],{"label":"Z","_json_":6},["Z"]],["r",[192,48,0],{"name":"Rpullup","r":"10K","_json_":7},["1","Z"]],["w",[32,144,32,192]],["w",[32,224,32,192]],["w",[48,192,32,192]],["w",[32,96,32,144]],["w",[48,144,32,144]],["w",[32,48,32,96]],["w",[48,96,32,96]],["w",[32,48,48,48]],["g",[32,224,0],{"_json_":16},["0"]],["v",[96,192,1],{"name":"VC","value":"square(3,0,250K)","_json_":17},["C","0"]],["v",[96,144,1],{"name":"VB","value":"square(3,0,500K)","_json_":18},["B","0"]],["v",[96,96,1],{"name":"VA","value":"square(3,0,1000K)","_json_":19},["A","0"]],["v",[96,48,1],{"name":"Vpwr","value":"dc(3)","_json_":20},["1","0"]],["L",[96,96,2],{"label":"A","_json_":21},["A"]],["w",[96,96,104,96]],["L",[96,144,2],{"label":"B","_json_":23},["B"]],["w",[96,144,104,144]],["L",[96,192,2],{"label":"C","_json_":25},["C"]],["w",[96,192,104,192]],["w",[192,96,192,112]],["s",[112,96,0],{"color":"red","offset":"15","plot offset":"0","_json_":28},["A"]],["w",[104,96,112,96]],["s",[112,144,0],{"color":"green","offset":"10","plot offset":"0","_json_":30},["B"]],["w",[104,144,112,144]],["w",[128,144,112,144]],["s",[112,192,0],{"color":"blue","offset":"5","plot offset":"0","_json_":33},["C"]],["w",[104,192,112,192]],["w",[128,192,112,192]],["view",0,0,2,"5","10","10MEG",null,"100","4us"]]"
/></center><answer
type=
"loncapa/python"
>
# for a schematic response, submission[i] is the json representation
# of the diagram and analysis results for the i-th schematic tag
def get_tran(json,signal):
for element in json:
if element[0] == 'transient':
return element[1].get(signal,[])
return []
def get_value(at,output):
for (t,v) in output:
if at == t: return v
return None
output = get_tran(submission[0],'Z')
okay = True
# output should be 1, 1, 1, 1, 1, 0, 0, 0
if get_value(0.0000004,output)
<
2.7: okay = False;
if get_value(0.0000009,output)
<
2.7: okay = False;
if get_value(0.0000014,output)
<
2.7: okay = False;
if get_value(0.0000019,output)
<
2.7: okay = False;
if get_value(0.0000024,output)
<
2.7: okay = False;
if get_value(0.0000029,output)
>
0.25: okay = False;
if get_value(0.0000034,output)
>
0.25: okay = False;
if get_value(0.0000039,output)
>
0.25: okay = False;
correct = ['correct' if okay else 'incorrect']
</answer></schematicresponse>
</problem>
</vertical>
<!--
<videosequence url_name="Homework2">
<vertical url_name="Homework2Inner">
<problem url_name="H2P1">
<optionresponse>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
</optionresponse>
</problem>
<problem url_name="H2P2">
<optionresponse>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
</optionresponse>
</problem>
</vertical>
</videosequence>
<videosequence url_name="Homework3">
<vertical url_name="Homework3Inner">
<problem url_name="H3P1">
<optionresponse>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
</optionresponse>
</problem>
<problem url_name="H3P2">
<optionresponse>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
</optionresponse>
</problem>
</vertical>
</videosequence>
<problem url_name="FinalQuestion">
<optionresponse>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
<optioninput options="('Correct', 'Incorrect')" correct="Correct"></optioninput>
</optionresponse>
</problem>
-->
</chapter>
</course>
common/test/data/embedded_python/roots/2013_Spring.xml
0 → 100644
View file @
e69a0731
<course
org=
"edX"
course=
"embedded_python"
url_name=
"2013_Spring"
/>
lms/djangoapps/courseware/tests/tests.py
View file @
e69a0731
...
...
@@ -372,6 +372,7 @@ class TestCoursesLoadTestCase_XmlModulestore(PageLoaderTestCase):
'''Check that all pages in test courses load properly from XML'''
def
setUp
(
self
):
super
(
TestCoursesLoadTestCase_XmlModulestore
,
self
)
.
setUp
()
self
.
setup_viewtest_user
()
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
...
...
@@ -390,6 +391,7 @@ class TestCoursesLoadTestCase_MongoModulestore(PageLoaderTestCase):
'''Check that all pages in test courses load properly from Mongo'''
def
setUp
(
self
):
super
(
TestCoursesLoadTestCase_MongoModulestore
,
self
)
.
setUp
()
self
.
setup_viewtest_user
()
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
modulestore
()
.
collection
.
drop
()
...
...
@@ -479,9 +481,6 @@ class TestDraftModuleStore(TestCase):
class
TestViewAuth
(
LoginEnrollmentTestCase
):
"""Check that view authentication works properly"""
# NOTE: setUpClass() runs before override_settings takes effect, so
# can't do imports there without manually hacking settings.
def
setUp
(
self
):
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
...
...
@@ -804,38 +803,61 @@ class TestViewAuth(LoginEnrollmentTestCase):
@override_settings
(
MODULESTORE
=
TEST_DATA_XML_MODULESTORE
)
class
Test
CourseGrader
(
LoginEnrollmentTestCase
):
class
Test
SubmittingProblems
(
LoginEnrollmentTestCase
):
"""Check that a course gets graded properly"""
# NOTE: setUpClass() runs before override_settings takes effect, so
# can't do imports there without manually hacking settings.
# Subclasses should specify the course slug
course_slug
=
"UNKNOWN"
course_when
=
"UNKNOWN"
def
setUp
(
self
):
xmodule
.
modulestore
.
django
.
_MODULESTORES
=
{}
self
.
graded_course
=
modulestore
()
.
get_course
(
"edX/graded/2012_Fall"
)
course_name
=
"edX/
%
s/
%
s"
%
(
self
.
course_slug
,
self
.
course_when
)
self
.
course
=
modulestore
()
.
get_course
(
course_name
)
assert
self
.
course
,
"Couldn't load course
%
r"
%
course_name
# create a test student
self
.
student
=
'view@test.com'
self
.
password
=
'foo'
self
.
create_account
(
'u1'
,
self
.
student
,
self
.
password
)
self
.
activate_user
(
self
.
student
)
self
.
enroll
(
self
.
graded_
course
)
self
.
enroll
(
self
.
course
)
self
.
student_user
=
get_user
(
self
.
student
)
self
.
factory
=
RequestFactory
()
def
problem_location
(
self
,
problem_url_name
):
return
"i4x://edX/{}/problem/{}"
.
format
(
self
.
course_slug
,
problem_url_name
)
def
modx_url
(
self
,
problem_location
,
dispatch
):
return
reverse
(
'modx_dispatch'
,
kwargs
=
{
'course_id'
:
self
.
course
.
id
,
'location'
:
problem_location
,
'dispatch'
:
dispatch
,
}
)
class
TestCourseGrader
(
TestSubmittingProblems
):
"""Check that a course gets graded properly"""
course_slug
=
"graded"
course_when
=
"2012_Fall"
def
get_grade_summary
(
self
):
'''calls grades.grade for current user and course'''
model_data_cache
=
ModelDataCache
.
cache_for_descriptor_descendents
(
self
.
graded_course
.
id
,
self
.
student_user
,
self
.
graded_
course
)
self
.
course
.
id
,
self
.
student_user
,
self
.
course
)
fake_request
=
self
.
factory
.
get
(
reverse
(
'progress'
,
kwargs
=
{
'course_id'
:
self
.
graded_
course
.
id
}))
kwargs
=
{
'course_id'
:
self
.
course
.
id
}))
return
grades
.
grade
(
self
.
student_user
,
fake_request
,
self
.
graded_
course
,
model_data_cache
)
self
.
course
,
model_data_cache
)
def
get_homework_scores
(
self
):
'''get scores for homeworks'''
...
...
@@ -844,10 +866,10 @@ class TestCourseGrader(LoginEnrollmentTestCase):
def
get_progress_summary
(
self
):
'''return progress summary structure for current user and course'''
model_data_cache
=
ModelDataCache
.
cache_for_descriptor_descendents
(
self
.
graded_course
.
id
,
self
.
student_user
,
self
.
graded_
course
)
self
.
course
.
id
,
self
.
student_user
,
self
.
course
)
fake_request
=
self
.
factory
.
get
(
reverse
(
'progress'
,
kwargs
=
{
'course_id'
:
self
.
graded_
course
.
id
}))
kwargs
=
{
'course_id'
:
self
.
course
.
id
}))
progress_summary
=
grades
.
progress_summary
(
self
.
student_user
,
fake_request
,
...
...
@@ -868,13 +890,8 @@ class TestCourseGrader(LoginEnrollmentTestCase):
input_i4x-edX-graded-problem-H1P3_2_1
input_i4x-edX-graded-problem-H1P3_2_2
"""
problem_location
=
"i4x://edX/graded/problem/
%
s"
%
problem_url_name
modx_url
=
reverse
(
'modx_dispatch'
,
kwargs
=
{
'course_id'
:
self
.
graded_course
.
id
,
'location'
:
problem_location
,
'dispatch'
:
'problem_check'
,
})
problem_location
=
self
.
problem_location
(
problem_url_name
)
modx_url
=
self
.
modx_url
(
problem_location
,
'problem_check'
)
resp
=
self
.
client
.
post
(
modx_url
,
{
'input_i4x-edX-graded-problem-
%
s_2_1'
%
problem_url_name
:
responses
[
0
],
'input_i4x-edX-graded-problem-
%
s_2_2'
%
problem_url_name
:
responses
[
1
],
...
...
@@ -884,19 +901,10 @@ class TestCourseGrader(LoginEnrollmentTestCase):
return
resp
def
problem_location
(
self
,
problem_url_name
):
'''Get location string for problem, assuming hardcoded course_id'''
return
"i4x://edX/graded/problem/{0}"
.
format
(
problem_url_name
)
def
reset_question_answer
(
self
,
problem_url_name
):
'''resets specified problem for current user'''
problem_location
=
self
.
problem_location
(
problem_url_name
)
modx_url
=
reverse
(
'modx_dispatch'
,
kwargs
=
{
'course_id'
:
self
.
graded_course
.
id
,
'location'
:
problem_location
,
'dispatch'
:
'problem_reset'
,
})
modx_url
=
self
.
modx_url
(
problem_location
,
'problem_reset'
)
resp
=
self
.
client
.
post
(
modx_url
)
return
resp
...
...
@@ -962,3 +970,39 @@ class TestCourseGrader(LoginEnrollmentTestCase):
# Now we answer the final question (worth half of the grade)
self
.
submit_question_answer
(
'FinalQuestion'
,
[
'Correct'
,
'Correct'
])
self
.
check_grade_percent
(
1.0
)
# Hooray! We got 100%
@override_settings
(
MODULESTORE
=
TEST_DATA_XML_MODULESTORE
)
class
TestSchematicResponse
(
TestSubmittingProblems
):
"""Check that a course gets graded properly"""
course_slug
=
"embedded_python"
course_when
=
"2013_Spring"
def
submit_question_answer
(
self
,
problem_url_name
,
responses
):
"""Particular to the embedded_python/2013_Spring course."""
problem_location
=
self
.
problem_location
(
problem_url_name
)
modx_url
=
self
.
modx_url
(
problem_location
,
'problem_check'
)
resp
=
self
.
client
.
post
(
modx_url
,
{
'input_i4x-edX-embedded_python-problem-{0}_2_1'
.
format
(
problem_url_name
):
json
.
dumps
(
responses
),
})
print
"modx_url"
,
modx_url
,
"responses"
,
responses
print
"resp"
,
resp
return
resp
def
test_get_graded
(
self
):
resp
=
self
.
submit_question_answer
(
'H1P1'
,
[[
'transient'
,
{
'Z'
:
[
[
0.0000004
,
2.8
],
[
0.0000009
,
2.8
],
[
0.0000014
,
2.8
],
[
0.0000019
,
2.8
],
[
0.0000024
,
2.8
],
[
0.0000029
,
0.2
],
[
0.0000034
,
0.2
],
[
0.0000039
,
0.2
]
]}]]
)
respdata
=
json
.
loads
(
resp
.
content
)
self
.
assertEqual
(
respdata
[
'success'
],
'correct'
)
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