Commit ff1df569 by Ned Batchelder

Refactor submitting problems so we don't need custom code for each test.

parent 33abe54e
...@@ -841,6 +841,23 @@ class TestSubmittingProblems(LoginEnrollmentTestCase): ...@@ -841,6 +841,23 @@ class TestSubmittingProblems(LoginEnrollmentTestCase):
} }
) )
def submit_question_answer(self, problem_url_name, responses):
"""
Submit answers to a question.
Responses is a dict mapping problem ids (not sure of the right term)
to answers:
{'2_1': 'Correct', '2_2': 'Incorrect'}
"""
problem_location = self.problem_location(problem_url_name)
modx_url = self.modx_url(problem_location, 'problem_check')
answer_key_prefix = 'input_i4x-edX-{}-problem-{}_'.format(self.course_slug, problem_url_name)
resp = self.client.post(modx_url,
{ (answer_key_prefix + k): v for k,v in responses.items() }
)
return resp
def reset_question_answer(self, problem_url_name): def reset_question_answer(self, problem_url_name):
'''resets specified problem for current user''' '''resets specified problem for current user'''
problem_location = self.problem_location(problem_url_name) problem_location = self.problem_location(problem_url_name)
...@@ -889,22 +906,6 @@ class TestCourseGrader(TestSubmittingProblems): ...@@ -889,22 +906,6 @@ class TestCourseGrader(TestSubmittingProblems):
grade_summary = self.get_grade_summary() grade_summary = self.get_grade_summary()
self.assertEqual(grade_summary['percent'], percent) self.assertEqual(grade_summary['percent'], percent)
def submit_question_answer(self, problem_url_name, responses):
"""
The field names of a problem are hard to determine. This method only works
for the problems used in the edX/graded course, which has fields named in the
following form:
input_i4x-edX-graded-problem-H1P3_2_1
input_i4x-edX-graded-problem-H1P3_2_2
"""
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],
})
return resp
def test_get_graded(self): def test_get_graded(self):
#### Check that the grader shows we have 0% in the course #### Check that the grader shows we have 0% in the course
self.check_grade_percent(0) self.check_grade_percent(0)
...@@ -922,27 +923,27 @@ class TestCourseGrader(TestSubmittingProblems): ...@@ -922,27 +923,27 @@ class TestCourseGrader(TestSubmittingProblems):
return [s.earned for s in hw_section['scores']] return [s.earned for s in hw_section['scores']]
# Only get half of the first problem correct # Only get half of the first problem correct
self.submit_question_answer('H1P1', ['Correct', 'Incorrect']) self.submit_question_answer('H1P1', {'2_1': 'Correct', '2_2': 'Incorrect'})
self.check_grade_percent(0.06) self.check_grade_percent(0.06)
self.assertEqual(earned_hw_scores(), [1.0, 0, 0]) # Order matters self.assertEqual(earned_hw_scores(), [1.0, 0, 0]) # Order matters
self.assertEqual(score_for_hw('Homework1'), [1.0, 0.0]) self.assertEqual(score_for_hw('Homework1'), [1.0, 0.0])
# Get both parts of the first problem correct # Get both parts of the first problem correct
self.reset_question_answer('H1P1') self.reset_question_answer('H1P1')
self.submit_question_answer('H1P1', ['Correct', 'Correct']) self.submit_question_answer('H1P1', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.13) self.check_grade_percent(0.13)
self.assertEqual(earned_hw_scores(), [2.0, 0, 0]) self.assertEqual(earned_hw_scores(), [2.0, 0, 0])
self.assertEqual(score_for_hw('Homework1'), [2.0, 0.0]) self.assertEqual(score_for_hw('Homework1'), [2.0, 0.0])
# This problem is shown in an ABTest # This problem is shown in an ABTest
self.submit_question_answer('H1P2', ['Correct', 'Correct']) self.submit_question_answer('H1P2', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.25) self.check_grade_percent(0.25)
self.assertEqual(earned_hw_scores(), [4.0, 0.0, 0]) self.assertEqual(earned_hw_scores(), [4.0, 0.0, 0])
self.assertEqual(score_for_hw('Homework1'), [2.0, 2.0]) self.assertEqual(score_for_hw('Homework1'), [2.0, 2.0])
# This problem is hidden in an ABTest. # This problem is hidden in an ABTest.
# Getting it correct doesn't change total grade # Getting it correct doesn't change total grade
self.submit_question_answer('H1P3', ['Correct', 'Correct']) self.submit_question_answer('H1P3', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.25) self.check_grade_percent(0.25)
self.assertEqual(score_for_hw('Homework1'), [2.0, 2.0]) self.assertEqual(score_for_hw('Homework1'), [2.0, 2.0])
...@@ -951,21 +952,21 @@ class TestCourseGrader(TestSubmittingProblems): ...@@ -951,21 +952,21 @@ class TestCourseGrader(TestSubmittingProblems):
# This problem is also weighted to be 4 points (instead of default of 2) # This problem is also weighted to be 4 points (instead of default of 2)
# If the problem was unweighted the percent would have been 0.38 so we # If the problem was unweighted the percent would have been 0.38 so we
# know it works. # know it works.
self.submit_question_answer('H2P1', ['Correct', 'Correct']) self.submit_question_answer('H2P1', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.42) self.check_grade_percent(0.42)
self.assertEqual(earned_hw_scores(), [4.0, 4.0, 0]) self.assertEqual(earned_hw_scores(), [4.0, 4.0, 0])
# Third homework # Third homework
self.submit_question_answer('H3P1', ['Correct', 'Correct']) self.submit_question_answer('H3P1', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.42) # Score didn't change self.check_grade_percent(0.42) # Score didn't change
self.assertEqual(earned_hw_scores(), [4.0, 4.0, 2.0]) self.assertEqual(earned_hw_scores(), [4.0, 4.0, 2.0])
self.submit_question_answer('H3P2', ['Correct', 'Correct']) self.submit_question_answer('H3P2', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(0.5) # Now homework2 dropped. Score changes self.check_grade_percent(0.5) # Now homework2 dropped. Score changes
self.assertEqual(earned_hw_scores(), [4.0, 4.0, 4.0]) self.assertEqual(earned_hw_scores(), [4.0, 4.0, 4.0])
# Now we answer the final question (worth half of the grade) # Now we answer the final question (worth half of the grade)
self.submit_question_answer('FinalQuestion', ['Correct', 'Correct']) self.submit_question_answer('FinalQuestion', {'2_1': 'Correct', '2_2': 'Correct'})
self.check_grade_percent(1.0) # Hooray! We got 100% self.check_grade_percent(1.0) # Hooray! We got 100%
...@@ -976,44 +977,39 @@ class TestSchematicResponse(TestSubmittingProblems): ...@@ -976,44 +977,39 @@ class TestSchematicResponse(TestSubmittingProblems):
course_slug = "embedded_python" course_slug = "embedded_python"
course_when = "2013_Spring" course_when = "2013_Spring"
def submit_question_answer(self, problem_url_name, responses): def test_schematic(self):
"""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),
})
return resp
def test_get_graded(self):
resp = self.submit_question_answer('schematic_problem', resp = self.submit_question_answer('schematic_problem',
[['transient', {'Z': [ { '2_1': json.dumps(
[0.0000004, 2.8], [['transient', {'Z': [
[0.0000009, 2.8], [0.0000004, 2.8],
[0.0000014, 2.8], [0.0000009, 2.8],
[0.0000019, 2.8], [0.0000014, 2.8],
[0.0000024, 2.8], [0.0000019, 2.8],
[0.0000029, 0.2], [0.0000024, 2.8],
[0.0000034, 0.2], [0.0000029, 0.2],
[0.0000039, 0.2] [0.0000034, 0.2],
]}]] [0.0000039, 0.2]
) ]}]]
)
})
respdata = json.loads(resp.content) respdata = json.loads(resp.content)
self.assertEqual(respdata['success'], 'correct') self.assertEqual(respdata['success'], 'correct')
self.reset_question_answer('schematic_problem') self.reset_question_answer('schematic_problem')
resp = self.submit_question_answer('schematic_problem', resp = self.submit_question_answer('schematic_problem',
[['transient', {'Z': [ { '2_1': json.dumps(
[0.0000004, 2.8], [['transient', {'Z': [
[0.0000009, 0.0], # wrong. [0.0000004, 2.8],
[0.0000014, 2.8], [0.0000009, 0.0], # wrong.
[0.0000019, 2.8], [0.0000014, 2.8],
[0.0000024, 2.8], [0.0000019, 2.8],
[0.0000029, 0.2], [0.0000024, 2.8],
[0.0000034, 0.2], [0.0000029, 0.2],
[0.0000039, 0.2] [0.0000034, 0.2],
]}]] [0.0000039, 0.2]
) ]}]]
)
})
respdata = json.loads(resp.content) respdata = json.loads(resp.content)
self.assertEqual(respdata['success'], 'incorrect') self.assertEqual(respdata['success'], 'incorrect')
...@@ -1025,22 +1021,13 @@ class TestCustomResponseCfnFunction(TestSubmittingProblems): ...@@ -1025,22 +1021,13 @@ class TestCustomResponseCfnFunction(TestSubmittingProblems):
course_slug = "embedded_python" course_slug = "embedded_python"
course_when = "2013_Spring" course_when = "2013_Spring"
def submit_question_answer(self, problem_url_name, responses): def test_check_function(self):
"""Particular to the embedded_python/2013_Spring course.""" resp = self.submit_question_answer('cfn_problem', {'2_1': "0, 1, 2, 3, 4, 5, 'Outside of loop', 6"})
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): responses,
})
return resp
def test_get_graded(self):
resp = self.submit_question_answer('cfn_problem', "0, 1, 2, 3, 4, 5, 'Outside of loop', 6")
respdata = json.loads(resp.content) respdata = json.loads(resp.content)
self.assertEqual(respdata['success'], 'correct') self.assertEqual(respdata['success'], 'correct')
self.reset_question_answer('cfn_problem') self.reset_question_answer('cfn_problem')
resp = self.submit_question_answer('cfn_problem', "xyzzy!") resp = self.submit_question_answer('cfn_problem', {'2_1': "xyzzy!"})
respdata = json.loads(resp.content) respdata = json.loads(resp.content)
self.assertEqual(respdata['success'], 'incorrect') self.assertEqual(respdata['success'], 'incorrect')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment