Commit 43d8574e by Will Daly

Refactored use of test_system in xmodule unit tests

so that a new one is created for each test
parent 73281a43
...@@ -28,21 +28,35 @@ open_ended_grading_interface = { ...@@ -28,21 +28,35 @@ open_ended_grading_interface = {
'grading_controller' : 'grading_controller' 'grading_controller' : 'grading_controller'
} }
test_system = ModuleSystem(
ajax_url='courses/course_id/modx/a_location', def test_system():
track_function=Mock(), """
get_module=Mock(), Construct a test ModuleSystem instance.
# "render" to just the context...
render_template=lambda template, context: str(context), By default, the render_template() method simply returns
replace_urls=lambda html: str(html), the context it is passed as a string.
user=Mock(is_staff=False), You can override this behavior by monkey patching:
filestore=Mock(),
debug=True, system = test_system()
xqueue={'interface': None, 'callback_url': '/', 'default_queuename': 'testqueue', 'waittime': 10}, system.render_template = my_render_func
node_path=os.environ.get("NODE_PATH", "/usr/local/lib/node_modules"),
anonymous_student_id='student', where my_render_func is a function of the form
open_ended_grading_interface= open_ended_grading_interface my_render_func(template, context)
) """
return ModuleSystem(
ajax_url='courses/course_id/modx/a_location',
track_function=Mock(),
get_module=Mock(),
render_template=lambda template, context: str(context),
replace_urls=lambda html: str(html),
user=Mock(is_staff=False),
filestore=Mock(),
debug=True,
xqueue={'interface': None, 'callback_url': '/', 'default_queuename': 'testqueue', 'waittime': 10},
node_path=os.environ.get("NODE_PATH", "/usr/local/lib/node_modules"),
anonymous_student_id='student',
open_ended_grading_interface= open_ended_grading_interface
)
class ModelsTest(unittest.TestCase): class ModelsTest(unittest.TestCase):
......
...@@ -108,7 +108,7 @@ class CapaFactory(object): ...@@ -108,7 +108,7 @@ class CapaFactory(object):
else: else:
instance_state = None instance_state = None
module = CapaModule(test_system, location, module = CapaModule(test_system(), location,
definition, descriptor, definition, descriptor,
instance_state, None, metadata=metadata) instance_state, None, metadata=metadata)
...@@ -794,14 +794,8 @@ class CapaModuleTest(unittest.TestCase): ...@@ -794,14 +794,8 @@ class CapaModuleTest(unittest.TestCase):
module.should_show_reset_button = Mock(return_value=show_reset_button) module.should_show_reset_button = Mock(return_value=show_reset_button)
module.should_show_save_button = Mock(return_value=show_save_button) module.should_show_save_button = Mock(return_value=show_save_button)
# Mock the system rendering function (reset when we're done) # Mock the system rendering function
old_render_func = test_system.render_template module.system.render_template = Mock(return_value="<div>Test Template HTML</div>")
test_system.render_template = Mock(return_value="<div>Test Template HTML</div>")
def cleanup_func():
test_system.render_template = old_render_func
self.addCleanup(cleanup_func)
# Patch the capa problem's HTML rendering # Patch the capa problem's HTML rendering
with patch('capa.capa_problem.LoncapaProblem.get_html') as mock_html: with patch('capa.capa_problem.LoncapaProblem.get_html') as mock_html:
...@@ -817,7 +811,7 @@ class CapaModuleTest(unittest.TestCase): ...@@ -817,7 +811,7 @@ class CapaModuleTest(unittest.TestCase):
self.assertEqual(html, "<div>Test Template HTML</div>") self.assertEqual(html, "<div>Test Template HTML</div>")
# Check the rendering context # Check the rendering context
render_args,_ = test_system.render_template.call_args render_args,_ = module.system.render_template.call_args
self.assertEqual(len(render_args), 2) self.assertEqual(len(render_args), 2)
template_name = render_args[0] template_name = render_args[0]
...@@ -848,25 +842,17 @@ class CapaModuleTest(unittest.TestCase): ...@@ -848,25 +842,17 @@ class CapaModuleTest(unittest.TestCase):
# is asked to render itself as HTML # is asked to render itself as HTML
module.lcp.get_html = Mock(side_effect=Exception("Test")) module.lcp.get_html = Mock(side_effect=Exception("Test"))
# Stub out the test_system rendering function temporarily # Stub out the test_system rendering function
old_render_func = test_system.render_template module.system.render_template = Mock(return_value="<div>Test Template HTML</div>")
test_system.render_template = Mock(return_value="<div>Test Template HTML</div>")
# Turn off DEBUG temporarily
old_debug = test_system.DEBUG
test_system.DEBUG = False
def cleanup_func():
test_system.render_template = old_render_func
test_system.DEBUG = old_debug
self.addCleanup(cleanup_func) # Turn off DEBUG
module.system.DEBUG = False
# Try to render the module with DEBUG turned off # Try to render the module with DEBUG turned off
html = module.get_problem_html() html = module.get_problem_html()
# Check the rendering context # Check the rendering context
render_args,_ = test_system.render_template.call_args render_args,_ = module.system.render_template.call_args
context = render_args[1] context = render_args[1]
self.assertTrue("error" in context['problem']['html']) self.assertTrue("error" in context['problem']['html'])
......
...@@ -54,7 +54,8 @@ class OpenEndedChildTest(unittest.TestCase): ...@@ -54,7 +54,8 @@ class OpenEndedChildTest(unittest.TestCase):
descriptor = Mock() descriptor = Mock()
def setUp(self): def setUp(self):
self.openendedchild = OpenEndedChild(test_system, self.location, self.test_system = test_system()
self.openendedchild = OpenEndedChild(self.test_system, self.location,
self.definition, self.descriptor, self.static_data, self.metadata) self.definition, self.descriptor, self.static_data, self.metadata)
...@@ -69,7 +70,7 @@ class OpenEndedChildTest(unittest.TestCase): ...@@ -69,7 +70,7 @@ class OpenEndedChildTest(unittest.TestCase):
def test_latest_post_assessment_empty(self): def test_latest_post_assessment_empty(self):
answer = self.openendedchild.latest_post_assessment(test_system) answer = self.openendedchild.latest_post_assessment(self.test_system)
self.assertEqual(answer, "") self.assertEqual(answer, "")
...@@ -106,7 +107,7 @@ class OpenEndedChildTest(unittest.TestCase): ...@@ -106,7 +107,7 @@ class OpenEndedChildTest(unittest.TestCase):
post_assessment = "Post assessment" post_assessment = "Post assessment"
self.openendedchild.record_latest_post_assessment(post_assessment) self.openendedchild.record_latest_post_assessment(post_assessment)
self.assertEqual(post_assessment, self.assertEqual(post_assessment,
self.openendedchild.latest_post_assessment(test_system)) self.openendedchild.latest_post_assessment(self.test_system))
def test_get_score(self): def test_get_score(self):
new_answer = "New Answer" new_answer = "New Answer"
...@@ -125,7 +126,7 @@ class OpenEndedChildTest(unittest.TestCase): ...@@ -125,7 +126,7 @@ class OpenEndedChildTest(unittest.TestCase):
def test_reset(self): def test_reset(self):
self.openendedchild.reset(test_system) self.openendedchild.reset(self.test_system)
state = json.loads(self.openendedchild.get_instance_state()) state = json.loads(self.openendedchild.get_instance_state())
self.assertEqual(state['state'], OpenEndedChild.INITIAL) self.assertEqual(state['state'], OpenEndedChild.INITIAL)
...@@ -182,11 +183,13 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -182,11 +183,13 @@ class OpenEndedModuleTest(unittest.TestCase):
descriptor = Mock() descriptor = Mock()
def setUp(self): def setUp(self):
test_system.location = self.location self.test_system = test_system()
self.test_system.location = self.location
self.mock_xqueue = MagicMock() self.mock_xqueue = MagicMock()
self.mock_xqueue.send_to_queue.return_value = (None, "Message") self.mock_xqueue.send_to_queue.return_value = (None, "Message")
test_system.xqueue = {'interface': self.mock_xqueue, 'callback_url': '/', 'default_queuename': 'testqueue', 'waittime': 1} self.test_system.xqueue = {'interface': self.mock_xqueue, 'callback_url': '/', 'default_queuename': 'testqueue', 'waittime': 1}
self.openendedmodule = OpenEndedModule(test_system, self.location, self.openendedmodule = OpenEndedModule(self.test_system, self.location,
self.definition, self.descriptor, self.static_data, self.metadata) self.definition, self.descriptor, self.static_data, self.metadata)
def test_message_post(self): def test_message_post(self):
...@@ -195,7 +198,7 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -195,7 +198,7 @@ class OpenEndedModuleTest(unittest.TestCase):
'grader_id': '1', 'grader_id': '1',
'score': 3} 'score': 3}
qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat) qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat)
student_info = {'anonymous_student_id': test_system.anonymous_student_id, student_info = {'anonymous_student_id': self.test_system.anonymous_student_id,
'submission_time': qtime} 'submission_time': qtime}
contents = { contents = {
'feedback': get['feedback'], 'feedback': get['feedback'],
...@@ -205,7 +208,7 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -205,7 +208,7 @@ class OpenEndedModuleTest(unittest.TestCase):
'student_info': json.dumps(student_info) 'student_info': json.dumps(student_info)
} }
result = self.openendedmodule.message_post(get, test_system) result = self.openendedmodule.message_post(get, self.test_system)
self.assertTrue(result['success']) self.assertTrue(result['success'])
# make sure it's actually sending something we want to the queue # make sure it's actually sending something we want to the queue
self.mock_xqueue.send_to_queue.assert_called_with(body=json.dumps(contents), header=ANY) self.mock_xqueue.send_to_queue.assert_called_with(body=json.dumps(contents), header=ANY)
...@@ -216,7 +219,7 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -216,7 +219,7 @@ class OpenEndedModuleTest(unittest.TestCase):
def test_send_to_grader(self): def test_send_to_grader(self):
submission = "This is a student submission" submission = "This is a student submission"
qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat) qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat)
student_info = {'anonymous_student_id': test_system.anonymous_student_id, student_info = {'anonymous_student_id': self.test_system.anonymous_student_id,
'submission_time': qtime} 'submission_time': qtime}
contents = self.openendedmodule.payload.copy() contents = self.openendedmodule.payload.copy()
contents.update({ contents.update({
...@@ -224,7 +227,7 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -224,7 +227,7 @@ class OpenEndedModuleTest(unittest.TestCase):
'student_response': submission, 'student_response': submission,
'max_score': self.max_score 'max_score': self.max_score
}) })
result = self.openendedmodule.send_to_grader(submission, test_system) result = self.openendedmodule.send_to_grader(submission, self.test_system)
self.assertTrue(result) self.assertTrue(result)
self.mock_xqueue.send_to_queue.assert_called_with(body=json.dumps(contents), header=ANY) self.mock_xqueue.send_to_queue.assert_called_with(body=json.dumps(contents), header=ANY)
...@@ -238,7 +241,7 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -238,7 +241,7 @@ class OpenEndedModuleTest(unittest.TestCase):
} }
get = {'queuekey': "abcd", get = {'queuekey': "abcd",
'xqueue_body': score_msg} 'xqueue_body': score_msg}
self.openendedmodule.update_score(get, test_system) self.openendedmodule.update_score(get, self.test_system)
def update_score_single(self): def update_score_single(self):
self.openendedmodule.new_history_entry("New Entry") self.openendedmodule.new_history_entry("New Entry")
...@@ -261,11 +264,11 @@ class OpenEndedModuleTest(unittest.TestCase): ...@@ -261,11 +264,11 @@ class OpenEndedModuleTest(unittest.TestCase):
} }
get = {'queuekey': "abcd", get = {'queuekey': "abcd",
'xqueue_body': json.dumps(score_msg)} 'xqueue_body': json.dumps(score_msg)}
self.openendedmodule.update_score(get, test_system) self.openendedmodule.update_score(get, self.test_system)
def test_latest_post_assessment(self): def test_latest_post_assessment(self):
self.update_score_single() self.update_score_single()
assessment = self.openendedmodule.latest_post_assessment(test_system) assessment = self.openendedmodule.latest_post_assessment(self.test_system)
self.assertFalse(assessment == '') self.assertFalse(assessment == '')
# check for errors # check for errors
self.assertFalse('errors' in assessment) self.assertFalse('errors' in assessment)
...@@ -336,7 +339,13 @@ class CombinedOpenEndedModuleTest(unittest.TestCase): ...@@ -336,7 +339,13 @@ class CombinedOpenEndedModuleTest(unittest.TestCase):
descriptor = Mock() descriptor = Mock()
def setUp(self): def setUp(self):
self.combinedoe = CombinedOpenEndedV1Module(test_system, self.location, self.definition, self.descriptor, static_data = self.static_data, metadata=self.metadata) self.test_system = test_system()
self.combinedoe = CombinedOpenEndedV1Module(self.test_system,
self.location,
self.definition,
self.descriptor,
static_data = self.static_data,
metadata=self.metadata)
def test_get_tag_name(self): def test_get_tag_name(self):
name = self.combinedoe.get_tag_name("<t>Tag</t>") name = self.combinedoe.get_tag_name("<t>Tag</t>")
......
...@@ -56,6 +56,9 @@ class ConditionalModuleTest(unittest.TestCase): ...@@ -56,6 +56,9 @@ class ConditionalModuleTest(unittest.TestCase):
'''Get a dummy system''' '''Get a dummy system'''
return DummySystem(load_error_modules) return DummySystem(load_error_modules)
def setUp(self):
self.test_system = test_system()
def get_course(self, name): def get_course(self, name):
"""Get a test course by directory name. If there's more than one, error.""" """Get a test course by directory name. If there's more than one, error."""
print "Importing {0}".format(name) print "Importing {0}".format(name)
...@@ -85,14 +88,14 @@ class ConditionalModuleTest(unittest.TestCase): ...@@ -85,14 +88,14 @@ class ConditionalModuleTest(unittest.TestCase):
location = descriptor.location location = descriptor.location
instance_state = instance_states.get(location.category, None) instance_state = instance_states.get(location.category, None)
print "inner_get_module, location=%s, inst_state=%s" % (location, instance_state) print "inner_get_module, location=%s, inst_state=%s" % (location, instance_state)
return descriptor.xmodule_constructor(test_system)(instance_state, shared_state) return descriptor.xmodule_constructor(self.test_system)(instance_state, shared_state)
location = Location(["i4x", "edX", "cond_test", "conditional", "condone"]) location = Location(["i4x", "edX", "cond_test", "conditional", "condone"])
def replace_urls(text, staticfiles_prefix=None, replace_prefix='/static/', course_namespace=None): def replace_urls(text, staticfiles_prefix=None, replace_prefix='/static/', course_namespace=None):
return text return text
test_system.replace_urls = replace_urls self.test_system.replace_urls = replace_urls
test_system.get_module = inner_get_module self.test_system.get_module = inner_get_module
module = inner_get_module(location) module = inner_get_module(location)
print "module: ", module print "module: ", module
......
...@@ -53,13 +53,13 @@ class SelfAssessmentTest(unittest.TestCase): ...@@ -53,13 +53,13 @@ class SelfAssessmentTest(unittest.TestCase):
'skip_basic_checks' : False, 'skip_basic_checks' : False,
} }
self.module = SelfAssessmentModule(test_system, self.location, self.module = SelfAssessmentModule(test_system(), self.location,
self.definition, self.descriptor, self.definition, self.descriptor,
static_data, static_data,
state, metadata=self.metadata) state, metadata=self.metadata)
def test_get_html(self): def test_get_html(self):
html = self.module.get_html(test_system) html = self.module.get_html(self.module.system)
self.assertTrue("This is sample prompt text" in html) self.assertTrue("This is sample prompt text" in html)
def test_self_assessment_flow(self): def test_self_assessment_flow(self):
...@@ -82,10 +82,11 @@ class SelfAssessmentTest(unittest.TestCase): ...@@ -82,10 +82,11 @@ class SelfAssessmentTest(unittest.TestCase):
self.assertEqual(self.module.get_score()['score'], 0) self.assertEqual(self.module.get_score()['score'], 0)
self.module.save_answer({'student_answer': "I am an answer"}, test_system) self.module.save_answer({'student_answer': "I am an answer"},
self.module.system)
self.assertEqual(self.module.state, self.module.ASSESSING) self.assertEqual(self.module.state, self.module.ASSESSING)
self.module.save_assessment(mock_query_dict, test_system) self.module.save_assessment(mock_query_dict, self.module.system)
self.assertEqual(self.module.state, self.module.DONE) self.assertEqual(self.module.state, self.module.DONE)
...@@ -94,7 +95,8 @@ class SelfAssessmentTest(unittest.TestCase): ...@@ -94,7 +95,8 @@ class SelfAssessmentTest(unittest.TestCase):
self.assertEqual(self.module.state, self.module.INITIAL) self.assertEqual(self.module.state, self.module.INITIAL)
# if we now assess as right, skip the REQUEST_HINT state # if we now assess as right, skip the REQUEST_HINT state
self.module.save_answer({'student_answer': 'answer 4'}, test_system) self.module.save_answer({'student_answer': 'answer 4'},
self.module.system)
responses['assessment'] = '1' responses['assessment'] = '1'
self.module.save_assessment(mock_query_dict, test_system) self.module.save_assessment(mock_query_dict, self.module.system)
self.assertEqual(self.module.state, self.module.DONE) self.assertEqual(self.module.state, self.module.DONE)
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