[Zope-Checkins] CVS: Zope3/lib/python/Zope/Exceptions/tests - __init__.py:1.1.2.1 testExceptionFormatter.py:1.1.2.1
Shane Hathaway
shane@cvs.zope.org
Thu, 14 Mar 2002 16:41:45 -0500
Update of /cvs-repository/Zope3/lib/python/Zope/Exceptions/tests
In directory cvs.zope.org:/tmp/cvs-serv12053/tests
Added Files:
Tag: Zope-3x-branch
__init__.py testExceptionFormatter.py
Log Message:
Added the custom exception formatter, with tests. Differences from the
traceback module:
- It prints module names instead of source file names, which results in
shorter lines and avoids disclosing filesystem paths.
- It can print application-specific traceback information.
- It can output in HTML format, which will make it possible to include
direct links from the traceback to the templates and scripts where the
exception occurred, without wrapping exceptions. (Wrapping exceptions
tends to obscure information.)
=== Added File Zope3/lib/python/Zope/Exceptions/tests/__init__.py ===
"""Package for Zope.Exceptions tests"""
=== Added File Zope3/lib/python/Zope/Exceptions/tests/testExceptionFormatter.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""
ExceptionFormatter tests.
Revision information:
$Id: testExceptionFormatter.py,v 1.1.2.1 2002/03/14 21:41:45 shane Exp $
"""
from unittest import TestCase, TestSuite, main, makeSuite
from Zope.Testing.CleanUp import CleanUp # Base class w registry cleanup
import sys
from Zope.ContextWrapper import wrapper
from Zope.Exceptions.ExceptionFormatter import format_exception
def tb(as_html=0):
t, v, b = sys.exc_info()
try:
return '\n'.join(format_exception(t, v, b, as_html))
finally:
del b
class ExceptionForTesting (Exception):
pass
class TestingTracebackSupplement:
manageable_object = wrapper.Wrapper(object(), name='wrapped_mo')
line = 634
column = 57
warnings = ['Repent, for the end is nigh']
def __init__(self, expression):
self.expression = expression
class Test(CleanUp, TestCase):
def testBasicNamesText(self, as_html=0):
try:
raise ExceptionForTesting
except ExceptionForTesting:
s = tb(as_html)
# The traceback should include the name of this function.
self.assert_(s.find('testBasicNamesText') >= 0)
# The traceback should include the name of the exception.
self.assert_(s.find('ExceptionForTesting') >= 0)
else:
self.fail('no exception occurred')
def testBasicNamesHTML(self):
self.testBasicNamesText(1)
def testSupplement(self, as_html=0):
try:
__traceback_supplement__ = (TestingTracebackSupplement,
"You're one in a million")
raise ExceptionForTesting
except ExceptionForTesting:
s = tb(as_html)
# The path to the object
self.assert_(s.find('wrapped_mo') >= 0, s)
# The line number
self.assert_(s.find('634') >= 0, s)
# The column number
self.assert_(s.find('57') >= 0, s)
# The expression
self.assert_(s.find("You're one in a million") >= 0, s)
# The warning
self.assert_(s.find("Repent, for the end is nigh") >= 0, s)
else:
self.fail('no exception occurred')
def testSupplementHTML(self):
self.testSupplement(1)
def testTracebackInfo(self, as_html=0):
try:
__traceback_info__ = "Adam & Eve"
raise ExceptionForTesting
except ExceptionForTesting:
s = tb(as_html)
if as_html:
# Be sure quoting is happening.
self.assert_(s.find('Adam & Eve') >= 0, s)
else:
self.assert_(s.find('Adam & Eve') >= 0, s)
else:
self.fail('no exception occurred')
def testTracebackInfoHTML(self):
self.testTracebackInfo(1)
def testMultipleLevels(self):
# Makes sure many levels are shown in a traceback.
def f(n):
"""Produces a (n + 1)-level traceback."""
__traceback_info__ = 'level%d' % n
if n > 0:
f(n - 1)
else:
raise ExceptionForTesting
try:
f(10)
except ExceptionForTesting:
s = tb()
for n in range(11):
self.assert_(s.find('level%d' % n) >= 0, s)
else:
self.fail('no exception occurred')
def test_suite():
return TestSuite((
makeSuite(Test),
))
if __name__=='__main__':
main(defaultTest='test_suite')