summaryrefslogtreecommitdiff
path: root/src/zope/exceptions/tests/test_exceptionformatter.py
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2017-09-11 11:28:00 -0500
committerJason Madden <jamadden@gmail.com>2017-09-11 11:28:00 -0500
commitcc9f097936226845a89d879d49f38894dd032d03 (patch)
tree3643ca6bc8d5d22d2c8927e0cb3686c5698075cf /src/zope/exceptions/tests/test_exceptionformatter.py
parentd97f1b37d541554ad85e15dd824a84d3e3883f4c (diff)
downloadzope-exceptions-issue1.tar.gz
Fix non-ASCII supplement info under Python 2 and drop Py3.3.issue1
Fixes #1. Fix the coverage environment using zope.testrunner (nose no longer works, that same namespace path issue). Also run the doctests on all supported versions. This requires dropping Python 3.3 because sphinx needs 3.4+.
Diffstat (limited to 'src/zope/exceptions/tests/test_exceptionformatter.py')
-rw-r--r--src/zope/exceptions/tests/test_exceptionformatter.py189
1 files changed, 105 insertions, 84 deletions
diff --git a/src/zope/exceptions/tests/test_exceptionformatter.py b/src/zope/exceptions/tests/test_exceptionformatter.py
index 5856583..9046950 100644
--- a/src/zope/exceptions/tests/test_exceptionformatter.py
+++ b/src/zope/exceptions/tests/test_exceptionformatter.py
@@ -14,7 +14,6 @@
"""ExceptionFormatter tests.
"""
import unittest
-import doctest
import sys
@@ -53,7 +52,6 @@ class TextExceptionFormatterTests(unittest.TestCase):
self.assertEqual(fmt.getLimit(), 200)
def test_getLimit_sys_has_limit(self):
- import sys
fmt = self._makeOne()
with _Monkey(sys, tracebacklimit=15):
self.assertEqual(fmt.getLimit(), 15)
@@ -152,6 +150,17 @@ class TextExceptionFormatterTests(unittest.TestCase):
self.assertEqual(fmt.formatTracebackInfo('XYZZY'),
' - __traceback_info__: XYZZY')
+ def test_formatTracebackInfo_unicode(self):
+ __traceback_info__ = u"Have a Snowman: \u2603"
+ fmt = self._makeOne()
+
+ result = fmt.formatTracebackInfo(__traceback_info__)
+ expected = ' - __traceback_info__: Have a Snowman: '
+ # utf-8 encoded on Python 2, unicode on Python 3
+ expected += '\xe2\x98\x83' if bytes is str else u'\u2603'
+ self.assertIsInstance(result, str)
+ self.assertEqual(result, expected)
+
def test_formatLine_no_tb_no_f(self):
fmt = self._makeOne()
self.assertRaises(ValueError, fmt.formatLine, None, None)
@@ -168,24 +177,26 @@ class TextExceptionFormatterTests(unittest.TestCase):
tb.tb_frame = f = DummyFrame()
lines = fmt.formatLine(tb).splitlines()
self.assertEqual(len(lines), 1)
- self.assertEqual(lines[0],
- ' File "%s", line %d, in %s'
- % (f.f_code.co_filename,
- tb.tb_lineno,
- f.f_code.co_name,
- ))
+ self.assertEqual(
+ lines[0],
+ ' File "%s", line %d, in %s'
+ % (f.f_code.co_filename,
+ tb.tb_lineno,
+ f.f_code.co_name,)
+ )
def test_formatLine_w_f_bogus_linecache_w_filenames(self):
fmt = self._makeOne(with_filenames=True)
f = DummyFrame()
lines = fmt.formatLine(f=f).splitlines()
self.assertEqual(len(lines), 1)
- self.assertEqual(lines[0],
- ' File "%s", line %d, in %s'
- % (f.f_code.co_filename,
- f.f_lineno,
- f.f_code.co_name,
- ))
+ self.assertEqual(
+ lines[0],
+ ' File "%s", line %d, in %s'
+ % (f.f_code.co_filename,
+ f.f_lineno,
+ f.f_code.co_name,)
+ )
def test_formatLine_w_tb_bogus_linecache_wo_filenames(self):
fmt = self._makeOne(with_filenames=False)
@@ -194,25 +205,27 @@ class TextExceptionFormatterTests(unittest.TestCase):
f.f_globals['__name__'] = 'dummy.filename'
lines = fmt.formatLine(tb).splitlines()
self.assertEqual(len(lines), 1)
- self.assertEqual(lines[0],
- ' Module dummy.filename, line %d, in %s'
- % (tb.tb_lineno,
- f.f_code.co_name,
- ))
+ self.assertEqual(
+ lines[0],
+ ' Module dummy.filename, line %d, in %s'
+ % (tb.tb_lineno,
+ f.f_code.co_name,)
+ )
def test_formatLine_w_f_real_linecache_w_filenames(self):
- import sys
fmt = self._makeOne(with_filenames=True)
- f = sys._getframe(); lineno = f.f_lineno
+ f = sys._getframe()
+ lineno = f.f_lineno
result = fmt.formatLine(f=f)
lines = result.splitlines()
self.assertEqual(len(lines), 2)
- self.assertEqual(lines[0],
- ' File "%s", line %d, in %s'
- % (f.f_code.co_filename,
- lineno + 1,
- f.f_code.co_name,
- ))
+ self.assertEqual(
+ lines[0],
+ ' File "%s", line %d, in %s'
+ % (f.f_code.co_filename,
+ lineno + 1,
+ f.f_code.co_name,)
+ )
self.assertEqual(lines[1],
' result = fmt.formatLine(f=f)')
@@ -257,7 +270,7 @@ class TextExceptionFormatterTests(unittest.TestCase):
err = ValueError('testing')
self.assertEqual(fmt.formatExceptionOnly(ValueError, err),
''.join(
- traceback.format_exception_only(ValueError, err)))
+ traceback.format_exception_only(ValueError, err)))
def test_formatLastLine(self):
fmt = self._makeOne()
@@ -272,7 +285,7 @@ class TextExceptionFormatterTests(unittest.TestCase):
self.assertEqual(lines[0], 'Traceback (most recent call last):\n')
self.assertEqual(lines[1],
''.join(
- traceback.format_exception_only(ValueError, err)))
+ traceback.format_exception_only(ValueError, err)))
def test_formatException_non_empty_tb_stack(self):
import traceback
@@ -287,7 +300,7 @@ class TextExceptionFormatterTests(unittest.TestCase):
'in dummy_function\n')
self.assertEqual(lines[2],
''.join(
- traceback.format_exception_only(ValueError, err)))
+ traceback.format_exception_only(ValueError, err)))
def test_formatException_deep_tb_stack_with_limit(self):
import traceback
@@ -336,12 +349,12 @@ class TextExceptionFormatterTests(unittest.TestCase):
'in dummy_function\n')
self.assertEqual(lines[4],
''.join(
- traceback.format_exception_only(ValueError, err)))
+ traceback.format_exception_only(ValueError, err)))
def test_extractStack_wo_frame(self):
- import sys
fmt = self._makeOne()
- f = sys._getframe(); lineno = f.f_lineno
+ f = sys._getframe()
+ lineno = f.f_lineno
lines = fmt.extractStack()
# rather don't assert this here
# self.assertEqual(len(lines), 10)
@@ -351,9 +364,9 @@ class TextExceptionFormatterTests(unittest.TestCase):
' lines = fmt.extractStack()\n' % (lineno + 1))
def test_extractStack_wo_frame_w_limit(self):
- import sys
fmt = self._makeOne(limit=2)
- f = sys._getframe(); lineno = f.f_lineno
+ f = sys._getframe()
+ lineno = f.f_lineno
lines = fmt.extractStack()
self.assertEqual(len(lines), 3)
self.assertEqual(lines[-1], ' Module '
@@ -417,7 +430,7 @@ class TextExceptionFormatterTests(unittest.TestCase):
def _makeTBs(self, count):
prev = None
- for i in range(count):
+ for _i in range(count):
tb = DummyTB()
tb.tb_lineno = 14
tb.tb_frame = DummyFrame()
@@ -429,7 +442,7 @@ class TextExceptionFormatterTests(unittest.TestCase):
def _makeFrames(self, count):
prev = None
- for i in range(count):
+ for _i in range(count):
f = DummyFrame()
f.f_lineno = 17
if prev is not None:
@@ -467,7 +480,7 @@ class HTMLExceptionFormatterTests(unittest.TestCase):
def test_escape_w_markup(self):
fmt = self._makeOne()
self.assertEqual(fmt.escape('<span>XXX & YYY<span>'),
- '&lt;span&gt;XXX &amp; YYY&lt;span&gt;')
+ '&lt;span&gt;XXX &amp; YYY&lt;span&gt;')
def test_getPrefix(self):
fmt = self._makeOne()
@@ -506,12 +519,13 @@ class HTMLExceptionFormatterTests(unittest.TestCase):
tb = DummyTB()
tb.tb_frame = f = DummyFrame()
result = fmt.formatLine(tb)
- self.assertEqual(result,
- '<li> File "%s", line %d, in %s</li>'
- % (f.f_code.co_filename,
- tb.tb_lineno,
- f.f_code.co_name,
- ))
+ self.assertEqual(
+ result,
+ '<li> File "%s", line %d, in %s</li>'
+ % (f.f_code.co_filename,
+ tb.tb_lineno,
+ f.f_code.co_name,)
+ )
def test_formatLastLine(self):
fmt = self._makeOne()
@@ -521,7 +535,6 @@ class HTMLExceptionFormatterTests(unittest.TestCase):
class Test_format_exception(unittest.TestCase):
def _callFUT(self, as_html=False):
- import sys
from zope.exceptions.exceptionformatter import format_exception
t, v, b = sys.exc_info()
try:
@@ -633,23 +646,33 @@ class Test_format_exception(unittest.TestCase):
pass
try:
raise TypeError(C())
- except:
+ except TypeError:
s = self._callFUT(True)
- self.assertTrue(s.find('&lt;') >= 0, s)
- self.assertTrue(s.find('&gt;') >= 0, s)
+ self.assertIn('&lt;', s)
+ self.assertIn('&gt;', s)
def test_multiline_exception(self):
try:
exec('syntax error\n')
- except Exception:
+ except SyntaxError:
s = self._callFUT(False)
lines = s.splitlines()[-3:]
self.assertEqual(lines[0], ' syntax error')
self.assertTrue(lines[1].endswith(' ^')) #PyPy has a shorter prefix
self.assertEqual(lines[2], 'SyntaxError: invalid syntax')
+ def test_traceback_info_non_ascii(self):
+ __traceback_info__ = u"Have a Snowman: \u2603"
+ try:
+ raise TypeError()
+ except TypeError:
+ s = self._callFUT(True)
+
+ self.assertIsInstance(s, str)
+ self.assertIn('Have a Snowman', s)
+
+
def test_recursion_failure(self):
- import sys
from zope.exceptions.exceptionformatter import TextExceptionFormatter
class FormatterException(Exception):
@@ -676,16 +699,38 @@ class Test_format_exception(unittest.TestCase):
self.assertTrue('FormatterException: Formatter failed'
in s.splitlines()[-1])
+ def test_format_exception_as_html(self):
+ # Test for format_exception (as_html=True)
+ from zope.exceptions.exceptionformatter import format_exception
+ from textwrap import dedent
+ import re
+ try:
+ exec('import')
+ except SyntaxError:
+ result = ''.join(format_exception(*sys.exc_info(), as_html=True))
+ expected = dedent("""\
+ <p>Traceback (most recent call last):</p>
+ <ul>
+ <li> Module zope.exceptions.tests.test_exceptionformatter, line ABC, in test_format_exception_as_html<br />
+ exec('import')</li>
+ </ul><p> File "&lt;string&gt;", line 1<br />
+ import<br />
+ ^<br />
+ SyntaxError: invalid syntax<br />
+ </p>""")
+ # HTML formatter uses Windows line endings for some reason.
+ result = result.replace('\r\n', '\n')
+ result = re.sub(r'line \d\d\d,', 'line ABC,', result)
+ self.maxDiff = None
+ self.assertEqual(expected, result)
+
class Test_print_exception(unittest.TestCase):
def _callFUT(self, as_html=False):
- try:
- from StringIO import StringIO
- except ImportError:
- from io import StringIO
- buf = StringIO()
- import sys
+ import io
+ buf = io.StringIO() if bytes is not str else io.BytesIO()
+
from zope.exceptions.exceptionformatter import print_exception
t, v, b = sys.exc_info()
try:
@@ -718,7 +763,6 @@ class Test_print_exception(unittest.TestCase):
class Test_extract_stack(unittest.TestCase):
def _callFUT(self, as_html=False):
- import sys
from zope.exceptions.exceptionformatter import extract_stack
f = sys.exc_info()[2].tb_frame
try:
@@ -752,7 +796,7 @@ class Test_extract_stack(unittest.TestCase):
def test_traceback_info_html(self):
try:
- __traceback_info__ = "Adam & Eve"
+ __traceback_info__ = u"Adam & Eve"
raise ExceptionForTesting
except ExceptionForTesting:
s = self._callFUT(True)
@@ -761,7 +805,7 @@ class Test_extract_stack(unittest.TestCase):
def test_traceback_supplement_text(self):
try:
__traceback_supplement__ = (TestingTracebackSupplement,
- "You're one in a million")
+ u"You're one in a million")
raise ExceptionForTesting
except ExceptionForTesting:
s = self._callFUT(False)
@@ -803,7 +847,7 @@ class Test_extract_stack(unittest.TestCase):
self.assertTrue(s.find('test_noinput') >= 0)
-class ExceptionForTesting (Exception):
+class ExceptionForTesting(Exception):
pass
@@ -860,30 +904,7 @@ class _Monkey(object):
delattr(self.module, key)
-def doctest_format_exception_as_html():
- """Test for format_exception (as_html=True)
-
- >>> from zope.exceptions.exceptionformatter import format_exception
- >>> try:
- ... exec('import 2 + 2')
- ... except:
- ... print(''.join(format_exception(*sys.exc_info(), as_html=True)))
- <p>Traceback (most recent call last):</p>
- <ul>
- <li> Module zope.exceptions.tests.test_exceptionformatter, line 2, in &lt;module&gt;<br />
- exec('import 2 + 2')</li>
- </ul><p> File "&lt;string&gt;", line 1<br />
- import 2 + 2<br />
- ^<br />
- SyntaxError: invalid syntax<br />
- </p>
-
- """
def test_suite():
- return unittest.TestSuite([
- unittest.defaultTestLoader.loadTestsFromName(__name__),
- doctest.DocTestSuite(
- optionflags=doctest.NORMALIZE_WHITESPACE),
- ])
+ return unittest.defaultTestLoader.loadTestsFromName(__name__)