[Zope3-checkins] CVS: Zope3/src/zope/app/traversing/tests - __init__.py:1.2 test_acquire.py:1.2 test_atteritem.py:1.2 test_conveniencefunctions.py:1.2 test_etc.py:1.2 test_namespacetrversal.py:1.2 test_objectname.py:1.2 test_physicallocationadapters.py:1.2 test_presentation.py:1.2 test_skin.py:1.2 test_traverser.py:1.2
Jim Fulton
jim@zope.com
Wed, 25 Dec 2002 09:13:59 -0500
Update of /cvs-repository/Zope3/src/zope/app/traversing/tests
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/traversing/tests
Added Files:
__init__.py test_acquire.py test_atteritem.py
test_conveniencefunctions.py test_etc.py
test_namespacetrversal.py test_objectname.py
test_physicallocationadapters.py test_presentation.py
test_skin.py test_traverser.py
Log Message:
Grand renaming:
- Renamed most files (especially python modules) to lower case.
- Moved views and interfaces into separate hierarchies within each
project, where each top-level directory under the zope package
is a separate project.
- Moved everything to src from lib/python.
lib/python will eventually go away. I need access to the cvs
repository to make this happen, however.
There are probably some bits that are broken. All tests pass
and zope runs, but I haven't tried everything. There are a number
of cleanups I'll work on tomorrow.
=== Zope3/src/zope/app/traversing/tests/__init__.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/__init__.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.
=== Zope3/src/zope/app/traversing/tests/test_acquire.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_acquire.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,61 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.app.interfaces.traversing.traversable import ITraversable
+from zope.app.traversing.defaulttraversable import DefaultTraversable
+from zope.component.adapter import provideAdapter
+from zope.proxy.context import ContextWrapper, getWrapperContext
+from zope.app.traversing.acquirenamespace import acquire
+from zope.exceptions import NotFoundError
+
+class Test(PlacelessSetup, TestCase):
+
+ def test(self):
+ provideAdapter(None, ITraversable, DefaultTraversable)
+
+ class C:
+ def __init__(self, name):
+ self.name = name
+
+ a = C('a')
+ a.a1 = C('a1')
+ a.a2 = C('a2')
+ a.a2.a21 = C('a21')
+ a.a2.a21.a211 = C('a211')
+
+ a2 = ContextWrapper(a.a2, a)
+ a21 = ContextWrapper(a.a2.a21, a2)
+ a211 = ContextWrapper(a.a2.a21.a211, a21)
+
+ acquired = acquire('a1', (), 'a1;acquire', a211, None)
+
+ self.assertEqual(acquired.name, 'a1')
+
+ self.assertRaises(NotFoundError,
+ acquire, 'a3', (), 'a1;acquire', a211, None)
+
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_atteritem.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_atteritem.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,46 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.testing.cleanup import CleanUp # Base class w registry cleanup
+
+
+class C:
+ a = 1
+ def __getitem__(self, key): return key+'value'
+c=C()
+
+
+class Test(CleanUp, TestCase):
+
+ def testAttr(self):
+ from zope.app.traversing.attritemnamespaces import attr
+ self.assertEqual(attr('a', (), 'a;attribute', c, None), 1)
+
+ def testItem(self):
+ from zope.app.traversing.attritemnamespaces import item
+ self.assertEqual(item('a', (), 'a;item', c, None), 'avalue')
+
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_conveniencefunctions.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_conveniencefunctions.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,291 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.proxy.context import ContextWrapper
+from zope.app.traversing.traverser import Traverser
+from zope.component import getService
+
+from zope.app.interfaces.traversing.traverser import ITraverser
+from zope.app.interfaces.traversing.traversable import ITraversable
+from zope.app.traversing.defaulttraversable import DefaultTraversable
+from zope.app.traversing.objectname import IObjectName, ObjectName
+
+from zope.app.interfaces.traversing.physicallylocatable import IPhysicallyLocatable
+from zope.app.interfaces.traversing.containmentroot import IContainmentRoot
+from zope.app.traversing.physicallocationadapters \
+ import WrapperPhysicallyLocatable, RootPhysicallyLocatable
+
+from zope.security.proxy import Proxy
+from zope.security.checker import selectChecker
+
+from zope.exceptions import NotFoundError
+
+class C:
+ def __init__(self, name):
+ self.name = name
+
+def _proxied(*args):
+ return Proxy(args, selectChecker(args))
+
+
+class Test(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ # Build up a wrapper chain
+ root = C('root')
+ root.__implements__ = IContainmentRoot
+ folder = C('folder')
+ item = C('item')
+
+ self.root = ContextWrapper(root, None)
+ self.folder = ContextWrapper(folder, self.root, name='folder')
+ self.item = ContextWrapper(item, self.folder, name='item')
+ self.unwrapped_item = item
+
+ root.folder = folder
+ folder.item = item
+
+ self.tr = Traverser(root)
+ getService(None, "Adapters").provideAdapter(
+ None, ITraverser, Traverser)
+ getService(None, "Adapters").provideAdapter(
+ None, ITraversable, DefaultTraversable)
+ getService(None, "Adapters").provideAdapter(
+ None, IObjectName, ObjectName)
+ getService(None, "Adapters").provideAdapter(
+ None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ getService(None, "Adapters").provideAdapter(
+ IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)
+
+
+ def testTraverse(self):
+ from zope.app.traversing import traverse
+ self.assertEqual(
+ traverse(self.item, '/folder/item'),
+ self.tr.traverse('/folder/item')
+ )
+
+ def testTraverseFromUnwrapped(self):
+ from zope.app.traversing import traverse
+ self.assertRaises(
+ TypeError,
+ traverse,
+ self.unwrapped_item, '/folder/item'
+ )
+
+ def testTraverseName(self):
+ from zope.app.traversing import traverseName
+ self.assertEqual(
+ traverseName(self.folder, 'item'),
+ self.tr.traverse('/folder/item')
+ )
+ self.assertEqual(
+ traverseName(self.item, '.'),
+ self.tr.traverse('/folder/item')
+ )
+
+ def testTraverseNameBadValue(self):
+ from zope.app.traversing import traverseName
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, '../root'
+ )
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, '/root'
+ )
+ self.assertRaises(
+ NotFoundError,
+ traverseName,
+ self.folder, './item'
+ )
+
+ def testObjectName(self):
+ from zope.app.traversing import objectName
+ self.assertEqual(
+ objectName(self.item),
+ 'item'
+ )
+
+ def testObjectNameFromUnwrapped(self):
+ from zope.app.traversing import objectName
+ self.assertRaises(
+ TypeError,
+ objectName,
+ self.unwrapped_item
+ )
+
+ def testGetParent(self):
+ from zope.app.traversing import getParent
+ self.assertEqual(
+ getParent(self.item),
+ self.folder
+ )
+
+ def testGetParentFromUnwrapped(self):
+ from zope.app.traversing import getParent
+ self.assertRaises(
+ TypeError,
+ getParent,
+ self.unwrapped_item
+ )
+
+ def testGetParents(self):
+ from zope.app.traversing import getParents
+ self.assertEqual(
+ getParents(self.item),
+ [self.folder, self.root]
+ )
+
+
+ def testGetParentsFromUnwrapped(self):
+ from zope.app.traversing import getParents
+ self.assertRaises(
+ TypeError,
+ getParents,
+ self.unwrapped_item
+ )
+
+ def testGetParentFromUnwrapped(self):
+ from zope.app.traversing import getParent
+ self.assertRaises(
+ TypeError,
+ getParent,
+ self.unwrapped_item
+ )
+
+ def testGetPhysicalPath(self):
+ from zope.app.traversing import getPhysicalPath
+ self.assertEqual(
+ getPhysicalPath(self.item),
+ ('', 'folder', 'item')
+ )
+
+ def testGetPhysicalPathString(self):
+ from zope.app.traversing import getPhysicalPathString
+ self.assertEqual(
+ getPhysicalPathString(self.item),
+ u'/folder/item'
+ )
+
+ def testGetPhysicalPathOfRoot(self):
+ from zope.app.traversing import getPhysicalPath
+ self.assertEqual(
+ getPhysicalPath(self.root),
+ ('',)
+ )
+
+ def testGetPhysicalPathStringOfRoot(self):
+ from zope.app.traversing import getPhysicalPathString
+ self.assertEqual(
+ getPhysicalPathString(self.root),
+ u'/',
+ )
+
+ def testGetPhysicalRoot(self):
+ from zope.app.traversing import getPhysicalRoot
+ self.assertEqual(
+ getPhysicalRoot(self.item),
+ self.root
+ )
+
+ _bad_locations = (
+ (UnicodeError, ('',u'123','\xa323')),
+ (UnicodeError, '\xa323'),
+ (ValueError, ()),
+ (ValueError, 23),
+ (ValueError, ''),
+ (ValueError, '//'),
+## (AssertionError, '/foo//bar'),
+
+ # regarding the next four errors:
+ # having a trailing slash on a location is undefined.
+ # we might want to give it a particular meaning for zope3 later
+ # for now, it is an invalid location identifier
+ (ValueError, '/foo/bar/'),
+ (ValueError, 'foo/bar/'),
+ (ValueError, ('','foo','bar','')),
+ (ValueError, ('foo','bar',''))
+ )
+
+ # sequence of N-tuples:
+ # (loc_returned_as_string, loc_returned_as_tuple, input, input, ...)
+ # The string and tuple are tested as input as well as being the
+ # specification for output.
+
+ _good_locations = (
+ # location returned as string location returned as tuple
+ ( u'xx/yy/zz', (u'xx',u'yy',u'zz'),
+ # arguments to try in addition to the above
+ ('xx','yy','zz'),
+ 'xx/yy/zz',
+ ),
+ ( u'/xx/yy/zz', (u'',u'xx',u'yy',u'zz'),
+ ('','xx','yy','zz'),
+ '/xx/yy/zz',
+ _proxied('','xx','yy','zz'),
+ ),
+ ( u'xx', (u'xx',),
+ ('xx',),
+ 'xx',
+ ),
+ ( u'/', (u'',),
+ ('',),
+ '/',
+ ),
+ )
+
+ def testLocationAsTuple(self):
+ from zope.app.traversing import locationAsTuple as lat
+
+ for error_type, value in self._bad_locations:
+ self.assertRaises(error_type, lat, value)
+
+ for spec in self._good_locations:
+ correct_answer = spec[1]
+ for argument in spec:
+ self.applyAssertEqual(lat, argument, correct_answer)
+
+ def testLocationAsUnicode(self):
+ from zope.app.traversing import locationAsUnicode as lau
+
+ for error_type, value in self._bad_locations:
+ self.assertRaises(error_type, lau, value)
+
+ for spec in self._good_locations:
+ correct_answer = spec[0]
+ for argument in spec:
+ self.applyAssertEqual(lau, argument, correct_answer)
+
+ def applyAssertEqual(self, func, arg, answer):
+ try:
+ self.assertEqual(func(arg), answer)
+ except:
+ print "Failure on ", arg
+ raise
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_etc.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_etc.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,48 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.testing.cleanup import CleanUp # Base class w registry cleanup
+
+class Test(CleanUp, TestCase):
+
+ def testApplicationControl(self):
+ from zope.app.traversing.etcnamespace import etc
+ from zope.app.applicationcontrol.applicationcontrol \
+ import applicationController, applicationControllerRoot
+
+ self.assertEqual(
+ etc('ApplicationController', (), '++etc++ApplicationController',
+ applicationControllerRoot, None),
+ applicationController)
+
+ def testServices(self):
+ from zope.app.traversing.etcnamespace import etc
+ class C:
+ def getServiceManager(self): return 42
+
+ self.assertEqual(etc('Services', (), 'etc:Services', C(), None), 42)
+
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_namespacetrversal.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_namespacetrversal.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,75 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.testing.cleanup import CleanUp # Base class w registry cleanup
+
+class C:
+ a = 1
+ def __getitem__(self, key): return key+'value'
+
+c=C()
+
+
+class Test(CleanUp, TestCase):
+
+ def setUp(self):
+ from zope.app.traversing.namespaces import provideNamespaceHandler
+ from zope.app.traversing.attritemnamespaces import attr, item
+ from zope.app.traversing.skinnamespace import skin
+ provideNamespaceHandler('attribute', attr)
+ provideNamespaceHandler('item', item)
+ provideNamespaceHandler('skin', skin)
+
+ def testAttr(self):
+ from zope.app.traversing.traverser import Traverser
+ traverser = Traverser(c)
+ v = traverser.traverse('++attribute++a')
+ self.assertEqual(v, 1)
+
+ def testItem(self):
+ from zope.app.traversing.traverser import Traverser
+ traverser = Traverser(c)
+ v = traverser.traverse('++item++a')
+ self.assertEqual(v, 'avalue')
+
+ def testSideEffectsContextDetail(self):
+ # Check to make sure that when we traverse something in context,
+ # that we get the right context for the result.
+ from zope.proxy.context \
+ import ContextWrapper, getWrapperContainer
+ from zope.app.traversing.traverser import Traverser
+ from zope.publisher.browser import TestRequest
+
+ c1 = C()
+ c2 = C()
+ c2c1 = ContextWrapper(c2, c1)
+
+ traverser = Traverser(c2c1)
+ v = traverser.traverse('++skin++ZopeTop', request=TestRequest())
+ self.assertEqual(v, c2)
+ self.failUnless(getWrapperContainer(v) is c2c1)
+
+
+def test_suite():
+ return makeSuite(Test)
+
+
+if __name__ == '__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_objectname.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_objectname.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,66 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Test the ObjectName adapter
+
+Revision information:
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.interface import Interface
+
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component import getService, getAdapter
+
+from zope.proxy.context import ContextWrapper
+
+from zope.app.traversing.objectname \
+ import IObjectName, ObjectName, SiteObjectName
+
+class IRoot(Interface): pass
+
+class Root:
+ __implements__ = IRoot
+
+class TrivialContent(object):
+ """Trivial content object, used because instances of object are rocks."""
+
+class Test(PlacelessSetup, TestCase):
+
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+
+ provideAdapter = getService(None, "Adapters").provideAdapter
+ provideAdapter(None, IObjectName, [ObjectName])
+ provideAdapter(IRoot, IObjectName, [ObjectName])
+
+ def testAdapterBadObject(self):
+ adapter = getAdapter(None, IObjectName)
+ self.assertRaises(TypeError, adapter)
+
+ def testAdapterNoContext(self):
+ adapter = getAdapter(Root(), IObjectName)
+ self.assertRaises(TypeError, adapter)
+
+ def testAdapterBasicContext(self):
+ content = ContextWrapper(TrivialContent(), Root(), name='a')
+ content = ContextWrapper(TrivialContent(), content, name='b')
+ content = ContextWrapper(TrivialContent(), content, name='c')
+ adapter = getAdapter(content, IObjectName)
+ self.assertEqual(adapter(), 'c')
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_physicallocationadapters.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:58 2002
+++ Zope3/src/zope/app/traversing/tests/test_physicallocationadapters.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,100 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component.adapter import provideAdapter
+from zope.component import getAdapter
+
+from zope.app.interfaces.traversing.containmentroot import IContainmentRoot
+from zope.app.interfaces.traversing.physicallylocatable import IPhysicallyLocatable
+from zope.app.traversing.physicallocationadapters \
+ import WrapperPhysicallyLocatable, RootPhysicallyLocatable
+from zope.proxy.context import ContextWrapper
+
+class Root: __implements__ = IContainmentRoot
+class C: pass
+
+class Test(PlacelessSetup, TestCase):
+
+ def test(self):
+ provideAdapter(None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ provideAdapter(IContainmentRoot, IPhysicallyLocatable,
+ RootPhysicallyLocatable)
+
+ root = Root()
+ f1 = ContextWrapper(C(), root, name='f1')
+ f2 = ContextWrapper(C(), f1, name='f2')
+ f3 = ContextWrapper(C(), f2, name='f3')
+
+ adapter = getAdapter(f3, IPhysicallyLocatable)
+
+ self.assertEqual(adapter.getPhysicalPath(), ('', 'f1', 'f2', 'f3'))
+ self.assertEqual(adapter.getPhysicalRoot(), root)
+
+ adapter = getAdapter(C(), IPhysicallyLocatable)
+ self.assertRaises(TypeError, adapter.getPhysicalPath)
+ self.assertRaises(TypeError, adapter.getPhysicalRoot)
+
+ def testWSideEffectDataInFront(self):
+ provideAdapter(None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ provideAdapter(IContainmentRoot, IPhysicallyLocatable,
+ RootPhysicallyLocatable)
+
+ root = Root()
+ root = ContextWrapper(root, root, name='.',
+ side_effect_name="++skin++ZopeTop")
+ f1 = ContextWrapper(C(), root, name='f1')
+ f2 = ContextWrapper(C(), f1, name='f2')
+ f3 = ContextWrapper(C(), f2, name='f3')
+
+ adapter = getAdapter(f3, IPhysicallyLocatable)
+
+ self.assertEqual(adapter.getPhysicalPath(), ('', 'f1', 'f2', 'f3'))
+ self.assertEqual(adapter.getPhysicalRoot(), root)
+
+ adapter = getAdapter(C(), IPhysicallyLocatable)
+ self.assertRaises(TypeError, adapter.getPhysicalPath)
+ self.assertRaises(TypeError, adapter.getPhysicalRoot)
+
+ def testWSideEffectDataInMiddle(self):
+ provideAdapter(None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ provideAdapter(IContainmentRoot, IPhysicallyLocatable,
+ RootPhysicallyLocatable)
+
+ root = Root()
+ c = C()
+ f1 = ContextWrapper(c, root, name='f1')
+ f1 = ContextWrapper(c, f1, name='.',
+ side_effect_name="++skin++ZopeTop")
+ f2 = ContextWrapper(C(), f1, name='f2')
+ f3 = ContextWrapper(C(), f2, name='f3')
+
+ adapter = getAdapter(f3, IPhysicallyLocatable)
+
+ self.assertEqual(adapter.getPhysicalPath(), ('', 'f1', 'f2', 'f3'))
+ self.assertEqual(adapter.getPhysicalRoot(), root)
+
+ adapter = getAdapter(C(), IPhysicallyLocatable)
+ self.assertRaises(TypeError, adapter.getPhysicalPath)
+ self.assertRaises(TypeError, adapter.getPhysicalRoot)
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_presentation.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:59 2002
+++ Zope3/src/zope/app/traversing/tests/test_presentation.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,71 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component.view import provideView
+from zope.component.resource import provideResource
+from zope.app.traversing.presentationnamespaces import view, resource
+from zope.exceptions import NotFoundError
+from zope.interface import Interface
+
+class IContent(Interface): pass
+class IPresentationType(Interface): pass
+
+class Content: __implements__ = IContent
+
+class Resource:
+
+ def __init__(self, request): pass
+ __implements__ = IPresentationType
+
+class View:
+ __implements__ = IPresentationType
+
+ def __init__(self, content, request):
+ self.content = content
+
+class Request:
+
+ def getPresentationType(self): return IPresentationType
+ def getPresentationSkin(self): return ''
+
+
+class Test(PlacelessSetup, TestCase):
+
+ def testView(self):
+ provideView(IContent, 'foo', IPresentationType, [View])
+
+ ob = Content()
+ v = view('foo', (), '@@foo', ob, Request())
+ self.assertEqual(v.__class__, View)
+
+ def testResource(self):
+ provideResource('foo', IPresentationType, Resource)
+
+ ob = Content()
+ r = resource('foo', (), '++resource++foo', ob, Request())
+ self.assertEqual(r.__class__, Resource)
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_skin.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:59 2002
+++ Zope3/src/zope/app/traversing/tests/test_skin.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,40 @@
+##############################################################################
+#
+# 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
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.testing.cleanup import CleanUp # Base class w registry cleanup
+from zope.publisher.browser import TestRequest
+
+class Test(CleanUp, TestCase):
+
+ def test(self):
+ from zope.app.traversing.skinnamespace import skin
+
+ request = TestRequest()
+ self.assertEqual(request.getPresentationSkin(), '')
+ ob = object()
+ ob2 = skin('foo', (), '++skin++foo', ob, request)
+ self.assertEqual(ob, ob2)
+ self.assertEqual(request.getPresentationSkin(), 'foo')
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/traversing/tests/test_traverser.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:59 2002
+++ Zope3/src/zope/app/traversing/tests/test_traverser.py Wed Dec 25 09:13:27 2002
@@ -0,0 +1,245 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+
+import unittest
+from zope.app.interfaces.traversing.traverser import ITraverser
+from zope.app.interfaces.traversing.traversable import ITraversable
+from zope.app.traversing.traverser import Traverser
+from zope.app.traversing.defaulttraversable import DefaultTraversable
+
+from zope.app.interfaces.traversing.physicallylocatable import IPhysicallyLocatable
+from zope.app.interfaces.traversing.containmentroot import IContainmentRoot
+from zope.app.traversing.physicallocationadapters \
+ import WrapperPhysicallyLocatable, RootPhysicallyLocatable
+
+from zope.proxy.context import ContextWrapper
+from zope.exceptions import NotFoundError, Unauthorized
+from zope.component import getService
+from zope.security.securitymanagement \
+ import setSecurityPolicy, noSecurityManager
+
+from zope.interface.verify import verifyClass
+from zope.interface.implements import instancesOfObjectImplements
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.security.checker \
+ import ProxyFactory, defineChecker, NamesChecker, CheckerPublic, Checker
+from zope.security.securitymanagement import newSecurityManager
+
+class C:
+ def __init__(self, name):
+ self.name = name
+
+class TraverserTests(PlacefulSetup, unittest.TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ # Build up a wrapper chain
+ self.root = C('root')
+ self.folder = ContextWrapper(C('folder'), self.root, name='folder')
+ self.item = ContextWrapper(C('item'), self.folder, name='item')
+ self.tr = Traverser(self.item)
+
+ def testImplementsITraverser(self):
+ self.failUnless(ITraverser.isImplementedBy(self.tr))
+
+ def testVerifyInterfaces(self):
+ for interface in instancesOfObjectImplements(Traverser):
+ verifyClass(interface, Traverser)
+
+class UnrestrictedNoTraverseTests(unittest.TestCase):
+ def setUp(self):
+ self.root = root = C('root')
+ self.root.__implements__ = IContainmentRoot
+ self.folder = folder = C('folder')
+ self.item = item = C('item')
+
+ root.folder = folder
+ folder.item = item
+
+ self.tr = Traverser(root)
+
+ def testNoTraversable(self):
+ self.assertRaises(NotFoundError, self.tr.traverse,
+ 'folder')
+
+class UnrestrictedTraverseTests(PlacefulSetup, unittest.TestCase):
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ # Build up a wrapper chain
+
+ getService(None, "Adapters").provideAdapter(
+ None, ITraversable, DefaultTraversable)
+ getService(None, "Adapters").provideAdapter(
+ None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ getService(None, "Adapters").provideAdapter(
+ IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)
+
+ self.root = root = C('root')
+ self.root.__implements__ = IContainmentRoot
+ self.folder = folder = C('folder')
+ self.item = item = C('item')
+
+ root.folder = folder
+ folder.item = item
+
+ self.tr = Traverser(root)
+
+ def testSimplePathString(self):
+ tr = self.tr
+ item = self.item
+
+ self.assertEquals(tr.traverse('/folder/item'), item)
+ self.assertEquals(tr.traverse('folder/item'), item)
+ self.assertEquals(tr.traverse('/folder/item/'), item)
+
+ def testSimplePathUnicode(self):
+ tr = self.tr
+ item = self.item
+
+ self.assertEquals(tr.traverse(u'/folder/item'), item)
+ self.assertEquals(tr.traverse(u'folder/item'), item)
+ self.assertEquals(tr.traverse(u'/folder/item/'), item)
+
+ def testSimplePathTuple(self):
+ tr = self.tr
+ item = self.item
+
+ self.assertEquals(tr.traverse(('', 'folder', 'item')),
+ item)
+ self.assertEquals(tr.traverse(('folder', 'item')), item)
+
+ def testComplexPathString(self):
+ tr = self.tr
+ item = self.item
+
+ self.assertEquals(tr.traverse('/folder/../folder/./item'),
+ item)
+ self.assertEquals(tr.traverse(
+ '/../folder/../../folder/item'), item)
+ self.assertEquals(tr.traverse('../../folder/item'), item)
+
+ def testNotFoundDefault(self):
+ self.assertEquals(self.tr.traverse('foo', 'notFound'),
+ 'notFound')
+
+ def testNotFoundNoDefault(self):
+ self.assertRaises(NotFoundError, self.tr.traverse, 'foo')
+
+def Denied(*names):
+
+ def check(name):
+ if name in names:
+ return 'Waaaa'
+ return CheckerPublic
+
+ return Checker(check)
+
+class RestrictedTraverseTests(PlacefulSetup, unittest.TestCase):
+ _oldPolicy = None
+ _deniedNames = ()
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+
+ getService(None,"Adapters").provideAdapter(
+ None, ITraversable, DefaultTraversable)
+ getService(None, "Adapters").provideAdapter(
+ None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ getService(None, "Adapters").provideAdapter(
+ IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)
+
+ self.root = root = C('root')
+ root.__implements__ = IContainmentRoot
+ self.folder = folder = C('folder')
+ self.item = item = C('item')
+
+ root.folder = folder
+ folder.item = item
+
+ self.tr = Traverser(ProxyFactory(root))
+
+ def testAllAllowed(self):
+ defineChecker(C, Checker(lambda name: CheckerPublic))
+ tr = Traverser(ProxyFactory(self.root))
+ item = self.item
+
+ self.assertEquals(tr.traverse(('', 'folder', 'item')), item)
+ self.assertEquals(tr.traverse(('folder', 'item')), item)
+
+ def testItemDenied(self):
+ newSecurityManager('no one')
+ defineChecker(C, Denied('item'))
+ tr = Traverser(ProxyFactory(self.root))
+ folder = self.folder
+
+ self.assertRaises(Unauthorized, tr.traverse,
+ ('', 'folder', 'item'))
+ self.assertRaises(Unauthorized, tr.traverse,
+ ('folder', 'item'))
+ self.assertEquals(tr.traverse(('', 'folder')), folder)
+ self.assertEquals(tr.traverse(('folder', '..', 'folder')),
+ folder)
+ self.assertEquals(tr.traverse(('folder',)), folder)
+
+class DefaultTraversableTests(unittest.TestCase):
+ def testImplementsITraversable(self):
+ self.failUnless(ITraversable.isImplementedBy(DefaultTraversable(None)))
+
+ def testVerifyInterfaces(self):
+ for interface in instancesOfObjectImplements(DefaultTraversable):
+ verifyClass(interface, DefaultTraversable)
+
+ def testAttributeTraverse(self):
+ root = C('root')
+ item = C('item')
+ root.item = item
+ df = DefaultTraversable(root)
+
+ further = []
+ next = df.traverse('item', (), 'item', further)
+ self.failUnless(next is item)
+ self.assertEquals(further, [])
+
+ def testDictionaryTraverse(self):
+ dict = {}
+ foo = C('foo')
+ dict['foo'] = foo
+ df = DefaultTraversable(dict)
+
+ further = []
+ next = df.traverse('foo', (), 'foo', further)
+ self.failUnless(next is foo)
+ self.assertEquals(further, [])
+
+ def testNotFound(self):
+ df = DefaultTraversable(C('dummy'))
+
+ self.assertRaises(NotFoundError, df.traverse, 'bar', (), 'bar', [])
+
+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())