Merge pull request #5293 from edx/usman/tnl388-invalid-xml-in-code-response
If matlab grader sent unparsable response, show error message.
This commit is contained in:
@@ -808,6 +808,7 @@ class MatlabInput(CodeInput):
|
||||
Handle matlab-specific parsing
|
||||
"""
|
||||
_ = self.capa_system.i18n.ugettext
|
||||
|
||||
submitted_msg = _("Submitted. As soon as a response is returned, "
|
||||
"this message will be replaced by that feedback.")
|
||||
self.submitted_msg = submitted_msg
|
||||
@@ -889,9 +890,23 @@ class MatlabInput(CodeInput):
|
||||
|
||||
def _extra_context(self):
|
||||
""" Set up additional context variables"""
|
||||
|
||||
_ = self.capa_system.i18n.ugettext
|
||||
|
||||
queue_msg = self.queue_msg
|
||||
if len(self.queue_msg) > 0: # An empty string cannot be parsed as XML but is okay to include in the template.
|
||||
try:
|
||||
etree.XML(u'<div>{0}</div>'.format(self.queue_msg))
|
||||
except etree.XMLSyntaxError:
|
||||
try:
|
||||
html5lib.parseFragment(self.queue_msg, treebuilder='lxml', namespaceHTMLElements=False)[0]
|
||||
except (IndexError, ValueError):
|
||||
# If neither can parse queue_msg, it contains invalid xml.
|
||||
queue_msg = u"<span>{0}</span>".format(_("Error running code."))
|
||||
|
||||
extra_context = {
|
||||
'queue_len': str(self.queue_len),
|
||||
'queue_msg': self.queue_msg,
|
||||
'queue_msg': queue_msg,
|
||||
'button_enabled': self.button_enabled(),
|
||||
'matlab_editor_js': '{static_url}js/vendor/CodeMirror/octave.js'.format(
|
||||
static_url=self.capa_system.STATIC_URL),
|
||||
|
||||
@@ -26,6 +26,7 @@ import xml.sax.saxutils as saxutils
|
||||
|
||||
from . import test_capa_system
|
||||
from capa import inputtypes
|
||||
from capa.checker import DemoSystem
|
||||
from mock import ANY, patch
|
||||
from pyparsing import ParseException
|
||||
|
||||
@@ -727,6 +728,34 @@ class MatlabTest(unittest.TestCase):
|
||||
received = fromstring(context['queue_msg'])
|
||||
html_tree_equal(received, expected)
|
||||
|
||||
def test_rendering_with_invalid_queue_msg(self):
|
||||
self.the_input.queue_msg = (u"<div class='matlabResponse'><div style='white-space:pre' class='commandWindowOutput'>"
|
||||
u"\nans =\n\n\u0002\n\n</div><ul></ul></div>")
|
||||
context = self.the_input._get_render_context() # pylint: disable=protected-access
|
||||
|
||||
self.maxDiff = None
|
||||
expected = {
|
||||
'STATIC_URL': '/dummy-static/',
|
||||
'id': 'prob_1_2',
|
||||
'value': 'print "good evening"',
|
||||
'status': inputtypes.Status('queued'),
|
||||
'msg': self.the_input.submitted_msg,
|
||||
'mode': self.mode,
|
||||
'rows': self.rows,
|
||||
'cols': self.cols,
|
||||
'queue_msg': "<span>Error running code.</span>",
|
||||
'linenumbers': 'true',
|
||||
'hidden': '',
|
||||
'tabsize': int(self.tabsize),
|
||||
'button_enabled': True,
|
||||
'queue_len': '3',
|
||||
'matlab_editor_js': '/dummy-static/js/vendor/CodeMirror/octave.js',
|
||||
}
|
||||
|
||||
self.assertEqual(context, expected)
|
||||
self.the_input.capa_system.render_template = DemoSystem().render_template
|
||||
self.the_input.get_html() # Should not raise an exception
|
||||
|
||||
def test_matlab_queue_message_allowed_tags(self):
|
||||
"""
|
||||
Test allowed tags.
|
||||
|
||||
Reference in New Issue
Block a user