[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/tests - testServiceDirective.py:1.1 testServiceManager.py:1.3

Jim Fulton jim@zope.com
Thu, 11 Jul 2002 14:22:04 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/tests
In directory cvs.zope.org:/tmp/cvs-serv7355/lib/python/Zope/App/OFS/Services/ServiceManager/tests

Modified Files:
	testServiceManager.py 
Added Files:
	testServiceDirective.py 
Log Message:

Reimplemented service managers to be package based. Service managers
are no longer containers. They have a packages subobject (not a
packages service) that contains packages. TTW components are created
in packages. To register a component, create the appropriate component
directive objects (these should be called configuration objects).

This should be viewed as a prototype to illustrate the idea of
packages. Lots of things can change (especially UI) and many things
aren't done (e.g. visiting created directives).

In the course of this, I fixed a bunch of bugs and problems in
traversal machinery. 

I also renamed Zope.ComponentArchitecture.IServiceManager back to
IServiceService, since this interface doesn't actually specify any
management.  



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/tests/testServiceDirective.py ===
##############################################################################
#
# 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.
#
##############################################################################
"""XXX short summary goes here.

XXX longer description goes here.

$Id: testServiceDirective.py,v 1.1 2002/07/11 18:21:33 jim Exp $
"""

from unittest import TestCase, TestSuite, main, makeSuite
from Zope.ComponentArchitecture import getService
from Zope.Proxy.ContextWrapper import ContextWrapper
from Zope.Security.Proxy import Proxy, getChecker
from Zope.App.Traversing.ITraversable import ITraversable
from Interface import Interface
from Zope.App.OFS.Services.ServiceManager.ServiceDirective \
     import ServiceDirective
from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup

from Zope.App.Traversing.IPhysicallyLocatable import IPhysicallyLocatable
from Zope.App.Traversing.IContainmentRoot import IContainmentRoot
from Zope.App.Traversing.PhysicalLocationAdapters \
     import WrapperPhysicallyLocatable, RootPhysicallyLocatable

class IFoo(Interface):
    def f1(): pass
    def f2(): pass

class ServiceManager:
    __implements__ = ITraversable, IContainmentRoot
    
    def getInterfaceFor(self, name):
        return IFoo

    def traverse(self, name, *ignored):
        return getattr(self, name)

class Comp:
    __implements__ = IFoo

    def f1(self): return 1
    def f2(self): return 2
    def f3(self): return 3

class Test(PlacelessSetup, TestCase):

    def setUp(self):
        PlacelessSetup.setUp(self)
        adapterService=getService(None, "Adapters")
        
        adapterService.provideAdapter(
              None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
        adapterService.provideAdapter(
              IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)


    def test_getService(self):
        sm = ServiceManager()
        sm.C = Comp()
        dir = ServiceDirective('Foo', '/C', 'ppp')
        service = dir.getService(sm)
        self.assertEqual(type(service), Proxy)
        self.assertEqual(service.__class__, Comp)
        checker = getChecker(service)
        self.assertEqual(checker.permission_id('f1'), 'ppp')
        self.assertEqual(checker.permission_id('f2'), 'ppp')
        self.assertEqual(checker.permission_id('f3'), None)        

def test_suite():
    return TestSuite((
        makeSuite(Test),
        ))

if __name__=='__main__':
    main(defaultTest='test_suite')


=== Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/tests/testServiceManager.py 1.2 => 1.3 ===
 $Id$
 """
 from unittest import TestCase, TestLoader, TextTestRunner
-from Zope.App.OFS.Container.tests.testIContainer import BaseTestIContainer
 
 from Interface import Interface
 from Zope.App.OFS.Content.Folder.RootFolder import RootFolder
 from Zope.App.OFS.Content.Folder.Folder import Folder
-from Zope.Proxy.ContextWrapper import getWrapperContext
+from Zope.Proxy.ContextWrapper import getWrapperContext, getWrapperContainer
 from Zope.App.OFS.Services.ServiceManager.ServiceManager import ServiceManager
+from Zope.App.OFS.Services.ServiceManager.ServiceDirective \
+     import ServiceDirective
 from Zope.ComponentArchitecture import getService, getServiceManager
 from Zope.Exceptions import ZopeError
 from PlacefulSetup import PlacefulSetup
 
+from Zope.App.Traversing.IPhysicallyLocatable import IPhysicallyLocatable
+from Zope.App.Traversing.IContainmentRoot import IContainmentRoot
+from Zope.App.Traversing.PhysicalLocationAdapters \
+     import WrapperPhysicallyLocatable, RootPhysicallyLocatable
+
 class ITestService(Interface): pass
 
 class TestService:
 
     __implements__ = ITestService
 
-class ServiceManagerTests(PlacefulSetup, BaseTestIContainer, TestCase):
+class ServiceManagerTests(PlacefulSetup, TestCase):
 
     def setUp(self):
         PlacefulSetup.setUp(self)
         self.buildFolders()
+        from Zope.ComponentArchitecture.GlobalAdapterService \
+             import provideAdapter
+        from Zope.App.OFS.Services.ServiceManager.IServiceManager \
+             import IServiceManager
+        from Zope.App.Traversing.ITraversable import ITraversable
+        from Zope.App.OFS.Container.IContainer import ISimpleReadContainer
+        from Zope.App.OFS.Container.ContainerTraversable \
+             import ContainerTraversable
+
+        provideAdapter(ISimpleReadContainer, ITraversable,
+                       ContainerTraversable)
+        provideAdapter(
+              None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+        provideAdapter(
+              IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)
+
+        from Zope.ComponentArchitecture.GlobalServiceManager \
+             import serviceManager
+
+        serviceManager.defineService('test_service', ITestService)
 
     def _Test__new(self):
         return ServiceManager()
 
-    def testAddService(self):
+    def testGetService(self):
         sm = ServiceManager()
         self.rootFolder.setServiceManager(sm)
-        sm=getServiceManager(self.rootFolder)
+        sm = getServiceManager(self.rootFolder)
         ts = TestService()
-        sm.setObject('test_service1', ts)
-        self.assertEqual(sm['test_service1'], ts)
+        sm.Packages['default'].setObject('test_service1', ts)
+        directive = ServiceDirective(
+            'test_service',
+            '/++etc++Services/Packages/default/test_service1')
+        sm.Packages['default'].setObject('test_service1_dir', directive)
+        sm.bindService(directive)
+
+        testOb = getService(self.rootFolder, 'test_service')
+        c = getWrapperContainer
+        self.assertEqual(c(c(c(c(testOb)))), self.rootFolder)
+        self.assertEqual(testOb, ts)
 
-    def testGetService(self):
+    def testAddService(self):
         sm = ServiceManager()
         self.rootFolder.setServiceManager(sm)
-        sm=getServiceManager(self.rootFolder)
+        sm = getServiceManager(self.rootFolder)
         ts = TestService()
-        sm.setObject('test_service1', ts)
-        sm.bindService('test_service', 'test_service1')
-        testOb=getService(self.rootFolder, 'test_service')
-        self.assertEqual(getWrapperContext
-             (getWrapperContext(testOb)),self.rootFolder)
+        sm.Packages['default'].setObject('test_service1', ts)
+        directive = ServiceDirective(
+            'test_service',
+            '/++etc++Services/Packages/default/test_service1')
+        sm.Packages['default'].setObject('test_service1_dir', directive)
+        sm.bindService(directive)
+
+        ts2 = TestService()
+        sm.Packages['default'].setObject('test_service2', ts)
+        directive = ServiceDirective(
+            'test_service',
+            '/++etc++Services/Packages/default/test_service2')
+        sm.Packages['default'].setObject('test_service2_dir', directive)
+        sm.bindService(directive)
+
+        testOb = getService(self.rootFolder, 'test_service')
         self.assertEqual(testOb, ts)
 
+
     def testUnbindService(self):
-        sm = ServiceManager()
-        self.rootFolder.setServiceManager(sm)
-        sm=getServiceManager(self.rootFolder)
-        ts = TestService()
+
         root_ts = TestService()
-        gsm=getServiceManager(None)
-        gsm.defineService('test_service', ITestService)
+        gsm = getServiceManager(None)
         gsm.provideService('test_service', root_ts)
 
-        sm.setObject('test_service1', ts)
-        sm.bindService('test_service', 'test_service1')
-        self.assertEqual(getService(self.rootFolder, 'test_service'), ts)
-        sm.unbindService('test_service')
+        self.testGetService() # set up localservice
+
+        sm = getServiceManager(self.rootFolder)
+
+        directive = sm.Packages['default']['test_service1_dir']
+        sm.unbindService(directive)
         self.assertEqual(getService(self.rootFolder, 'test_service'), root_ts)
 
-    def testDeleteService(self):
+    # XXX This should be a test on the adapter responsible for deleting.
+    def __testDeleteService(self):
+        """sure deleting a service generates a service generates a
+        removed event."""
         self.rootFolder.setServiceManager(ServiceManager())
         sm=getServiceManager(self.rootFolder)
         ts = TestService()
@@ -90,36 +138,28 @@
         self.assertRaises(ZopeError, sm.__delitem__, 'test_service1')
     
     def testContextServiceLookup(self):
-        self.rootFolder.setServiceManager(ServiceManager())
+        self.testGetService() # set up localservice
         sm=getServiceManager(self.rootFolder)
-        ts = TestService()
-        sm.setObject('test_service1', ts)
-        sm.bindService('test_service', 'test_service1')
-        self.assertEqual(getService(self.folder1, 'test_service'), ts)
-        self.assertEqual(getService(self.folder1_1, 'test_service'), ts)
+        self.assertEqual(getService(self.folder1_1, 'test_service'),
+                         sm.Packages['default']['test_service1'])
 
     def testContextServiceLookupWithMultipleServiceManagers(self):
-        self.rootFolder.setServiceManager(ServiceManager())
+        self.testGetService() # set up root localservice
         sm=getServiceManager(self.rootFolder)
-        ts = TestService()
-        sm.setObject('test_service1', ts)
-        sm.bindService('test_service', 'test_service1')
 
         self.folder1.setServiceManager(ServiceManager())
         sm2=getServiceManager(self.folder1)
         
-        self.assertEqual(getService(self.folder1, 'test_service'), ts)
+        self.assertEqual(getService(self.folder1, 'test_service'),
+                         sm.Packages['default']['test_service1'])
 
     def testComponentArchitectureServiceLookup(self):
         self.rootFolder.setServiceManager(ServiceManager())
-        sm=getServiceManager(self.rootFolder)
         self.folder1.setServiceManager(ServiceManager())
-        sm2=getServiceManager(self.folder1)
         
         ts = TestService()
 
         globsm=getServiceManager(None)
-        globsm.defineService('test_service', ITestService)
         globsm.provideService('test_service', ts)
 
         service = getService(self.folder1, 'test_service')