|
@@ -435,6 +435,40 @@ class ExceptionReporterTests(SimpleTestCase):
|
|
|
text,
|
|
|
)
|
|
|
|
|
|
+ def test_reporting_frames_source_not_match(self):
|
|
|
+ try:
|
|
|
+ source = "def funcName():\n raise Error('Whoops')\nfuncName()"
|
|
|
+ namespace = {}
|
|
|
+ code = compile(source, 'generated', 'exec')
|
|
|
+ exec(code, namespace)
|
|
|
+ except Exception:
|
|
|
+ exc_type, exc_value, tb = sys.exc_info()
|
|
|
+ with mock.patch(
|
|
|
+ 'django.views.debug.ExceptionReporter._get_source',
|
|
|
+ return_value=['wrong source'],
|
|
|
+ ):
|
|
|
+ request = self.rf.get('/test_view/')
|
|
|
+ reporter = ExceptionReporter(request, exc_type, exc_value, tb)
|
|
|
+ frames = reporter.get_traceback_frames()
|
|
|
+ last_frame = frames[-1]
|
|
|
+ self.assertEqual(last_frame['context_line'], '<source code not available>')
|
|
|
+ self.assertEqual(last_frame['filename'], 'generated')
|
|
|
+ self.assertEqual(last_frame['function'], 'funcName')
|
|
|
+ self.assertEqual(last_frame['lineno'], 2)
|
|
|
+ html = reporter.get_traceback_html()
|
|
|
+ self.assertIn('generated in funcName, line 2', html)
|
|
|
+ self.assertIn(
|
|
|
+ '"generated", line 2, in funcName\n'
|
|
|
+ ' <source code not available>',
|
|
|
+ html,
|
|
|
+ )
|
|
|
+ text = reporter.get_traceback_text()
|
|
|
+ self.assertIn(
|
|
|
+ '"generated", line 2, in funcName\n'
|
|
|
+ ' <source code not available>',
|
|
|
+ text,
|
|
|
+ )
|
|
|
+
|
|
|
def test_reporting_frames_for_cyclic_reference(self):
|
|
|
try:
|
|
|
def test_func():
|