[Zope3-checkins] CVS: Zope3/src/zope/app/publication/tests - __init__.py:1.2 test_browserpublication.py:1.2 test_simplecomponenttraverser.py:1.2 test_zopepublication.py:1.2

Jim Fulton jim@zope.com
Wed, 25 Dec 2002 09:14:09 -0500


Update of /cvs-repository/Zope3/src/zope/app/publication/tests
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/publication/tests

Added Files:
	__init__.py test_browserpublication.py 
	test_simplecomponenttraverser.py test_zopepublication.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/publication/tests/__init__.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:09 2002
+++ Zope3/src/zope/app/publication/tests/__init__.py	Wed Dec 25 09:13:08 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.


=== Zope3/src/zope/app/publication/tests/test_browserpublication.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:09 2002
+++ Zope3/src/zope/app/publication/tests/test_browserpublication.py	Wed Dec 25 09:13:08 2002
@@ -0,0 +1,302 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+import unittest
+
+from zope.interface import Interface
+
+from zope.component import getService, getServiceManager
+
+from zope.publisher.publish import publish
+from zope.publisher.browser import TestRequest
+from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces.browser import IBrowserPresentation
+
+from zope.proxy.context import getWrapperContext, wrapperTypes
+from zope.proxy.introspection import removeAllProxies
+
+from zope.security.checker import defineChecker, NamesChecker
+
+from zope.app.security.registries.principalregistry import principalRegistry
+from zope.app.security.grants.principalrolemanager \
+     import principalRoleManager
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.publication.browser import BrowserPublication
+from zope.app.publication.traversers import TestTraverser
+from zope.app.publication.tests.test_zopepublication \
+     import BasePublicationTests as BasePublicationTests_
+
+
+def foo():
+    " "
+    return '<html><body>hello base fans</body></html>'
+
+class DummyPublished:
+
+    __implements__ = IBrowserPublisher
+
+    def publishTraverse(self, request, name):
+        if name == 'bruce':
+            return foo
+        raise KeyError, name
+
+    def browserDefault(self, request):
+        return self, ['bruce']
+
+class DummyView(DummyPublished, BrowserView):
+
+    __implements__ = DummyPublished.__implements__, BrowserView.__implements__
+
+
+class BasePublicationTests(BasePublicationTests_):
+
+    def _createRequest(self, path, publication, **kw):
+        request = TestRequest(PATH_INFO=path, **kw)
+        request.setPublication(publication)
+        return request
+
+
+class BrowserDefaultTests(BasePublicationTests):
+    """
+    test browser default
+
+    many views lead to a default view
+    <base href="/somepath/@@view/view_method">
+
+    """
+    klass = BrowserPublication
+
+    def testBaseTagNoBase(self):
+        self._testBaseTags('/somepath/@@view/', '')
+
+    def testBaseTag1(self):
+        self._testBaseTags('/somepath/@@view',
+                           'http://127.0.0.1/somepath/@@view/bruce')
+
+    def testBaseTag2(self):
+        self._testBaseTags('/somepath/',
+                           'http://127.0.0.1/somepath/@@view/bruce')
+
+    def testBaseTag3(self):
+        self._testBaseTags('/somepath',
+                           'http://127.0.0.1/somepath/@@view/bruce')
+
+
+
+    def _testBaseTags(self, url, expected):
+
+        class I1(Interface): pass
+
+        from persistence import Persistent
+
+        class O1(Persistent):
+            __implements__ = I1
+
+
+        pub = BrowserPublication(self.db)
+
+        getService(None,'Views').provideView(I1, 'view',
+                           IBrowserPresentation, [DummyView])
+        getService(None,'Views').setDefaultViewName(I1,
+                             IBrowserPresentation, 'view')
+        getService(None, 'Views').provideView(None,
+                    '_traverse', IBrowserPresentation, [TestTraverser])
+
+        ob = O1()
+
+        ## the following is for running the tests standalone
+        principalRegistry.defineDefaultPrincipal(
+            'tim', 'timbot', 'ai at its best')
+
+        principalRoleManager.assignRoleToPrincipal('Manager', 'tim')
+
+
+        # now place our object inside the application
+        from transaction import get_transaction
+
+        connection = self.db.open()
+        app = connection.root()['Application']
+        app.somepath = ob
+        get_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 _createRequest(self, path, publication, **kw):
+        request = TestRequest(PATH_INFO=path, **kw)
+        request.setPublication(publication)
+        return request
+
+
+
+class SimpleObject:
+    def __init__(self, v):
+        self.v = v
+
+class I1(Interface):
+    pass
+
+class mydict(dict):
+    __implements__ = I1
+
+
+class BrowserPublicationTests(BasePublicationTests):
+
+    klass = BrowserPublication
+
+    def testNativeTraverseNameWrapping(self):
+        pub = self.klass(self.db)
+        ob = DummyPublished()
+        ob2 = pub.traverseName(self._createRequest('/bruce',pub), ob, 'bruce')
+        self.failUnless(ob2 is not ob)
+        self.failUnless(type(ob2) in wrapperTypes)
+
+    def testAdaptedTraverseNameWrapping(self):
+
+        class Adapter:
+            " "
+            __implements__ = IBrowserPublisher
+            def __init__(self, context, request):
+                self.context = context
+                self.counter = 0
+
+            def publishTraverse(self, request, name):
+                self.counter+=1
+                return self.context[name]
+
+        provideView=getService(None, "Views").provideView
+        provideView(I1, '_traverse', IBrowserPresentation, [Adapter])
+        ob = mydict()
+        ob['bruce'] =  SimpleObject('bruce')
+        ob['bruce2'] =  SimpleObject('bruce2')
+        pub = self.klass(self.db)
+        ob2 = pub.traverseName(self._createRequest('/bruce',pub), ob, 'bruce')
+        self.failUnless(type(ob2) in wrapperTypes)
+        unw = removeAllProxies(ob2)
+        self.assertEqual(unw.v, 'bruce')
+
+    def testAdaptedTraverseDefaultWrapping(self):
+        # Test default content and make sure that it's wrapped.
+        class Adapter:
+            __implements__ = IBrowserPublisher
+            def __init__(self, context, request):
+                self.context = context
+
+            def browserDefault(self, request):
+                return (self.context['bruce'], 'dummy')
+
+        provideView=getService(None, "Views").provideView
+        provideView(I1, '_traverse', IBrowserPresentation, [Adapter])
+        ob = mydict()
+        ob['bruce'] =  SimpleObject('bruce')
+        ob['bruce2'] =  SimpleObject('bruce2')
+        pub = self.klass(self.db)
+        ob2, x = pub.getDefaultTraversal(self._createRequest('/bruce',pub), ob)
+        self.assertEqual(x, 'dummy')
+        self.failUnless(type(ob2) in wrapperTypes)
+        unw = removeAllProxies(ob2)
+        self.assertEqual(unw.v, 'bruce')
+
+
+    # XXX we no longer support path parameters! (At least for now)
+    def XXXtestTraverseSkinExtraction(self):
+        class I1(Interface): pass
+        class C: __implements__ = I1
+        class BobView(DummyView): pass
+
+        pub = self.klass(self.db)
+        ob = C()
+        provideView=getService(None, "Views").provideView
+        provideView(I1, 'edit', IBrowserPresentation, [BobView])
+
+        r = self._createRequest('/@@edit;skin=zmi',pub)
+        ob2 = pub.traverseName(r , ob, '@@edit;skin=zmi')
+        self.assertEqual(r.getPresentationSkin(), 'zmi')
+        self.assertEqual(ob2.__class__ , BobView)
+
+        r = self._createRequest('/@@edit;skin=zmi',pub)
+        ob2 = pub.traverseName(r , ob, '@@edit;skin=zmi')
+        self.assertEqual(r.getPresentationSkin(), 'zmi')
+        self.assertEqual(ob2.__class__ , BobView)
+
+    def testTraverseName(self):
+        pub = self.klass(self.db)
+        class C:
+            x = SimpleObject(1)
+        ob = C()
+        r = self._createRequest('/x',pub)
+        provideView=getService(None, "Views").provideView
+        provideView(None, '_traverse', IBrowserPresentation, [TestTraverser])
+        ob2 = pub.traverseName(r, ob, 'x')
+        self.assertEqual(removeAllProxies(ob2).v, 1)
+        self.assertEqual(getWrapperContext(ob2), ob)
+
+    def testTraverseNameView(self):
+        pub = self.klass(self.db)
+        class I(Interface): pass
+        class C:
+            __implements__ = I
+        ob = C()
+        class V:
+            def __init__(self, context, request): pass
+            __implements__ = IBrowserPresentation
+        r = self._createRequest('/@@spam',pub)
+        provideView=getService(None, "Views").provideView
+        provideView(I, 'spam', IBrowserPresentation, [V])
+        ob2 = pub.traverseName(r, ob, '@@spam')
+        self.assertEqual(removeAllProxies(ob2).__class__, V)
+        self.assertEqual(getWrapperContext(ob2), ob)
+
+    def testTraverseNameServices(self):
+        pub = self.klass(self.db)
+        class C:
+            def getServiceManager(self):
+                return SimpleObject(1)
+        ob = C()
+        r = self._createRequest('/++etc++Services',pub)
+        ob2 = pub.traverseName(r, ob, '++etc++Services')
+        self.assertEqual(removeAllProxies(ob2).v, 1)
+        self.assertEqual(getWrapperContext(ob2), ob)
+
+    def testTraverseNameApplicationControl(self):
+        from zope.app.applicationcontrol.applicationcontrol \
+             import applicationController, applicationControllerRoot
+        pub = self.klass(self.db)
+        r = self._createRequest('/++etc++ApplicationController',pub)
+        ac = pub.traverseName(r,
+                              applicationControllerRoot,
+                              '++etc++ApplicationController')
+        self.assertEqual(ac, applicationController)
+        r = self._createRequest('/++etc++ApplicationController',pub)
+        app = r.publication.getApplication(r)
+        self.assertEqual(app, applicationControllerRoot)
+
+
+def test_suite():
+    t2 = unittest.makeSuite(BrowserPublicationTests, 'test')
+    t3 = unittest.makeSuite(BrowserDefaultTests, 'test')
+    return unittest.TestSuite((t2, t3))
+
+
+if __name__ == '__main__':
+    unittest.TextTestRunner().run( test_suite() )


=== Zope3/src/zope/app/publication/tests/test_simplecomponenttraverser.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:09 2002
+++ Zope3/src/zope/app/publication/tests/test_simplecomponenttraverser.py	Wed Dec 25 09:13:08 2002
@@ -0,0 +1,83 @@
+##############################################################################
+#
+# 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, sys
+from zope.component.tests.request import Request
+from zope.app.publication.traversers import SimpleComponentTraverser
+from zope.component import getService
+from zope.interface import Interface
+from zope.exceptions import NotFoundError
+from zope.app.tests.placelesssetup import PlacelessSetup
+
+class I(Interface):
+    pass
+
+
+class Container:
+    def __init__(self, **kw):
+        for k in kw:
+            setattr(self, k , kw[k])
+
+    def get(self, name, default=None):
+        return getattr(self, name, default)
+
+
+class Request(Request):
+    def getEffectiveURL(self):
+        return ''
+
+
+class View:
+    def __init__(self, comp, request):
+        self._comp = comp
+
+
+class Test(PlacelessSetup, unittest.TestCase):
+    def testAttr(self):
+        # test container traver
+        foo = Container()
+        c   = Container( foo=foo )
+        req = Request( I, '')
+
+        T = SimpleComponentTraverser(c, req)
+
+        self.assertRaises(NotFoundError , T.publishTraverse, req ,'foo')
+
+
+    def testView(self):
+        # test getting a view
+        foo = Container()
+        c   = Container( foo=foo )
+        req = Request( I, '')
+
+        T = SimpleComponentTraverser(c, req)
+        getService(None,"Views").provideView(None , 'foo', I, [View])
+
+        self.failUnless(T.publishTraverse(req,'foo').__class__ is View )
+
+        self.assertRaises(NotFoundError , T.publishTraverse, req ,'morebar')
+
+
+
+def test_suite():
+    loader = unittest.TestLoader()
+    return loader.loadTestsFromTestCase(Test)
+
+
+if __name__ == '__main__':
+    unittest.TextTestRunner().run(test_suite())


=== Zope3/src/zope/app/publication/tests/test_zopepublication.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:09 2002
+++ Zope3/src/zope/app/publication/tests/test_zopepublication.py	Wed Dec 25 09:13:08 2002
@@ -0,0 +1,189 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+import unittest
+
+from zope.interface.verify import verifyClass
+from zope.interface.implements import instancesOfObjectImplements
+
+from zodb.storage.mapping import DB
+
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component.adapter import provideAdapter
+
+from zope.interfaces.i18n import IUserPreferredCharsets
+
+from zope.publisher.base import TestPublication
+from zope.publisher.http import IHTTPRequest
+from zope.publisher.http import HTTPCharsets
+
+from zope.security import simplesecuritypolicies
+from zope.security.securitymanagement import setSecurityPolicy
+
+from zope.app.security.registries.principalregistry import principalRegistry
+from zope.app.interfaces.security \
+     import IUnauthenticatedPrincipal
+
+from zope.app.publication.zopepublication import ZopePublication
+
+from zope.app.content.folder import Folder
+from zope.app.content.folder import RootFolder
+
+from zope.component.interfaces import IServiceService
+
+from zope.publisher.base import TestRequest
+
+from zope.component.service import serviceManager
+
+from transaction import get_transaction
+
+class BasePublicationTests(PlacelessSetup, unittest.TestCase):
+    klass = ZopePublication
+
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+        provideAdapter(IHTTPRequest, IUserPreferredCharsets, HTTPCharsets)
+        self.policy = setSecurityPolicy(
+            simplesecuritypolicies.PermissiveSecurityPolicy()
+            )
+        self.db = DB("foo")
+
+        connection = self.db.open()
+        root = connection.root()
+        app = getattr(root, ZopePublication.root_name, None)
+
+        if app is None:
+            from zope.app.content.folder import RootFolder
+
+            app = RootFolder()
+            root[ZopePublication.root_name] = app
+
+            get_transaction().commit()
+
+        connection.close()
+
+        from zope.app.traversing.namespaces import provideNamespaceHandler
+        from zope.app.traversing.presentationnamespaces import view, resource
+        from zope.app.traversing.etcnamespace import etc
+        provideNamespaceHandler('view', view)
+        provideNamespaceHandler('resource', resource)
+        provideNamespaceHandler('etc', etc)
+
+    def tearDown(self):
+        setSecurityPolicy(self.policy) # XXX still needed?
+        PlacelessSetup.tearDown(self)
+
+    def testInterfacesVerify(self):
+        for interface in instancesOfObjectImplements(self.klass):
+            verifyClass(interface, TestPublication)
+
+class Principal:
+    def __init__(self, id): self._id = id
+    def getId(self): return self._id
+    def getTitle(self): return ''
+    def getDescription(self): return ''
+
+class UnauthenticatedPrincipal(Principal):
+    __implements__ = IUnauthenticatedPrincipal
+
+
+class AuthService1:
+
+    def authenticate(self, request):
+        return None
+
+    def unauthenticatedPrincipal(self):
+        return UnauthenticatedPrincipal('test.anonymous')
+
+    def unauthorized(self, id, request):
+        pass
+
+    def getPrincipal(self, id):
+        return UnauthenticatedPrincipal(id)
+
+
+class AuthService2(AuthService1):
+
+    def authenticate(self, request):
+        return Principal('test.bob')
+
+    def getPrincipal(self, id):
+        return Principal(id)
+
+
+class ServiceManager:
+
+    __implements__ = IServiceService # a dirty lie
+
+    def __init__(self, auth):   self.auth = auth
+    def get(self, key, d=None):      return self.auth
+    __getitem__ = get
+    def __contains__(self, key): return 1
+
+    def getService(self, name):
+        # I just wanna get the test to pass. Waaaaa
+        return serviceManager.getService(name)
+
+
+class ZopePublicationTests(BasePublicationTests):
+    klass = ZopePublication
+
+    def testPlacefulAuth(self):
+        principalRegistry.defineDefaultPrincipal('anonymous', '')
+
+        root = self.db.open().root()
+        app = root[ZopePublication.root_name]
+        app.setObject('f1', Folder())
+        f1 = app['f1']
+        f1.setObject('f2', Folder())
+        f1.setServiceManager(ServiceManager(AuthService1()))
+        f2 = f1['f2']
+        f2.setServiceManager(ServiceManager(AuthService2()))
+        get_transaction().commit()
+
+        request = TestRequest('/f1/f2')
+
+        from zope.component.view import provideView
+        from zope.app.interfaces.container import ISimpleReadContainer
+        from zope.app.container.traversal \
+             import ContainerTraverser
+        from zope.component.interfaces import IPresentation
+        provideView(ISimpleReadContainer, '_traverse', IPresentation,
+                    ContainerTraverser)
+
+        from zope.app.interfaces.content.folder import IFolder
+        from zope.security.checker import defineChecker, InterfaceChecker
+        defineChecker(Folder, InterfaceChecker(IFolder))
+        defineChecker(RootFolder, InterfaceChecker(IFolder))
+
+        request.setViewType(IPresentation)
+
+        publication = self.klass(self.db)
+
+        publication.beforeTraversal(request)
+        self.assertEqual(request.user.getId(), 'anonymous')
+        root = publication.getApplication(request)
+        publication.callTraversalHooks(request, root)
+        self.assertEqual(request.user.getId(), 'anonymous')
+        ob = publication.traverseName(request, root, 'f1')
+        publication.callTraversalHooks(request, ob)
+        self.assertEqual(request.user.getId(), 'test.anonymous')
+        ob = publication.traverseName(request, ob, 'f2')
+        publication.afterTraversal(request, ob)
+        self.assertEqual(request.user.getId(), 'test.bob')
+
+def test_suite():
+    return unittest.makeSuite(ZopePublicationTests)
+
+if __name__ == '__main__':
+    unittest.TextTestRunner().run( test_suite() )