[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')