def testNoViewOnClassicClassException(self): from zope.interface import Interface from types import ClassType class ClassicError: __metaclass__ = ClassType class IClassicError(Interface): pass classImplements(ClassicError, IClassicError) support.setDefaultViewName(IClassicError, 'name', self.presentation_type) view_text = 'You made a classic error ;-)' def _view(obj, request): return lambda: view_text component.provideAdapter(_view, (ClassicError, self.presentation_type), Interface, name='name') try: raise ClassicError except: pass self.publication.handleException(self.object, self.request, sys.exc_info(), retry_allowed=False) # check we don't get the view we registered self.failIf(''.join(self.request.response._result) == view_text) # check we do actually get something self.failIf(''.join(self.request.response._result) == '')
def testNoViewOnClassicClassException(self): from zope.interface import Interface from types import ClassType class ClassicError: __metaclass__ = ClassType class IClassicError(Interface): pass classImplements(ClassicError, IClassicError) support.setDefaultViewName(IClassicError, 'name', self.presentation_type) view_text = 'You made a classic error ;-)' def _view(obj, request): return lambda: view_text component.provideAdapter( _view, (ClassicError, self.presentation_type), Interface, name='name') try: raise ClassicError except: pass self.publication.handleException( self.object, self.request, sys.exc_info(), retry_allowed=False) # check we don't get the view we registered self.failIf(''.join(self.request.response._result) == view_text) # check we do actually get something self.failIf(''.join(self.request.response._result) == '')
def testViewOnException(self): from zope.interface import Interface class E1(Exception): pass support.setDefaultViewName(E1, 'name', layer=None, type=self.presentation_type) view_text = 'You had a conflict error' def _view(obj, request): return lambda: view_text component.provideAdapter(_view, (E1, self.presentation_type), Interface, name='name') try: raise E1 except: pass self.publication.handleException(self.object, self.request, sys.exc_info(), retry_allowed=False) self.assertEqual(self.request.response._result, view_text)
def testViewOnException(self): from zope.interface import Interface class E1(Exception): pass support.setDefaultViewName(E1, "name", layer=None, type=self.presentation_type) view_text = "You had a conflict error" def _view(obj, request): return lambda: view_text component.provideAdapter(_view, (E1, self.presentation_type), Interface, name="name") try: raise E1 except: pass self.publication.handleException(self.object, self.request, sys.exc_info(), retry_allowed=False) self.assertEqual(self.request.response._result, view_text)
def _testBaseTags(self, url, expected): # Make sure I1 and O1 are visible in the module namespace # so that the classes can be pickled. import transaction pub = BrowserPublication(self.db) component.provideAdapter(DummyView, (I1, IDefaultBrowserLayer), Interface, name='view') support.setDefaultViewName(I1, 'view') component.provideAdapter(TestTraverser, (None, IDefaultBrowserLayer), IBrowserPublisher) ob = O1() ## the following is for running the tests standalone principalRegistry.defineDefaultPrincipal('tim', 'timbot', 'ai at its best') # now place our object inside the application connection = self.db.open() app = connection.root()['Application'] app.somepath = ob transaction.commit() connection.close() defineChecker(app.__class__, NamesChecker(somepath='xxx')) req = self._createRequest(url, pub) response = req.response publish(req, handle_errors=0) self.assertEqual(response.getBase(), expected)
def _testBaseTags(self, url, expected): # Make sure I1 and O1 are visible in the module namespace # so that the classes can be pickled. import transaction pub = BrowserPublication(self.db) component.provideAdapter(DummyView, (I1, IDefaultBrowserLayer), Interface, name='view') support.setDefaultViewName(I1, 'view') component.provideAdapter(TestTraverser, (None, IDefaultBrowserLayer), IBrowserPublisher) ob = O1() ## the following is for running the tests standalone principalRegistry.defineDefaultPrincipal( 'tim', 'timbot', 'ai at its best') # now place our object inside the application connection = self.db.open() app = connection.root()['Application'] app.somepath = ob transaction.commit() connection.close() defineChecker(app.__class__, NamesChecker(somepath='xxx')) req = self._createRequest(url, pub) response = req.response publish(req, handle_errors=0) self.assertEqual(response.getBase(), expected)
def testDenyDirectMethodAccess(self): pub = self.klass(self.db) class I(Interface): pass class C(object): implements(I) def foo(self): return 'bar' class V(object): def __init__(self, context, request): pass implements(IXMLRPCView) ob = C() r = self._createRequest('/foo', pub) component.provideAdapter(V, (I, IXMLRPCView), Interface, name='view') support.setDefaultViewName(I, 'view', type=IXMLRPCView) self.assertRaises(NotFound, pub.traverseName, r, ob, 'foo')
def testHandlingSystemErrors(self): # Generally, when there is a view for an excepton, we assume # it is a user error, not a system error and we don't log it. from zope.testing import loggingsupport handler = loggingsupport.InstalledHandler('SiteError') self.testViewOnException() self.assertEqual( str(handler), 'SiteError ERROR\n' ' Error while reporting an error to the Error Reporting utility') # Here we got a single log record, because we haven't # installed an error reporting utility. That's OK. handler.uninstall() handler = loggingsupport.InstalledHandler('SiteError') # Now, we'll register an exception view that indicates that we # have a system error. from zope.interface import Interface, implements class E2(Exception): pass support.setDefaultViewName(E2, 'name', layer=self.presentation_type, type=self.presentation_type) view_text = 'You had a conflict error' from zope.browser.interfaces import ISystemErrorView class MyView: implements(ISystemErrorView) def __init__(self, context, request): pass def isSystemError(self): return True def __call__(self): return view_text component.provideAdapter(MyView, (E2, self.presentation_type), Interface, name='name') try: raise E2 except: self.publication.handleException( self.object, self.request, sys.exc_info(), retry_allowed=False) # Now, since the view was a system error view, we should have # a log entry for the E2 error (as well as the missing # error reporting utility). self.assertEqual( str(handler), 'SiteError ERROR\n' ' Error while reporting an error to the Error Reporting utility\n' 'SiteError ERROR\n' ' http://test.url' ) handler.uninstall()
def testHandlingSystemErrors(self): # Generally, when there is a view for an excepton, we assume # it is a user error, not a system error and we don't log it. from zope.testing import loggingsupport handler = loggingsupport.InstalledHandler('SiteError') self.testViewOnException() self.assertEqual( str(handler), 'SiteError ERROR\n' ' Error while reporting an error to the Error Reporting utility') # Here we got a single log record, because we haven't # installed an error reporting utility. That's OK. handler.uninstall() handler = loggingsupport.InstalledHandler('SiteError') # Now, we'll register an exception view that indicates that we # have a system error. from zope.interface import Interface, implements class E2(Exception): pass support.setDefaultViewName(E2, 'name', layer=self.presentation_type, type=self.presentation_type) view_text = 'You had a conflict error' from zope.browser.interfaces import ISystemErrorView class MyView: implements(ISystemErrorView) def __init__(self, context, request): pass def isSystemError(self): return True def __call__(self): return view_text component.provideAdapter(MyView, (E2, self.presentation_type), Interface, name='name') try: raise E2 except: self.publication.handleException(self.object, self.request, sys.exc_info(), retry_allowed=False) # Now, since the view was a system error view, we should have # a log entry for the E2 error (as well as the missing # error reporting utility). self.assertEqual( str(handler), 'SiteError ERROR\n' ' Error while reporting an error to the Error Reporting utility\n' 'SiteError ERROR\n' ' http://test.url') handler.uninstall()