summaryrefslogtreecommitdiff
path: root/src/zope/traversing/tests
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2017-08-25 10:01:03 -0500
committerJason Madden <jamadden@gmail.com>2017-08-25 11:44:15 -0500
commitc5b04ca74abb72b3399730e670e7442f21283d3a (patch)
tree6c3c534907cce0e55d173040c25cf8f388ebcf3c /src/zope/traversing/tests
parent64af3f227d61aac8471bc3e837886b96c647262c (diff)
downloadzope-traversing-c5b04ca74abb72b3399730e670e7442f21283d3a.tar.gz
100% coverage. Minor whitespace cleanups.py36
Diffstat (limited to 'src/zope/traversing/tests')
-rw-r--r--src/zope/traversing/tests/test_conveniencefunctions.py143
-rw-r--r--src/zope/traversing/tests/test_lang.py7
-rw-r--r--src/zope/traversing/tests/test_namespacetrversal.py112
-rw-r--r--src/zope/traversing/tests/test_presentation.py11
-rw-r--r--src/zope/traversing/tests/test_publicationtraverse.py106
-rw-r--r--src/zope/traversing/tests/test_skin.py10
-rw-r--r--src/zope/traversing/tests/test_traverser.py75
-rw-r--r--src/zope/traversing/tests/test_vhosting.py65
8 files changed, 353 insertions, 176 deletions
diff --git a/src/zope/traversing/tests/test_conveniencefunctions.py b/src/zope/traversing/tests/test_conveniencefunctions.py
index b69d165..be50c6a 100644
--- a/src/zope/traversing/tests/test_conveniencefunctions.py
+++ b/src/zope/traversing/tests/test_conveniencefunctions.py
@@ -13,20 +13,18 @@
##############################################################################
"""Test traversal convenience functions.
"""
-from unittest import TestCase, main, makeSuite
+import unittest
+from zope import interface
import zope.component
from zope.component.testing import PlacelessSetup
-from zope.interface import directlyProvides
from zope.location.traversing \
import LocationPhysicallyLocatable, RootPhysicallyLocatable
from zope.location.interfaces import ILocationInfo, IRoot, LocationError
-from zope.security.proxy import Proxy
-from zope.security.checker import selectChecker
from zope.traversing.adapters import Traverser, DefaultTraversable
from zope.traversing.interfaces import ITraversable, ITraverser
-from zope.traversing.testing import contained, Contained
+from zope.traversing.testing import contained
class C(object):
__parent__ = None
@@ -34,29 +32,28 @@ class C(object):
def __init__(self, name):
self.name = name
-def _proxied(*args):
- return Proxy(args, selectChecker(args))
-class Test(PlacelessSetup, TestCase):
+class TestFunctional(PlacelessSetup, unittest.TestCase):
def setUp(self):
PlacelessSetup.setUp(self)
# Build up a wrapper chain
root = C('root')
- directlyProvides(root, IRoot)
+ interface.directlyProvides(root, IRoot)
folder = C('folder')
item = C('item')
self.root = root # root is not usually wrapped
- self.folder = contained(folder, self.root, name='folder')
- self.item = contained(item, self.folder, name='item')
+ self.folder = contained(folder, self.root, name='folder')
+ self.item = contained(item, self.folder, name='item')
self.unwrapped_item = item
self.broken_chain_folder = contained(folder, None)
- self.broken_chain_item = contained(item,
- self.broken_chain_folder,
- name='item'
- )
+ self.broken_chain_item = contained(
+ item,
+ self.broken_chain_folder,
+ name='item'
+ )
root.folder = folder
folder.item = item
@@ -75,6 +72,13 @@ class Test(PlacelessSetup, TestCase):
self.tr.traverse('/folder/item')
)
+ def test_traverse_with_default(self):
+ from zope.traversing.api import traverse
+ self.assertIs(
+ traverse(self.item, '/no/path', self),
+ self
+ )
+
def testTraverseFromUnwrapped(self):
from zope.traversing.api import traverse
self.assertRaises(
@@ -88,15 +92,23 @@ class Test(PlacelessSetup, TestCase):
self.assertEqual(
traverseName(self.folder, 'item'),
self.tr.traverse('/folder/item')
- )
+ )
self.assertEqual(
traverseName(self.item, '.'),
self.tr.traverse('/folder/item')
- )
+ )
self.assertEqual(
traverseName(self.item, '..'),
self.tr.traverse('/folder')
- )
+ )
+ self.assertEqual(
+ traverseName(self.folder, 'item', default=self),
+ self.tr.traverse('/folder/item')
+ )
+ self.assertIs(
+ traverseName(self.folder, 'nothing', default=self),
+ self,
+ )
# TODO test that ++names++ and @@names work too
@@ -127,7 +139,7 @@ class Test(PlacelessSetup, TestCase):
def traverse(self, name, furtherPath):
getattr(self, u'\u2019', None)
# The above actually works on Python 3
- raise LocationError()
+ raise unittest.SkipTest("Unicode attrs legal on Py3")
self.assertRaises(
LocationError,
@@ -241,19 +253,20 @@ class Test(PlacelessSetup, TestCase):
_good_locations = (
# location returned as string
- ( u'/xx/yy/zz',
- # arguments to try in addition to the above
- '/xx/yy/zz',
- '/xx/./yy/ww/../zz',
+ (u'/xx/yy/zz',
+ # arguments to try in addition to the above
+ '/xx/yy/zz',
+ '/xx/./yy/ww/../zz',
),
- ( u'/xx/yy/zz',
- '/xx/yy/zz',
+ (u'/xx/yy/zz',
+ '/xx/yy/zz',
),
- ( u'/xx',
- '/xx',
+ (u'/xx',
+ '/xx',
),
- ( u'/',
- '/',
+ (u'/',
+ '/',
+ self.root,
),
)
@@ -285,26 +298,26 @@ class Test(PlacelessSetup, TestCase):
_good_locations = (
# location returned as string
- ( '/xx/yy/zz',
- # arguments to try in addition to the above
- '/xx/yy/zz',
- '/xx/./yy/ww/../zz',
- '/xx/./yy/ww/./../zz',
+ ('/xx/yy/zz',
+ # arguments to try in addition to the above
+ '/xx/yy/zz',
+ '/xx/./yy/ww/../zz',
+ '/xx/./yy/ww/./../zz',
),
- ( 'xx/yy/zz',
- # arguments to try in addition to the above
- 'xx/yy/zz',
- 'xx/./yy/ww/../zz',
- 'xx/./yy/ww/./../zz',
+ ('xx/yy/zz',
+ # arguments to try in addition to the above
+ 'xx/yy/zz',
+ 'xx/./yy/ww/../zz',
+ 'xx/./yy/ww/./../zz',
),
- ( '/xx/yy/zz',
- '/xx/yy/zz',
+ ('/xx/yy/zz',
+ '/xx/yy/zz',
),
- ( '/xx',
- '/xx',
+ ('/xx',
+ '/xx',
),
- ( '/',
- '/',
+ ('/',
+ '/',
),
)
@@ -361,9 +374,41 @@ class Test(PlacelessSetup, TestCase):
args = ('foo', 'bar', '.', 'baz', 'bone')
self.assertEqual(joinPath(path, *args), u'/foo/bar/baz/bone')
+ def test_joinPath_empty_args(self):
+ from zope.traversing.api import joinPath
+ path = 'abc'
+ self.assertEqual(joinPath(path), u'abc')
+
-def test_suite():
- return makeSuite(Test)
+class TestStandalone(unittest.TestCase):
+ # Unlike TestFunctional, we don't register gobs of
+ # adapters, making these tests more self-contained
-if __name__=='__main__':
- main(defaultTest='test_suite')
+ def test_getParent_no_location_info(self):
+ from zope.traversing.api import getParent
+ test = self
+ class Context(object):
+ called = False
+ def __conform__(self, iface):
+ self.called = True
+ test.assertEqual(iface, ILocationInfo)
+ raise TypeError()
+
+ context = Context()
+ with self.assertRaisesRegexp(TypeError,
+ "Not enough context"):
+ getParent(context)
+
+ self.assertTrue(context.called)
+ context.called = False
+
+ # Now give it a parent
+ context.__parent__ = self
+ self.assertIs(self, getParent(context))
+
+ self.assertTrue(context.called)
+ context.called = False
+
+ # Now if it's a root, it has no parent
+ interface.alsoProvides(context, IRoot)
+ self.assertIsNone(getParent(context))
diff --git a/src/zope/traversing/tests/test_lang.py b/src/zope/traversing/tests/test_lang.py
index 888091b..d6f9ff8 100644
--- a/src/zope/traversing/tests/test_lang.py
+++ b/src/zope/traversing/tests/test_lang.py
@@ -55,10 +55,3 @@ class Test(CleanUp, unittest.TestCase):
self.assertTrue(ob is ob2)
self.assertTrue(request.shifted)
self.assertEqual(["ru"], browser_languages.getPreferredLanguages())
-
-
-def test_suite():
- return unittest.makeSuite(Test)
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
diff --git a/src/zope/traversing/tests/test_namespacetrversal.py b/src/zope/traversing/tests/test_namespacetrversal.py
index bde36c3..0fdd4db 100644
--- a/src/zope/traversing/tests/test_namespacetrversal.py
+++ b/src/zope/traversing/tests/test_namespacetrversal.py
@@ -14,12 +14,110 @@
"""Traversal Namespace Tests
"""
import re
-from unittest import main
+import unittest
from doctest import DocTestSuite
+
+from zope import interface
+from zope import component
+from zope.location.interfaces import LocationError
+from zope.traversing import namespace
+
+from zope.component.testing import PlacelessSetup
from zope.component.testing import setUp, tearDown
from zope.testing.renormalizing import RENormalizing
+class TestFunctions(unittest.TestCase):
+
+ def test_getResource_not_found(self):
+ with self.assertRaises(LocationError):
+ namespace.getResource(None, '', None)
+
+
+class TestAcquire(unittest.TestCase):
+
+ def test_excessive_depth_on_path_extension(self):
+ from zope.traversing.interfaces import ITraversable
+ from zope.traversing.namespace import ExcessiveDepth
+
+ @interface.implementer(ITraversable)
+ class Context(object):
+
+ max_call_count = 200
+
+ def traverse(self, name, path):
+ if self.max_call_count:
+ path.append("I added something")
+ self.max_call_count -= 1
+
+ acq = namespace.acquire(Context(), None)
+ with self.assertRaises(ExcessiveDepth):
+ acq.traverse(None, None)
+
+
+class TestEtc(PlacelessSetup, unittest.TestCase):
+
+ def test_traverse_non_site_name(self):
+ with self.assertRaises(LocationError) as ctx:
+ namespace.etc(None, None).traverse('foobar', ())
+
+ ex = ctx.exception
+ self.assertEqual((None, 'foobar'), ex.args)
+
+ def test_traverse_site_no_manager(self):
+ test = self
+ class Context(object):
+ def __getattribute__(self, name):
+ test.assertEqual(name, 'getSiteManager')
+ return None
+
+ context = Context()
+ with self.assertRaises(LocationError) as ctx:
+ namespace.etc(context, None).traverse('site', ())
+
+ ex = ctx.exception
+ self.assertEqual((context, 'site'), ex.args)
+
+ def test_traverse_site_lookup_error(self):
+ class Context(object):
+ called = False
+ def getSiteManager(self):
+ self.called = True
+ from zope.component import ComponentLookupError
+ raise ComponentLookupError()
+
+ context = Context()
+ with self.assertRaises(LocationError) as ctx:
+ namespace.etc(context, None).traverse('site', ())
+
+ ex = ctx.exception
+ self.assertEqual((context, 'site'), ex.args)
+ self.assertTrue(context.called)
+
+ def test_traverse_utility(self):
+ from zope.traversing.interfaces import IEtcNamespace
+ component.provideUtility(self, provides=IEtcNamespace, name='my etc name')
+
+ result = namespace.etc(None, None).traverse('my etc name', ())
+ self.assertIs(result, self)
+
+
+class TestView(unittest.TestCase):
+
+ def test_not_found(self):
+ with self.assertRaises(LocationError) as ctx:
+ namespace.view(None, None).traverse('name', ())
+
+ ex = ctx.exception
+ self.assertEqual((None, 'name'), ex.args)
+
+
+class TestVh(unittest.TestCase):
+
+ def test_invalid_vh(self):
+ with self.assertRaisesRegexp(ValueError,
+ 'Vhost directive should have the form'):
+ namespace.vh(None, None).traverse(u'invalid name', ())
def test_suite():
checker = RENormalizing([
@@ -28,9 +126,9 @@ def test_suite():
"LocationError"),
])
- return DocTestSuite('zope.traversing.namespace',
- setUp=setUp, tearDown=tearDown,
- checker=checker)
-
-if __name__ == '__main__':
- main(defaultTest='test_suite')
+ suite = unittest.defaultTestLoader.loadTestsFromName(__name__)
+ suite.addTest(DocTestSuite(
+ 'zope.traversing.namespace',
+ setUp=setUp, tearDown=tearDown,
+ checker=checker))
+ return suite
diff --git a/src/zope/traversing/tests/test_presentation.py b/src/zope/traversing/tests/test_presentation.py
index c658ca2..6299ddc 100644
--- a/src/zope/traversing/tests/test_presentation.py
+++ b/src/zope/traversing/tests/test_presentation.py
@@ -13,7 +13,7 @@
##############################################################################
"""Presentation Traverser Tests
"""
-from unittest import TestCase, main, makeSuite
+import unittest
from zope.testing.cleanup import CleanUp
from zope.interface import Interface, implementer
from zope.publisher.browser import TestRequest
@@ -38,7 +38,7 @@ class View(object):
self.content = content
-class Test(CleanUp, TestCase):
+class Test(CleanUp, unittest.TestCase):
def testView(self):
browserView(IContent, 'foo', View)
@@ -53,10 +53,3 @@ class Test(CleanUp, TestCase):
ob = Content()
r = resource(ob, TestRequest()).traverse('foo', ())
self.assertEqual(r.__class__, Resource)
-
-
-def test_suite():
- return makeSuite(Test)
-
-if __name__=='__main__':
- main(defaultTest='test_suite')
diff --git a/src/zope/traversing/tests/test_publicationtraverse.py b/src/zope/traversing/tests/test_publicationtraverse.py
index da0adf6..7f9e156 100644
--- a/src/zope/traversing/tests/test_publicationtraverse.py
+++ b/src/zope/traversing/tests/test_publicationtraverse.py
@@ -13,7 +13,8 @@
##############################################################################
"""Tests of PublicationTraverser
"""
-from unittest import TestCase, main, makeSuite
+import unittest
+
from zope.testing.cleanup import CleanUp
from zope.component import provideAdapter
from zope.interface import Interface, implementer
@@ -23,21 +24,20 @@ from zope.publisher.interfaces import NotFound
from zope.publisher.interfaces.browser import IBrowserPublisher
from zope.security.proxy import removeSecurityProxy
from zope.traversing.interfaces import ITraversable
+from zope.traversing.publicationtraverse import PublicationTraverser
-class TestPublicationTraverser(CleanUp, TestCase):
+class TestPublicationTraverser(CleanUp, unittest.TestCase):
def testViewNotFound(self):
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
self.assertRaises(NotFound, t.traverseName, request, ob, '@@foo')
def testViewFound(self):
provideAdapter(DummyViewTraverser, (Interface, Interface),
- ITraversable, name='view')
+ ITraversable, name='view')
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
proxy = t.traverseName(request, ob, '@@foo')
@@ -48,23 +48,20 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testDot(self):
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
self.assertEqual(ob, t.traverseName(request, ob, '.'))
def testNameNotFound(self):
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
self.assertRaises(NotFound, t.traverseName, request, ob, 'foo')
def testNameFound(self):
provideAdapter(DummyPublishTraverse, (Interface, Interface),
- IPublishTraverse)
+ IPublishTraverse)
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
proxy = t.traverseName(request, ob, 'foo')
@@ -76,7 +73,6 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testDirectTraversal(self):
request = TestRequest()
ob = DummyPublishTraverse(Content(), request)
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
proxy = t.traverseName(request, ob, 'foo')
view = removeSecurityProxy(proxy)
@@ -86,16 +82,14 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testPathNotFound(self):
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
self.assertRaises(NotFound, t.traversePath, request, ob, 'foo/bar')
def testPathFound(self):
provideAdapter(DummyPublishTraverse, (Interface, Interface),
- IPublishTraverse)
+ IPublishTraverse)
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
proxy = t.traversePath(request, ob, 'foo/bar')
@@ -106,9 +100,8 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testComplexPath(self):
provideAdapter(DummyPublishTraverse, (Interface, Interface),
- IPublishTraverse)
+ IPublishTraverse)
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
proxy = t.traversePath(request, ob, 'foo/../alpha//beta/./bar')
@@ -119,11 +112,11 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testTraverseRelativeURL(self):
provideAdapter(DummyPublishTraverse, (Interface, Interface),
- IPublishTraverse)
+ IPublishTraverse)
provideAdapter(DummyBrowserPublisher, (Interface,),
- IBrowserPublisher)
+ IBrowserPublisher)
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
+
t = PublicationTraverser()
request = TestRequest()
proxy = t.traverseRelativeURL(request, ob, 'foo/bar')
@@ -134,13 +127,78 @@ class TestPublicationTraverser(CleanUp, TestCase):
def testMissingSkin(self):
ob = Content()
- from zope.traversing.publicationtraverse import PublicationTraverser
t = PublicationTraverser()
request = TestRequest()
self.assertRaises(
NotFound, t.traversePath, request, ob, '/++skin++missingskin')
+ def test_traversePath_trailing_slash(self):
+ class Traverser(PublicationTraverser):
+ def __init__(self):
+ self.names = []
+
+ def traverseName(self, request, ob, name):
+ self.names.append(name)
+
+
+ t = Traverser()
+ t.traversePath(None, None, 'abc/def/')
+ self.assertEqual(t.names, ['abc', 'def'])
+
+ t = Traverser()
+ t.traversePath(None, None, 'abc/def///')
+
+ # Note that only *one* trailing slash is removed
+ self.assertEqual(t.names, ['abc', 'def', '', ''])
+
+
+ def test_traversePath_double_dots_cannot_remove(self):
+ class Traverser(PublicationTraverser):
+ def __init__(self):
+ self.names = []
+
+ def traverseName(self, request, ob, name):
+ self.names.append(name)
+
+
+ t = Traverser()
+ t.traversePath(None, None, '..')
+ self.assertEqual(t.names, ['..'])
+
+ def test_traverseRelativeURL_to_no_browser_publisher(self):
+ test = self
+ class Traverser(PublicationTraverser):
+ def traversePath(self, request, ob, path):
+ return ob
+
+
+ class Context(object):
+ called = False
+ def __conform__(self, iface):
+ self.called = True
+ test.assertEqual(iface, IBrowserPublisher)
+ return None
+
+ t = Traverser()
+ context = Context()
+ ob = t.traverseRelativeURL(None, context, None)
+ self.assertIs(ob, context)
+
+ self.assertTrue(context.called)
+
+class TestBeforeTraverseEvent(unittest.TestCase):
+
+ def test_interfaces(self):
+ from zope.traversing.interfaces import IBeforeTraverseEvent
+ from zope.traversing.interfaces import BeforeTraverseEvent
+ from zope.interface.verify import verifyObject
+
+ ob = BeforeTraverseEvent(self, self)
+ self.assertIs(self, ob.request)
+ self.assertIs(self, ob.object)
+ verifyObject(IBeforeTraverseEvent, ob)
+
class IContent(Interface):
pass
@@ -179,12 +237,4 @@ class DummyBrowserPublisher(object):
def browserDefault(self, request):
if self.context.name != 'more':
return self.context, ['more']
- else:
- return self.context, ()
-
-
-def test_suite():
- return makeSuite(TestPublicationTraverser)
-
-if __name__ == '__main__':
- main()
+ return self.context, ()
diff --git a/src/zope/traversing/tests/test_skin.py b/src/zope/traversing/tests/test_skin.py
index 405bb23..0a12825 100644
--- a/src/zope/traversing/tests/test_skin.py
+++ b/src/zope/traversing/tests/test_skin.py
@@ -13,7 +13,7 @@
##############################################################################
"""Test skin traversal.
"""
-from unittest import TestCase, main, makeSuite
+import unittest
import zope.component
from zope.testing.cleanup import CleanUp
@@ -29,7 +29,7 @@ class IFoo(Interface):
directlyProvides(IFoo, IBrowserSkinType)
-class Test(CleanUp, TestCase):
+class Test(CleanUp, unittest.TestCase):
def setUp(self):
super(Test, self).setUp()
@@ -52,9 +52,3 @@ class Test(CleanUp, TestCase):
ob = object()
traverser = skin(ob, request)
self.assertRaises(LocationError, traverser.traverse, 'bar', ())
-
-def test_suite():
- return makeSuite(Test)
-
-if __name__=='__main__':
- main(defaultTest='test_suite')
diff --git a/src/zope/traversing/tests/test_traverser.py b/src/zope/traversing/tests/test_traverser.py
index 2c81ac3..9eeb211 100644
--- a/src/zope/traversing/tests/test_traverser.py
+++ b/src/zope/traversing/tests/test_traverser.py
@@ -11,7 +11,7 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
-"""Traverser Adapter tests.
+"""Traverser Adapter tests (adapter.py)
"""
import unittest
@@ -29,6 +29,7 @@ from zope.security.checker \
from zope.security.management import newInteraction, endInteraction
from zope.traversing.adapters import Traverser, DefaultTraversable
+from zope.traversing import adapters
from zope.traversing.interfaces import ITraversable, ITraverser
from zope.traversing.testing import contained, Contained
@@ -47,9 +48,9 @@ class TraverserTests(PlacelessSetup, unittest.TestCase):
def setUp(self):
PlacelessSetup.setUp(self)
# Build up a wrapper chain
- self.root = C('root')
- self.folder = contained(C('folder'), self.root, name='folder')
- self.item = contained(C('item'), self.folder, name='item')
+ self.root = C('root')
+ self.folder = contained(C('folder'), self.root, name='folder')
+ self.item = contained(C('item'), self.folder, name='item')
self.tr = Traverser(self.item)
def testImplementsITraverser(self):
@@ -59,6 +60,9 @@ class TraverserTests(PlacelessSetup, unittest.TestCase):
for interface in implementedBy(Traverser):
verifyClass(interface, Traverser)
+ def test_traverse_empty_path_is_context(self):
+ self.assertIs(self.item, self.tr.traverse(''))
+
class UnrestrictedNoTraverseTests(unittest.TestCase):
def setUp(self):
self.root = root = C('root')
@@ -193,9 +197,11 @@ class RestrictedTraverseTests(PlacelessSetup, unittest.TestCase):
self.tr = Traverser(ProxyFactory(root))
def testAllAllowed(self):
- defineChecker(C, Checker({'folder': CheckerPublic,
- 'item': CheckerPublic,
- }))
+ defineChecker(C,
+ Checker({
+ 'folder': CheckerPublic,
+ 'item': CheckerPublic,
+ }))
tr = Traverser(ProxyFactory(self.root))
item = self.item
@@ -210,12 +216,12 @@ class RestrictedTraverseTests(PlacelessSetup, unittest.TestCase):
folder = self.folder
self.assertRaises(Unauthorized, tr.traverse,
- ('', 'folder', 'item'))
+ ('', 'folder', 'item'))
self.assertRaises(Unauthorized, tr.traverse,
- ('folder', 'item'))
+ ('folder', 'item'))
self.assertEqual(tr.traverse(('', 'folder')), folder)
self.assertEqual(tr.traverse(('folder', '..', 'folder')),
- folder)
+ folder)
self.assertEqual(tr.traverse(('folder',)), folder)
def testException(self):
@@ -230,10 +236,10 @@ class RestrictedTraverseTests(PlacelessSetup, unittest.TestCase):
# AttributeError becomes LocationError if there's no __getitem__
# on the object
self.assertRaises(LocationError, tr.traverse,
- ('foobar', 'attributeerror'))
+ ('foobar', 'attributeerror'))
# Other exceptions raised as usual
self.assertRaises(ValueError, tr.traverse,
- ('foobar', 'valueerror'))
+ ('foobar', 'valueerror'))
class DefaultTraversableTests(unittest.TestCase):
@@ -275,14 +281,37 @@ class DefaultTraversableTests(unittest.TestCase):
df = DefaultTraversable(object())
self.assertRaises(LocationError, df.traverse, u'\u2019', ())
-def test_suite():
- loader = unittest.TestLoader()
- suite = loader.loadTestsFromTestCase(TraverserTests)
- suite.addTest(loader.loadTestsFromTestCase(DefaultTraversableTests))
- suite.addTest(loader.loadTestsFromTestCase(UnrestrictedNoTraverseTests))
- suite.addTest(loader.loadTestsFromTestCase(UnrestrictedTraverseTests))
- suite.addTest(loader.loadTestsFromTestCase(RestrictedTraverseTests))
- return suite
-
-if __name__=='__main__':
- unittest.TextTestRunner().run(test_suite())
+
+class TestFunctions(unittest.TestCase):
+
+ def test_traversePathElement_UnicodeEncodeError_with_default(self):
+ test = self
+ class Traversable(object):
+ called = False
+ fail = test.fail
+ def traverse(self, nm, further_path):
+ self.called = True
+ u'\xff'.encode("ascii")
+ self.fail("Should not be reached")
+
+ t = Traversable()
+ self.assertIs(self,
+ adapters.traversePathElement(None, None, (),
+ default=self,
+ traversable=t))
+ self.assertTrue(t.called)
+
+
+ def test_traversePathElement_LocationError_with_default(self):
+ class Traversable(object):
+ called = False
+ def traverse(self, nm, further_path):
+ self.called = True
+ raise LocationError()
+
+ t = Traversable()
+ self.assertIs(self,
+ adapters.traversePathElement(None, None, (),
+ default=self,
+ traversable=t))
+ self.assertTrue(t.called)
diff --git a/src/zope/traversing/tests/test_vhosting.py b/src/zope/traversing/tests/test_vhosting.py
index 38864e2..ed393e6 100644
--- a/src/zope/traversing/tests/test_vhosting.py
+++ b/src/zope/traversing/tests/test_vhosting.py
@@ -14,17 +14,10 @@
"""Functional tests for virtual hosting.
"""
import os
-import transaction
import unittest
-try:
- from StringIO import StringIO
-except ImportError:
- from io import StringIO
+from io import StringIO
-try:
- from UserDict import UserDict
-except ImportError:
- from collections import UserDict
+import transaction
import zope.component
import zope.interface
@@ -44,7 +37,7 @@ from zope.testing.cleanup import cleanUp
from zope.traversing.adapters import traversePathElement
from zope.traversing.api import traverse
-from zope.traversing.testing import browserResource, Contained, contained
+from zope.traversing.testing import browserResource, Contained
class MyObj(Contained):
@@ -55,19 +48,19 @@ class IFolder(zope.interface.Interface):
pass
@zope.interface.implementer(IFolder, IBrowserPublisher)
-class Folder(Contained, UserDict):
+class Folder(Contained, dict):
def __init__(self):
- UserDict.__init__(self, {})
+ dict.__init__(self, {})
def __setitem__(self, name, value):
value.__parent__ = self
value.__name__ = name
- UserDict.__setitem__(self, name, value)
+ dict.__setitem__(self, name, value)
def publishTraverse(self, request, name):
subob = self.get(name, None)
if subob is None:
- raise NotFound(self.context, name, request)
+ raise NotFound(self.context, name, request) # pragma: no cover
return subob
@@ -86,11 +79,9 @@ class ZopeTraverser(object):
while path_items:
name = path_items.pop()
- if getattr(object, '__class__', None) == dict:
- object = object[name]
- else:
- object = traversePathElement(object, name, path_items,
- request=request)
+ assert getattr(object, '__class__', None) != dict
+ object = traversePathElement(object, name, path_items,
+ request=request)
return object
zopeTraverser = ZopeTraverser()
@@ -169,7 +160,7 @@ class TestVirtualHosting(unittest.TestCase):
if len(p) == 1:
env['PATH_INFO'] = p[0]
- request = BrowserRequest(StringIO(''), env)
+ request = BrowserRequest(StringIO(u''), env)
request.setPublication(DummyPublication(self.app))
setDefaultSkin(request)
return request
@@ -279,7 +270,7 @@ class TestVirtualHosting(unittest.TestCase):
self.assertEqual(result.getHeader('Location'), location)
-class DummyPublication:
+class DummyPublication(object):
def __init__(self, app):
self.app = app
@@ -307,18 +298,13 @@ class DummyPublication:
Name must be an ASCII string or Unicode object."""
if name == 'index.html':
- from zope.component import queryMultiAdapter
- view = queryMultiAdapter((ob, request), name=name)
- if view is None:
- from zope.publisher.interfaces import NotFound
- import pdb; pdb.set_trace()
- raise NotFound(ob, name)
+ from zope.component import getMultiAdapter
+ view = getMultiAdapter((ob, request), name=name)
return view
- else:
- from zope.traversing.publicationtraverse \
- import PublicationTraverserWithoutProxy
- t = PublicationTraverserWithoutProxy()
- return t.traverseName(request, ob, name)
+
+ from zope.traversing.publicationtraverse import PublicationTraverserWithoutProxy
+ t = PublicationTraverserWithoutProxy()
+ return t.traverseName(request, ob, name)
def afterTraversal(self, request, ob):
"""Post-traversal hook.
@@ -340,7 +326,7 @@ class DummyPublication:
"""Post-callObject hook (if it was successful).
"""
- def handleException(self, ob, request, exc_info, retry_allowed=1):
+ def handleException(self, ob, request, exc_info, retry_allowed=1): # pragma: no cover
"""Handle an exception
Either:
@@ -358,15 +344,4 @@ class DummyPublication:
def getDefaultTraversal(self, request, ob):
if hasattr(ob, 'index'):
return ob, ()
- else:
- return ob, ('index.html',)
-
-
-def test_suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(TestVirtualHosting))
- return suite
-
-
-if __name__ == '__main__':
- unittest.main()
+ return ob, ('index.html',)