[Zope-Checkins]
SVN: Zope/trunk/lib/python/ZPublisher/tests/testBaseRequest.py
Forward-port ZPublisher.BaseRequest test cleanup from 2.10 branch.
Tres Seaver
tseaver at palladion.com
Mon Apr 7 10:58:14 EDT 2008
Log message for revision 85152:
Forward-port ZPublisher.BaseRequest test cleanup from 2.10 branch.
Changed:
U Zope/trunk/lib/python/ZPublisher/tests/testBaseRequest.py
-=-
Modified: Zope/trunk/lib/python/ZPublisher/tests/testBaseRequest.py
===================================================================
--- Zope/trunk/lib/python/ZPublisher/tests/testBaseRequest.py 2008-04-07 14:57:37 UTC (rev 85151)
+++ Zope/trunk/lib/python/ZPublisher/tests/testBaseRequest.py 2008-04-07 14:58:13 UTC (rev 85152)
@@ -1,165 +1,99 @@
-from unittest import TestCase, TestSuite, makeSuite, main
+import unittest
from Acquisition import Implicit
-from ZPublisher.BaseRequest import BaseRequest
-from ZPublisher.HTTPResponse import HTTPResponse
+import zope.interface
+import zope.component
+import zope.testing.cleanup
+import zope.traversing.namespace
+from zope.publisher.browser import IBrowserRequest
+from zope.publisher.browser import IDefaultBrowserLayer
+from zope.traversing.interfaces import ITraversable
-class DummyObjectBasic(Implicit):
- """Dummy class with docstring."""
- def _setObject(self, id, object):
- setattr(self, id, object)
- return getattr(self, id)
+class TestBaseRequest(unittest.TestCase):
- def view(self):
- """Attribute with docstring."""
- return 'view content'
+ def _getTargetClass(self):
+ from ZPublisher.BaseRequest import BaseRequest
+ return BaseRequest
- def noview(self):
- # Attribute without docstring.
- return 'unpublishable'
-
-
-class DummyObjectWithoutDocstring(Implicit):
- ""
-
- def view(self):
- """Attribute with docstring."""
- return 'view content'
-
- def noview(self):
- # Attribute without docstring.
- return 'unpublishable'
-
-
-class DummyObjectWithDefault(DummyObjectBasic):
- """Dummy class with docstring."""
-
- def index_html(self):
- """Attribute with docstring."""
- return 'index_html content'
-
-
-class DummyObjectWithDefaultNone(DummyObjectWithDefault):
- """Dummy class with docstring."""
-
- index_html = None
-
-
-class DummyObjectWithBPTH(DummyObjectBasic):
- """Dummy class with docstring."""
-
- def __before_publishing_traverse__(self, object, REQUEST):
- if REQUEST['_test_counter'] < 100:
- REQUEST['_test_counter'] += 1
- else:
- raise RuntimeError('Infinite loop detected.')
- REQUEST['TraversalRequestNameStack'] += self._path
- REQUEST._hacked_path=1
-
-
-class DummyObjectWithBBT(DummyObjectBasic):
- """ Dummy class with docstring.
- """
-
- def __bobo_traverse__(self, REQUEST, name):
- raise AttributeError, name
-
-class DummyObjectWithBD(DummyObjectBasic):
- """Dummy class with docstring."""
-
- def __browser_default__(self, REQUEST):
- if REQUEST['_test_counter'] < 100:
- REQUEST['_test_counter'] += 1
- else:
- raise RuntimeError('Infinite loop detected.')
- return self, self._default_path
-
-class DummyObjectWithBDBBT(DummyObjectWithBD):
- """Dummy class with docstring."""
-
- def __bobo_traverse__(self, REQUEST, name):
- if name == self._default_path[0]:
- return getattr(self, name)
- raise AttributeError, name
-
-
-class TestBaseRequest(TestCase):
-
- def setUp(self):
- self.root = DummyObjectBasic()
- self.f1 = self.root._setObject('folder', DummyObjectBasic() )
- self.f1._setObject('objBasic', DummyObjectBasic() )
- self.f1._setObject('objWithDefault', DummyObjectWithDefault() )
- self.f1._setObject('objWithDefaultNone', DummyObjectWithDefaultNone() )
- self.f1._setObject('objWithBPTH', DummyObjectWithBPTH() )
- self.f1._setObject('objWithBD', DummyObjectWithBD() )
- self.f1._setObject('objWithBBT', DummyObjectWithBBT() )
- self.f1._setObject('objWithBDBBT', DummyObjectWithBDBBT() )
- self.f1._setObject('objWithoutDocstring', DummyObjectWithoutDocstring() )
- self.f1.simpleString = 'foo'
- self.f1.simpleList = []
- self.f1.simpleBoolean = True
- self.f1.simpleComplex = complex(1)
- self.f1.simpleSet = set([])
- self.f1.simpleFrozenSet = frozenset([])
-
- def makeBaseRequest(self):
- response = HTTPResponse()
+ def _makeOne(self, root):
+ response = DummyResponse()
environment = { 'URL': '',
- 'PARENTS': [self.root],
+ 'PARENTS': [root],
'steps': [],
'_hacked_path': 0,
'_test_counter': 0,
'response': response }
- return BaseRequest(environment)
+ return self._getTargetClass()(environment)
+ def _makeRootAndFolder(self):
+ root = DummyObjectBasic()
+ folder = root._setObject('folder', DummyObjectBasic())
+ return root, folder
+
def test_traverse_basic(self):
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objBasic', DummyObjectBasic())
+ r = self._makeOne(root)
r.traverse('folder/objBasic')
self.assertEqual(r.URL, '/folder/objBasic')
self.assertEqual(r.response.base, '')
def test_traverse_withDefault(self):
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithDefault', DummyObjectWithDefault())
+ r = self._makeOne(root)
r.traverse('folder/objWithDefault')
self.assertEqual(r.URL, '/folder/objWithDefault/index_html')
self.assertEqual(r.response.base, '/folder/objWithDefault/')
def test_traverse_withDefaultNone(self):
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithDefaultNone', DummyObjectWithDefaultNone())
+ r = self._makeOne(root)
r.traverse('folder/objWithDefaultNone')
self.assertEqual(r.URL, '/folder/objWithDefaultNone')
self.assertEqual(r.response.base, '')
def test_traverse_withBPTH(self):
- r = self.makeBaseRequest()
- self.f1.objWithBPTH._path = ['view']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBPTH', DummyObjectWithBPTH())
+ folder.objWithBPTH._path = ['view']
+ r = self._makeOne(root)
r.traverse('folder/objWithBPTH')
self.assertEqual(r.URL, '/folder/objWithBPTH/view')
self.assertEqual(r.response.base, '/folder/objWithBPTH/')
def test_traverse_withBDView(self):
- r = self.makeBaseRequest()
- self.f1.objWithBD._default_path = ['view']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBD', DummyObjectWithBD())
+ folder.objWithBD._default_path = ['view']
+ r = self._makeOne(root)
r.traverse('folder/objWithBD')
self.assertEqual(r.URL, '/folder/objWithBD/view')
self.assertEqual(r.response.base, '/folder/objWithBD/')
def test_traverse_withAcquisition(self):
- r = self.makeBaseRequest()
- self.f1.objWithBPTH._path = ['view']
- self.f1.objWithBD._default_path = ['view']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBPTH', DummyObjectWithBPTH())
+ folder.objWithBPTH._path = ['view']
+ folder._setObject('objWithBD', DummyObjectWithBD())
+ folder.objWithBD._default_path = ['view']
+ r = self._makeOne(root)
r.traverse('folder/objWithBD/objWithBPTH')
self.assertEqual(r.URL, '/folder/objWithBD/objWithBPTH/view')
self.assertEqual(r.response.base, '/folder/objWithBD/objWithBPTH/')
def test_traverse_withBDAndBPTH(self):
# Collector 1079 (infinite loop 1)
- r = self.makeBaseRequest()
- self.f1.objWithBPTH._path = ['objBasic']
- self.f1.objWithBD._default_path = ['objWithBPTH']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objBasic', DummyObjectBasic())
+ folder._setObject('objWithBPTH', DummyObjectWithBPTH())
+ folder.objWithBPTH._path = ['objBasic']
+ folder._setObject('objWithBD', DummyObjectWithBD())
+ folder.objWithBD._default_path = ['objWithBPTH']
+ r = self._makeOne(root)
r.traverse('folder/objWithBD')
self.assertEqual(r.URL, '/folder/objWithBD/objWithBPTH/objBasic')
self.assertEqual(r.response.base, '/folder/objWithBD/objWithBPTH/')
@@ -167,24 +101,31 @@
def test_traverse_withBDEmpty(self):
# Collector 1079 (infinite loop 2)
from ZPublisher import NotFound
- r = self.makeBaseRequest()
- self.f1.objWithBD._default_path = ['']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBD', DummyObjectWithBD())
+ folder.objWithBD._default_path = ['']
+ r = self._makeOne(root)
self.failUnlessRaises(NotFound, r.traverse, 'folder/objWithBD')
def test_traverse_withBBT_handles_AttributeError(self):
# Test that if __bobo_traverse__ raises AttributeError
# that we get a NotFound
from ZPublisher import NotFound
- r = self.makeBaseRequest()
- self.failUnlessRaises(NotFound, r.traverse, 'folder/objWithBBT/bbt_foo')
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBBT', DummyObjectWithBBT())
+ r = self._makeOne(root)
+ self.failUnlessRaises(NotFound, r.traverse,
+ 'folder/objWithBBT/bbt_foo')
def test_traverse_withBDBBT(self):
# Test for an object which has a __browser_default__
# and __bobo_traverse__
# __bobo_traverse__ should return the object
# pointed by __browser_default__
- r = self.makeBaseRequest()
- self.f1.objWithBDBBT._default_path = ['view']
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBDBBT', DummyObjectWithBDBBT())
+ folder.objWithBDBBT._default_path = ['view']
+ r = self._makeOne(root)
r.traverse('folder/objWithBDBBT')
self.assertEqual(r.URL, '/folder/objWithBDBBT/view')
self.assertEqual(r.response.base, '/folder/objWithBDBBT/')
@@ -195,61 +136,106 @@
# __bobo_traverse__ should raise an AttributeError, which will
# raise a NotFound
from ZPublisher import NotFound
- r = self.makeBaseRequest()
- self.f1.objWithBDBBT._default_path = ['xxx']
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithBDBBT', DummyObjectWithBDBBT())
+ folder.objWithBDBBT._default_path = ['xxx']
+ r = self._makeOne(root)
self.failUnlessRaises(NotFound, r.traverse, 'folder/objWithBDBBT')
def test_traverse_slash(self):
- r = self.makeBaseRequest()
- r['PARENTS'] = [self.f1.objWithDefault]
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithDefault', DummyObjectWithDefault())
+ r = self._makeOne(root)
+ r['PARENTS'] = [folder.objWithDefault]
r.traverse('/')
self.assertEqual(r.URL, '/index_html')
self.assertEqual(r.response.base, '')
def test_traverse_attribute_with_docstring(self):
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objBasic', DummyObjectBasic())
+ r = self._makeOne(root)
r.traverse('folder/objBasic/view')
self.assertEqual(r.URL, '/folder/objBasic/view')
self.assertEqual(r.response.base, '')
def test_traverse_attribute_without_docstring(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objBasic', DummyObjectBasic())
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/objBasic/noview')
def test_traverse_class_without_docstring(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithoutDocstring', DummyObjectWithoutDocstring())
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/objWithoutDocstring')
def test_traverse_attribute_of_class_without_docstring(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
- self.assertRaises(NotFound, r.traverse, 'folder/objWithoutDocstring/view')
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('objWithoutDocstring', DummyObjectWithoutDocstring())
+ r = self._makeOne(root)
+ self.assertRaises(NotFound, r.traverse,
+ 'folder/objWithoutDocstring/view')
def test_traverse_attribute_and_class_without_docstring(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
- self.assertRaises(NotFound, r.traverse, 'folder/objWithoutDocstring/noview')
+ root, folder = self._makeRootAndFolder()
+ r = self._makeOne(root)
+ folder._setObject('objWithoutDocstring', DummyObjectWithoutDocstring())
+ self.assertRaises(NotFound, r.traverse,
+ 'folder/objWithoutDocstring/noview')
- def test_traverse_simple_type(self):
+ def test_traverse_simple_string(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder.simpleString = 'foo'
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleString')
+
+ def test_traverse_simple_list(self):
+ from ZPublisher import NotFound
+ root, folder = self._makeRootAndFolder()
+ folder.simpleList = []
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleList')
+
+ def test_traverse_simple_boolean(self):
+ from ZPublisher import NotFound
+ root, folder = self._makeRootAndFolder()
+ folder.simpleBoolean = True
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleBoolean')
+
+ def test_traverse_simple_complex(self):
+ from ZPublisher import NotFound
+ root, folder = self._makeRootAndFolder()
+ folder.simpleComplex = complex(1)
+ folder.simpleString = 'foo'
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleComplex')
- def test_traverse_set_type(self):
+ def test_traverse_simple_set(self):
from ZPublisher import NotFound
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ folder.simpleSet = set([])
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleSet')
+
+ def test_traverse_simple_frozen_set(self):
+ from ZPublisher import NotFound
+ root, folder = self._makeRootAndFolder()
+ folder.simpleFrozenSet = frozenset([])
+ r = self._makeOne(root)
self.assertRaises(NotFound, r.traverse, 'folder/simpleFrozenSet')
def test_hold_after_close(self):
# Request should no longer accept holds after it has been closed
- r = self.makeBaseRequest()
+ root, folder = self._makeRootAndFolder()
+ r = self._makeOne(root)
r._hold(lambda x: None)
self.assertEqual(len(r._held), 1)
r.close()
@@ -258,57 +244,38 @@
r._hold(lambda x: None)
self.assertEqual(r._held, None)
-from ZPublisher import NotFound
-import zope.interface
-import zope.component
-import zope.testing.cleanup
-import zope.traversing.namespace
-from zope.publisher.browser import IBrowserRequest
-from zope.publisher.browser import IDefaultBrowserLayer
-from zope.traversing.interfaces import ITraversable
+class TestBaseRequestZope3Views(unittest.TestCase):
+ def _getTargetClass(self):
+ from ZPublisher.BaseRequest import BaseRequest
+ return BaseRequest
-class IDummy(zope.interface.Interface):
- """IDummy"""
+ def _makeOne(self, root):
+ response = DummyResponse()
+ environment = { 'URL': '',
+ 'PARENTS': [root],
+ 'steps': [],
+ '_hacked_path': 0,
+ '_test_counter': 0,
+ 'response': response }
-class DummyObjectZ3(DummyObjectBasic):
- zope.interface.implements(IDummy)
- def __init__(self, name):
- self.name = name
+ request = self._getTargetClass()(environment)
-class DummyObjectZ3WithAttr(DummyObjectZ3):
- def meth(self):
- """doc"""
- return 'meth on %s' % self.name
- def methonly(self):
- """doc"""
- return 'methonly on %s' % self.name
+ # The request needs to implement the proper interface
+ zope.interface.directlyProvides(request, IDefaultBrowserLayer)
+ return request
-class DummyView(Implicit):
- def __init__(self, content, request):
- self.content = content
- self.request = request
- def __call__(self):
- return 'view on %s' % (self.content.name)
+ def _makeRootAndFolder(self):
+ root = DummyObjectBasic()
+ folder = root._setObject('folder', DummyObjectZ3('folder'))
+ return root, folder
-class TestBaseRequestZope3Views(TestCase):
-
def setUp(self):
zope.testing.cleanup.cleanUp()
- self.root = DummyObjectBasic()
- folder = self.root._setObject('folder', DummyObjectZ3('folder'))
- folder._setObject('obj', DummyObjectZ3('obj'))
- folder._setObject('withattr', DummyObjectZ3WithAttr('withattr'))
- folder2 = self.root._setObject('folder2',
- DummyObjectZ3WithAttr('folder2'))
- folder2._setObject('obj2', DummyObjectZ3('obj2'))
- folder2._setObject('withattr2', DummyObjectZ3WithAttr('withattr2'))
+
gsm = zope.component.getGlobalSiteManager()
- # The request needs to implement the proper interface
- zope.interface.classImplements(BaseRequest, IDefaultBrowserLayer)
-
# Define our 'meth' view
gsm.registerAdapter(DummyView, (IDummy, IDefaultBrowserLayer), None,
'meth')
@@ -321,96 +288,235 @@
def tearDown(self):
zope.testing.cleanup.cleanUp()
- def makeBaseRequest(self):
- response = HTTPResponse()
- environment = {
- 'URL': '',
- 'PARENTS': [self.root],
- 'steps': [],
- '_hacked_path': 0,
- '_test_counter': 0,
- 'response': response,
- }
- return BaseRequest(environment)
-
- def setDefaultViewName(self, name):
+ def _setDefaultViewName(self, name):
from zope.component.interfaces import IDefaultViewName
gsm = zope.component.getGlobalSiteManager()
gsm.registerAdapter(name, (IDummy, IBrowserRequest), IDefaultViewName,
'')
def test_traverse_view(self):
- """simple view"""
- r = self.makeBaseRequest()
+ #simple view
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('obj', DummyObjectZ3('obj'))
+ r = self._makeOne(root)
ob = r.traverse('folder/obj/meth')
self.assertEqual(ob(), 'view on obj')
ob = r.traverse('folder/obj/@@meth')
self.assertEqual(ob(), 'view on obj')
# using default view
- self.setDefaultViewName('meth')
+ self._setDefaultViewName('meth')
ob = r.traverse('folder/obj')
self.assertEqual(ob(), 'view on obj')
def test_traverse_view_attr_local(self):
- """method on object used first"""
- r = self.makeBaseRequest()
+ #method on object used first
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('withattr', DummyObjectZ3WithAttr('withattr'))
+ r = self._makeOne(root)
ob = r.traverse('folder/withattr/meth')
self.assertEqual(ob(), 'meth on withattr')
ob = r.traverse('folder/withattr/@@meth')
self.assertEqual(ob(), 'view on withattr')
# using default view
- self.setDefaultViewName('meth')
+ self._setDefaultViewName('meth')
ob = r.traverse('folder/withattr')
self.assertEqual(ob(), 'view on withattr')
def test_traverse_view_attr_above(self):
- """view takes precedence over acquired attribute"""
- r = self.makeBaseRequest()
+ #view takes precedence over acquired attribute
+ root, folder = self._makeRootAndFolder()
+ folder2 = root._setObject('folder2', DummyObjectZ3WithAttr('folder2'))
+ folder2._setObject('obj2', DummyObjectZ3('obj2'))
+ r = self._makeOne(root)
ob = r.traverse('folder2/obj2/meth')
self.assertEqual(ob(), 'view on obj2') # used to be buggy (acquired)
ob = r.traverse('folder2/obj2/@@meth')
self.assertEqual(ob(), 'view on obj2')
# using default view
- self.setDefaultViewName('meth')
+ self._setDefaultViewName('meth')
ob = r.traverse('folder2/obj2')
self.assertEqual(ob(), 'view on obj2')
def test_traverse_view_attr_local2(self):
- """method with other method above"""
- r = self.makeBaseRequest()
+ #method with other method above
+ root, folder = self._makeRootAndFolder()
+ folder2 = root._setObject('folder2', DummyObjectZ3WithAttr('folder2'))
+ folder2._setObject('withattr2', DummyObjectZ3WithAttr('withattr2'))
+ r = self._makeOne(root)
ob = r.traverse('folder2/withattr2/meth')
self.assertEqual(ob(), 'meth on withattr2')
ob = r.traverse('folder2/withattr2/@@meth')
self.assertEqual(ob(), 'view on withattr2')
# using default view
- self.setDefaultViewName('meth')
+ self._setDefaultViewName('meth')
ob = r.traverse('folder2/withattr2')
self.assertEqual(ob(), 'view on withattr2')
def test_traverse_view_attr_acquired(self):
- """normal acquired attribute without view"""
- r = self.makeBaseRequest()
+ #normal acquired attribute without view
+ from ZPublisher import NotFound
+ root, folder = self._makeRootAndFolder()
+ folder2 = root._setObject('folder2', DummyObjectZ3WithAttr('folder2'))
+ folder2._setObject('obj2', DummyObjectZ3('obj2'))
+ r = self._makeOne(root)
ob = r.traverse('folder2/obj2/methonly')
self.assertEqual(ob(), 'methonly on folder2')
self.assertRaises(NotFound, r.traverse, 'folder2/obj2/@@methonly')
# using default view
- self.setDefaultViewName('methonly')
+ self._setDefaultViewName('methonly')
self.assertRaises(NotFound, r.traverse, 'folder2/obj2')
- def test_quoting(self):
- """View markers should not be quoted"""
- r = self.makeBaseRequest()
+ def test_quoting_goggles(self):
+ #View goggles ('@@') should not be quoted
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('obj', DummyObjectZ3('obj'))
+ r = self._makeOne(root)
r.traverse('folder/obj/@@meth')
self.assertEqual(r['URL'], '/folder/obj/@@meth')
-
- r = self.makeBaseRequest()
+
+ def test_quoting_plusplus(self):
+ #View markers ('++ should not be quoted
+ root, folder = self._makeRootAndFolder()
+ folder._setObject('obj', DummyObjectZ3('obj'))
+ r = self._makeOne(root)
r.traverse('folder/obj/++view++meth')
self.assertEqual(r['URL'], '/folder/obj/++view++meth')
+
+class DummyResponse(Implicit):
+
+ base = ''
+ status = None
+ debug_mode = False
+
+ def setStatus(self, code):
+ self.status = code
+
+ def setBase(self, base):
+ if base is None:
+ base = ''
+ elif not base.endswith('/'):
+ base = base+'/'
+ self.base = str(base)
+
+ def notFoundError(self, name):
+ from zExceptions import NotFound
+ raise NotFound(name)
+
+ # Real responses raise NotFound, to avoid information disclosure
+ #def forbiddenError(self, name):
+ # from zExceptions import Forbidden
+ # raise Forbidden(name)
+ forbiddenError = notFoundError
+
+class DummyObjectBasic(Implicit):
+ """Dummy class with docstring."""
+
+ def _setObject(self, id, object):
+ setattr(self, id, object)
+ return getattr(self, id)
+
+ def view(self):
+ """Attribute with docstring."""
+ return 'view content'
+
+ def noview(self):
+ # Attribute without docstring.
+ return 'unpublishable'
+
+
+class DummyObjectWithoutDocstring(Implicit):
+ ""
+
+ def view(self):
+ """Attribute with docstring."""
+ return 'view content'
+
+ def noview(self):
+ # Attribute without docstring.
+ return 'unpublishable'
+
+
+class DummyObjectWithDefault(DummyObjectBasic):
+ """Dummy class with docstring."""
+
+ def index_html(self):
+ """Attribute with docstring."""
+ return 'index_html content'
+
+
+class DummyObjectWithDefaultNone(DummyObjectWithDefault):
+ """Dummy class with docstring."""
+
+ index_html = None
+
+
+class DummyObjectWithBPTH(DummyObjectBasic):
+ """Dummy class with docstring."""
+
+ def __before_publishing_traverse__(self, object, REQUEST):
+ if REQUEST['_test_counter'] < 100:
+ REQUEST['_test_counter'] += 1
+ else:
+ raise RuntimeError('Infinite loop detected.')
+ REQUEST['TraversalRequestNameStack'] += self._path
+ REQUEST._hacked_path=1
+
+
+class DummyObjectWithBBT(DummyObjectBasic):
+ """ Dummy class with docstring.
+ """
+
+ def __bobo_traverse__(self, REQUEST, name):
+ raise AttributeError, name
+
+class DummyObjectWithBD(DummyObjectBasic):
+ """Dummy class with docstring."""
+
+ def __browser_default__(self, REQUEST):
+ if REQUEST['_test_counter'] < 100:
+ REQUEST['_test_counter'] += 1
+ else:
+ raise RuntimeError('Infinite loop detected.')
+ return self, self._default_path
+
+class DummyObjectWithBDBBT(DummyObjectWithBD):
+ """Dummy class with docstring."""
+
+ def __bobo_traverse__(self, REQUEST, name):
+ if name == self._default_path[0]:
+ return getattr(self, name)
+ raise AttributeError, name
+
+
+class IDummy(zope.interface.Interface):
+ """IDummy"""
+
+class DummyObjectZ3(DummyObjectBasic):
+ zope.interface.implements(IDummy)
+ def __init__(self, name):
+ self.name = name
+
+class DummyObjectZ3WithAttr(DummyObjectZ3):
+ def meth(self):
+ """doc"""
+ return 'meth on %s' % self.name
+ def methonly(self):
+ """doc"""
+ return 'methonly on %s' % self.name
+
+class DummyView(Implicit):
+ def __init__(self, content, request):
+ self.content = content
+ self.request = request
+ def __call__(self):
+ return 'view on %s' % (self.content.name)
+
def test_suite():
- return TestSuite( ( makeSuite(TestBaseRequest),
- makeSuite(TestBaseRequestZope3Views),
- ) )
+ return unittest.TestSuite((
+ unittest.makeSuite(TestBaseRequest),
+ unittest.makeSuite(TestBaseRequestZope3Views),
+ ))
if __name__ == '__main__':
- main(defaultTest='test_suite')
+ unitttest.main(defaultTest='test_suite')
More information about the Zope-Checkins
mailing list