[Zope3-checkins] CVS: Zope3/src/zope/app/services/tests - __init__.py:1.2 configurationregistry.py:1.2 eventsetup.py:1.2 iconfigurable.py:1.2 objecthubsetup.py:1.2 placefulsetup.py:1.2 sample1.py:1.2 sample2.py:1.2 servicemanager.py:1.2 test_adapter.py:1.2 test_auth.py:1.2 test_cacheconfiguration.py:1.2 test_cachingservice.py:1.2 test_configurationmanager.py:1.2 test_configurationregistry.py:1.2 test_configurations.py:1.2 test_configurationstatusproperty.py:1.2 test_connectionconfiguration.py:1.2 test_connectionservice.py:1.2 test_errorreportingservice.py:1.2 test_eventservice.py:1.2 test_field.py:1.2 test_hookedhubevent.py:1.2 test_hubevent.py:1.2 test_nameconfigurable.py:1.2 test_objecthub.py:1.2 test_principalannotation.py:1.2 test_roleservice.py:1.2 test_serviceconfiguration.py:1.2 test_servicemanager.py:1.2 test_user.py:1.2 test_view.py:1.2 test_viewpackage.py:1.2
Jim Fulton
jim@zope.com
Wed, 25 Dec 2002 09:13:56 -0500
Update of /cvs-repository/Zope3/src/zope/app/services/tests
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/services/tests
Added Files:
__init__.py configurationregistry.py eventsetup.py
iconfigurable.py objecthubsetup.py placefulsetup.py sample1.py
sample2.py servicemanager.py test_adapter.py test_auth.py
test_cacheconfiguration.py test_cachingservice.py
test_configurationmanager.py test_configurationregistry.py
test_configurations.py test_configurationstatusproperty.py
test_connectionconfiguration.py test_connectionservice.py
test_errorreportingservice.py test_eventservice.py
test_field.py test_hookedhubevent.py test_hubevent.py
test_nameconfigurable.py test_objecthub.py
test_principalannotation.py test_roleservice.py
test_serviceconfiguration.py test_servicemanager.py
test_user.py test_view.py test_viewpackage.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/services/tests/__init__.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/__init__.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.
=== Zope3/src/zope/app/services/tests/configurationregistry.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/configurationregistry.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,103 @@
+##############################################################################
+#
+# Copyright (c) 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.
+#
+##############################################################################
+
+__metaclass__ = type
+
+class TestingConfiguration:
+ def __init__(self, id):
+ self.id = id
+
+ def __eq__(self, other):
+ return self.id == getattr(other, 'id', 0)
+
+class TestingConfigurationRegistry:
+
+ class_ = TestingConfiguration
+
+ def __init__(self, *args):
+ self._data = args
+
+ def register(self, configuration):
+ cid = configuration.id
+
+ if self._data:
+ if cid in self._data:
+ return # already registered
+ else:
+ # Nothing registered. Need to stick None in front so that nothing
+ # is active.
+ self._data = (None, )
+
+ self._data += (cid, )
+
+ def unregister(self, configuration):
+ cid = configuration.id
+
+ data = self._data
+ if data:
+ if data[0] == cid:
+ # It's active, we need to switch in None
+ self._data = (None, ) + data[1:]
+ else:
+ self._data = tuple([item for item in data if item != cid])
+
+ def registered(self, configuration):
+ cid = configuration.id
+ return cid in self._data
+
+ def activate(self, configuration):
+ cid = configuration.id
+ if self._data[0] == cid:
+ return # already active
+
+ if self._data[0] is None:
+ # Remove leading None marker
+ self._data = self._data[1:]
+
+ self._data = (cid, ) + tuple(
+ [item for item in self._data if item != cid]
+ )
+
+ def deactivate(self, configuration):
+ cid = configuration.id
+ if self._data[0] != cid:
+ return # already inactive
+
+ # Just stick None on the front
+ self._data = (None, ) + self._data
+
+ def active(self):
+ if self._data:
+ return self.class_(self._data[0])
+
+ return None
+
+ def __nonzero__(self):
+ return bool(self._data)
+
+ def info(self):
+ result = [{'id': path,
+ 'active': False,
+ 'configuration': self.class_(path),
+ }
+ for path in self._data
+ ]
+
+ if result:
+ if result[0]['configuration'] is None:
+ del result[0]
+ else:
+ result[0]['active'] = True
+
+ return result
=== Zope3/src/zope/app/services/tests/eventsetup.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/eventsetup.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,62 @@
+##############################################################################
+#
+# 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 zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+
+from zope.app.services.service \
+ import ServiceManager
+
+from zope.app.services.event \
+ import LocalEventService
+
+from zope.app.services.service \
+ import ServiceConfiguration
+
+from zope.app.traversing import getPhysicalPathString, traverse
+
+from zope.app.interfaces.services.configuration import Active
+
+class EventSetup(PlacefulSetup):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.createEventService()
+
+ def createServiceManager(self, folder):
+ folder.setServiceManager(ServiceManager())
+
+ def createEventService(self, path=None):
+
+ folder = self.rootFolder
+ if path is not None:
+ folder = traverse(folder, path)
+
+ if not folder.hasServiceManager():
+ self.createServiceManager(folder)
+
+ sm = traverse(folder, '++etc++Services')
+ default = traverse(sm, 'Packages/default')
+ default.setObject("myEventService", LocalEventService())
+
+ path = "%s/Packages/default/myEventService" % getPhysicalPathString(sm)
+ configuration = ServiceConfiguration("Events", path)
+ default['configure'].setObject("myEventServiceDir", configuration)
+ traverse(default, 'configure/1').status = Active
=== Zope3/src/zope/app/services/tests/iconfigurable.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/iconfigurable.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,90 @@
+##############################################################################
+#
+# Copyright (c) 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$
+"""
+from zope.app.interfaces.services.configuration import IConfigurable
+from zope.interface.verify import verifyObject
+from zope.proxy.context import getWrapperContainer
+
+class TestingIConfigurable:
+ """Base class for testing implementors of IConfigurable
+
+ Subclasses must implement:
+
+ - createTestingConfigurable()
+ that returns a new configurable object with no configurations.
+
+ This configuration object must be in the context of something
+ that is not None.
+
+ - createTestingConfiguration()
+ that returns a configuration object.
+
+ """
+
+ def _assertInContext(self, ob, parent):
+ """Assert that we have the proper context
+
+ The container of ob must be the parent, and the parent must
+ have some context.
+
+ """
+ self.assertEqual(getWrapperContainer(ob), parent)
+ self.failIf(getWrapperContainer(getWrapperContainer(ob)) is None)
+
+ def test_implements_IConfigurable(self):
+ verifyObject(IConfigurable, self.createTestingConfigurable())
+
+ def test_queryConfigurationsFor_no_config(self):
+ configurable = self.createTestingConfigurable()
+ configuration = self.createTestingConfiguration()
+ self.failIf(configurable.queryConfigurationsFor(configuration))
+
+ self.assertEqual(
+ configurable.queryConfigurationsFor(configuration, 42),
+ 42)
+
+ def test_createConfigurationsFor(self):
+ configurable = self.createTestingConfigurable()
+ configuration = self.createTestingConfiguration()
+ registry = configurable.createConfigurationsFor(configuration)
+
+ self.assertEqual(getWrapperContainer(registry), configurable)
+
+ # If we call it again, we should get the same object
+ self.assertEqual(configurable.createConfigurationsFor(configuration),
+ registry)
+
+ self._assertInContext(registry, configurable)
+
+ return registry
+
+ def test_queryConfigurationsFor(self):
+ configurable = self.createTestingConfigurable()
+ configuration = self.createTestingConfiguration()
+
+ cregistry = configurable.createConfigurationsFor(configuration)
+
+
+ registry = configurable.queryConfigurationsFor(configuration)
+ self.assertEqual(registry, cregistry)
+ self._assertInContext(registry, configurable)
+
+ registry = configurable.queryConfigurationsFor(configuration, 42)
+ self.assertEqual(registry, cregistry)
+ self._assertInContext(registry, configurable)
=== Zope3/src/zope/app/services/tests/objecthubsetup.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/objecthubsetup.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,55 @@
+##############################################################################
+#
+# 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 zope.app.services.tests.eventsetup import EventSetup
+from zope.component import getServiceManager
+from zope.app.services.service import ServiceConfiguration
+from zope.app.traversing import getPhysicalPathString, traverse
+
+from zope.app.services.hub import ObjectHub
+from zope.app.interfaces.services.configuration import Active
+
+class ObjectHubSetup(EventSetup):
+
+ def setUp(self):
+ EventSetup.setUp(self)
+
+ from zope.app.interfaces.services.hub import IObjectHub
+ global_service_manager = getServiceManager(None)
+ global_service_manager.defineService("ObjectHub", IObjectHub)
+ self.createObjectHub()
+
+ def createObjectHub(self, path=None):
+ folder = self.rootFolder
+ if path is not None:
+ folder = traverse(folder, path)
+
+ if not folder.hasServiceManager():
+ self.createServiceManager(folder)
+
+ sm = traverse(folder, '++etc++Services')
+ default = traverse(sm, 'Packages/default')
+ default.setObject("myObjectHub", ObjectHub())
+
+ path = "%s/Packages/default/myObjectHub" % getPhysicalPathString(sm)
+ configuration = ServiceConfiguration("ObjectHub", path)
+
+ configure = traverse(default, 'configure')
+ key = configure.setObject("myObjectHubDir", configuration)
+ traverse(configure, key).status = Active
=== Zope3/src/zope/app/services/tests/placefulsetup.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/placefulsetup.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,139 @@
+##############################################################################
+#
+# 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 zope import component as CA
+from zope.component.adapter import provideAdapter
+from zope.component.view import provideView
+from zope.publisher.interfaces.browser import IBrowserPresentation
+
+from zope.app.browser.absoluteurl \
+ import SiteAbsoluteURL, AbsoluteURL
+from zope.app.component import hooks
+from zope.app.container.traversal import ContainerTraversable
+from zope.app.interfaces.container import ISimpleReadContainer
+from zope.app.interfaces.content.folder import IRootFolder
+from zope.app.interfaces.traversing.containmentroot import IContainmentRoot
+from zope.app.interfaces.traversing.physicallylocatable import IPhysicallyLocatable
+from zope.app.interfaces.traversing.traverser import ITraverser
+from zope.app.interfaces.traversing.traversable import ITraversable
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.app.traversing.defaulttraversable import DefaultTraversable
+from zope.app.traversing.etcnamespace import etc
+from zope.app.traversing.namespaces import provideNamespaceHandler
+from zope.app.traversing.physicallocationadapters \
+ import WrapperPhysicallyLocatable, RootPhysicallyLocatable
+from zope.app.traversing.traverser import Traverser
+
+
+class PlacefulSetup(PlacelessSetup):
+
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+ # set up placeful hooks, saving originals for tearDown
+ self.__old_getServiceManager_hook = CA.getServiceManager_hook
+ CA.getServiceManager_hook = hooks.getServiceManager_hook
+ self.setUpTraversal()
+
+ def setUpTraversal(self):
+
+ provideAdapter(None, ITraverser, Traverser)
+ provideAdapter(None, ITraversable, DefaultTraversable)
+
+ provideAdapter(
+ ISimpleReadContainer, ITraversable, ContainerTraversable)
+ provideAdapter(
+ None, IPhysicallyLocatable, WrapperPhysicallyLocatable)
+ provideAdapter(
+ IContainmentRoot, IPhysicallyLocatable, RootPhysicallyLocatable)
+
+ # set up etc namespace
+ provideNamespaceHandler("etc", etc)
+
+ provideView(None, "absolute_url", IBrowserPresentation,
+ AbsoluteURL)
+ provideView(IRootFolder, "absolute_url", IBrowserPresentation,
+ SiteAbsoluteURL)
+
+
+ def tearDown(self):
+ # clean up folders and placeful service managers and services too?
+ CA.getServiceManager_hook = self.__old_getServiceManager_hook
+ PlacelessSetup.tearDown(self)
+
+ def buildFolders(self):
+ # set up a reasonably complex folder structure
+ #
+ # ____________ rootFolder ____________
+ # / \
+ # folder1 __________________ folder2
+ # | \ |
+ # folder1_1 ____ folder1_2 folder2_1
+ # | \ | |
+ # folder1_1_1 folder1_1_2 folder1_2_1 folder2_1_1
+ from zope.app.content.folder import Folder
+ from zope.app.content.folder import RootFolder
+ from zope.proxy.context import ContextWrapper
+ # top
+ self.rootFolder = RootFolder()
+ # level 1
+ self.folder1 = Folder()
+ self.rootFolder.setObject("folder1", self.folder1)
+ self.folder1 = ContextWrapper(self.folder1, self.rootFolder,
+ name = "folder1")
+ self.folder2 = Folder()
+ self.rootFolder.setObject("folder2", self.folder2)
+ self.folder2 = ContextWrapper(self.folder2, self.rootFolder,
+ name = "folder2")
+ # level 2
+ self.folder1_1 = Folder()
+ self.folder1.setObject("folder1_1", self.folder1_1)
+ self.folder1_1 = ContextWrapper(self.folder1_1, self.folder1,
+ name = "folder1_1")
+ self.folder1_2 = Folder()
+ self.folder1.setObject("folder1_2", self.folder1_2)
+ self.folder1_2 = ContextWrapper(self.folder1_2, self.folder1,
+ name = "folder1_2")
+ self.folder2_1 = Folder()
+ self.folder2.setObject("folder2_1", self.folder2_1)
+ self.folder2_1 = ContextWrapper(self.folder2_1, self.folder2,
+ name = "folder2_1")
+ # level 3
+ self.folder1_1_1 = Folder()
+ self.folder1_1.setObject("folder1_1_1", self.folder1_1_1)
+ self.folder1_1_1 = ContextWrapper(self.folder1_1_1, self.folder1_1,
+ name = "folder1_1_1")
+ self.folder1_1_2 = Folder()
+ self.folder1_1.setObject("folder1_1_2", self.folder1_1_2)
+ self.folder1_1_2 = ContextWrapper(self.folder1_1_2, self.folder1_1,
+ name = "folder1_1_2")
+ self.folder1_2_1 = Folder()
+ self.folder1_2.setObject("folder1_2_1", self.folder1_2_1)
+ self.folder1_2_1 = ContextWrapper(self.folder1_2_1, self.folder1_2,
+ name = "folder1_2_1")
+ self.folder2_1_1 = Folder()
+ self.folder2_1.setObject("folder2_1_1", self.folder2_1_1)
+ self.folder2_1_1 = ContextWrapper(self.folder2_1_1, self.folder2_1,
+ name = "folder2_1_1")
+
+ def createServiceManager(self, folder = None):
+ if folder is None:
+ folder = self.rootFolder
+ from zope.app.services.tests.servicemanager \
+ import TestingServiceManager
+
+ folder.setServiceManager(TestingServiceManager())
=== Zope3/src/zope/app/services/tests/sample1.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:51 2002
+++ Zope3/src/zope/app/services/tests/sample1.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1 @@
+x = 'sample 1'
=== Zope3/src/zope/app/services/tests/sample2.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/sample2.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1 @@
+y = 'sample 2'
=== Zope3/src/zope/app/services/tests/servicemanager.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/servicemanager.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# Copyright (c) 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$
+"""
+
+__metaclass__ = type
+
+from zope.component.interfaces import IServiceService
+from zope.app.component.nextservice \
+ import getNextService, getNextServiceManager
+from zope.proxy.context import ContextWrapper
+from zope.app.interfaces.services.service import IBindingAware
+from zope.proxy.context import ContextMethod
+
+class TestingServiceManager:
+ """Simple placeful service manager used for writing tests
+ """
+ __implements__ = IServiceService
+
+ def getServiceDefinitions(self):
+ "See IServiceService"
+ return getNextServiceManager(self).getServiceDefinitions()
+
+ def getInterfaceFor(self, name):
+ "See IServiceService"
+ return getNextServiceManager(self).getInterfaceFor(name)
+
+ def getService(self, name):
+ "See IServiceService"
+ if hasattr(self, name):
+ return ContextWrapper(getattr(self, name), self, name=name)
+ return getNextServiceManager(self).getService(name)
+
+ getService = ContextMethod(getService)
+
+ def queryService(self, name, default=None):
+ "See IServiceService"
+ if hasattr(self, name):
+ return ContextWrapper(getattr(self, name), self, name=name)
+ return getNextServiceManager(self).queryService(name, default)
+
+ queryService = ContextMethod(queryService)
+
+ def bindService(self, name, ob):
+ setattr(self, name, ob)
+ if IBindingAware.isImplementedBy(ob):
+ ob.bound(name)
+
+ bindService = ContextMethod(bindService)
+
+ def unbindService(self, name):
+ ob = getattr(self, name)
+ if IBindingAware.isImplementedBy(ob):
+ ob.unbound(name)
+ delattr(self, name, ob)
+
+ unbindService = ContextMethod(unbindService)
+
+
+__doc__ = TestingServiceManager.__doc__ + __doc__
=== Zope3/src/zope/app/services/tests/test_adapter.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/test_adapter.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,239 @@
+##############################################################################
+#
+# 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 adapter module
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.iconfigurable import TestingIConfigurable
+from zope.app.services.adapter import AdapterService
+from zope.interface import Interface
+from zope.proxy.context import ContextWrapper
+from zope.component.exceptions import ComponentLookupError
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.services.service import ServiceManager
+from zope.app.services.adapter import AdapterConfiguration
+from zope.app.content.folder import RootFolder
+from zope.component import getServiceManager
+from zope.app.traversing import traverse
+from zope.component.interfaces import IServiceService
+from zope.component.adapter import provideAdapter
+
+class I1(Interface):
+ pass
+
+class I1E(I1):
+ pass
+
+class I2B(Interface):
+ pass
+
+class I2(I2B):
+ pass
+
+class I3(Interface):
+ pass
+
+class I4(Interface):
+ pass
+
+
+class Configuration:
+ forInterface = I1
+ providedInterface = I2
+
+ def getAdapter(self, object):
+ return self.factory(object)
+
+ def activated(self): pass
+ def deactivated(self): pass
+
+class C: pass
+
+class A:
+ def __init__(self, object):
+ self.context = object
+
+
+class TestAdapterService(PlacefulSetup, TestingIConfigurable, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+ self._service = ContextWrapper(AdapterService(), self.rootFolder)
+
+
+ def test_implements_IAdapterService(self):
+ from zope.component.interfaces import IAdapterService
+ from zope.interface.verify import verifyObject
+
+ verifyObject(IAdapterService, self._service)
+
+ def createTestingConfigurable(self):
+ return ContextWrapper(AdapterService(), C())
+
+ def createTestingConfiguration(self):
+ return Configuration()
+
+ def test_queryAdapter_no_adapter(self):
+ service = self._service
+ class O:
+ __implements__ = I1
+
+ o = O()
+ self.assertEqual(service.queryAdapter(o, I2), None)
+ self.assertEqual(service.queryAdapter(o, I2, 42), 42)
+
+ self.assertEqual(service.queryAdapter(o, I1), o)
+ self.assertEqual(service.queryAdapter(o, I1, 42), o)
+
+ def test_getAdapter_no_adapter(self):
+ service = self._service
+ class O:
+ __implements__ = I1
+
+ o = O()
+ self.assertRaises(ComponentLookupError, service.getAdapter, O(), I2)
+ self.assertEqual(service.getAdapter(o, I1), o)
+
+ def test_queryAdapter_and_getAdapter(self):
+ service = self._service
+
+ sm = traverse(self.rootFolder, '++etc++Services')
+
+ configure = traverse(sm, 'Packages/default/configure')
+ configuration = Configuration()
+ configure.setObject('', configuration)
+ configuration = traverse(configure, '1')
+
+ class O:
+ __implements__ = I1
+
+ configuration.factory = A
+
+ registry = service.createConfigurationsFor(configuration)
+ registry.register(configuration)
+ registry.activate(configuration)
+
+ o = O()
+
+ for m in 'queryAdapter', 'getAdapter':
+ for r in I1, I1E:
+ for p in I2B, I2:
+ o = O()
+ o.__implements__ = r
+
+ adapter = getattr(service, m)(o, p)
+ self.assertEqual(adapter.__class__, A)
+ self.assertEqual(adapter.context, o)
+
+ self.assertEqual(getattr(service, m)(o, I1), o)
+
+ self.assertEqual(service.queryAdapter(o, I3), None)
+ self.assertEqual(service.queryAdapter(o, I3, 42), 42)
+ self.assertRaises(ComponentLookupError, service.getAdapter, O(), I3)
+
+ def test_queryAdapter_delegation(self):
+ service = self._service
+
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ sm = traverse(self.rootFolder, '++etc++Services')
+
+ configure = traverse(sm, 'Packages/default/configure')
+ configuration = Configuration()
+ configure.setObject('', configuration)
+ configuration = traverse(configure, '1')
+
+ class O:
+ __implements__ = I1
+
+ configuration.factory = A
+
+ registry = service.createConfigurationsFor(configuration)
+ registry.register(configuration)
+ registry.activate(configuration)
+
+ o = O()
+
+ class A2(A): pass
+
+ provideAdapter(I1, I4, A2)
+
+ adapter = service.queryAdapter(o, I4)
+ self.assertEqual(adapter.__class__, A2)
+ self.assertEqual(adapter.context, o)
+
+ def test_queryAdapter_delegation_w_no_adapters_locally(self):
+ service = self._service
+
+ class O:
+ __implements__ = I1
+
+ o = O()
+
+ class A2(A): pass
+
+ provideAdapter(I1, I4, A2)
+
+ adapter = service.queryAdapter(o, I4)
+ self.assertEqual(adapter.__class__, A2)
+ self.assertEqual(adapter.context, o)
+
+ def test_getRegisteredMatching(self):
+ self.test_queryAdapter_and_getAdapter()
+ registry = self._service.queryConfigurations(I1, I2, '')
+
+ for args in ((), (I1E, ), (None, I2), (I1E, I2), ):
+ r = self._service.getRegisteredMatching(*args)
+ self.assertEqual(list(r), [(I1, I2, registry)])
+
+class PhonyServiceManager:
+
+ __implements__ = IServiceService
+
+ def resolve(self, name):
+ if name == 'Foo.Bar.A':
+ return A
+
+class TestAdapterConfiguration(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ rootFolder = RootFolder()
+ rootFolder.setServiceManager(PhonyServiceManager())
+ self.configuration = ContextWrapper(
+ AdapterConfiguration(I1, I2, "Foo.Bar.A"),
+ rootFolder,
+ )
+
+ def test_getAdapter(self):
+ c = C()
+ adapter = self.configuration.getAdapter(c)
+ self.assertEqual(adapter.__class__, A)
+ self.assertEqual(adapter.context, c)
+ self.assertEqual(self.configuration.forInterface, I1)
+ self.assertEqual(self.configuration.providedInterface, I2)
+
+def test_suite():
+ return TestSuite((
+ makeSuite(TestAdapterService),
+ makeSuite(TestAdapterConfiguration),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_auth.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/test_auth.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,111 @@
+##############################################################################
+#
+# 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.auth \
+ import AuthenticationService, DuplicateLogin, DuplicateId
+from zope.app.services.auth import User
+from zope.app.interfaces.services.auth import IUser
+
+from zope.exceptions import NotFoundError
+from zope.publisher.interfaces.http import IHTTPCredentials
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+
+class Request:
+
+ __implements__ = IHTTPCredentials
+
+ def __init__(self, lpw):
+ self.__lpw = lpw
+
+ def _authUserPW(self):
+ return self.__lpw
+
+ challenge = None
+ def unauthorized(self, challenge):
+ self.challenge = challenge
+
+
+class AuthServiceTest(TestCase, PlacefulSetup):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+
+ from zope.component import getService
+ from zope.app.security.basicauthadapter import BasicAuthAdapter
+ from zope.app.interfaces.security import ILoginPassword
+ getService(None, "Adapters").provideAdapter(
+ IHTTPCredentials, ILoginPassword, BasicAuthAdapter)
+
+ auth = AuthenticationService()
+ auth.setObject('srichter', User('srichter', 'Stephan', 'Richter',
+ 'srichter', 'hello'))
+ auth.setObject('jim', User('jim', 'Jim', 'Foulton',
+ 'jim', 'hello2'))
+ auth.setObject('stevea', User('stevea', 'Steve', 'Alexander',
+ 'stevea', 'hello3'))
+ self._auth = auth
+
+
+ def testGetPrincipalByLogin(self):
+ auth = self._auth
+ self.assertEqual(auth['srichter'],
+ auth.getPrincipalByLogin('srichter'))
+
+ def testAuthenticate(self):
+ auth = self._auth
+ req = Request(('srichter', 'hello'))
+ pid = auth.authenticate(req).getId()
+ self.assertEquals(pid, 'srichter')
+ req = Request(('srichter', 'hello2'))
+ p = auth.authenticate(req)
+ self.assertEquals(p, None)
+ req = Request(('doesnotexit', 'hello'))
+ principal = auth.authenticate(req)
+ self.assertEquals(principal, None)
+
+ def testUnauthenticatedPrincipal(self):
+ auth = self._auth
+ self.assertEqual(None, auth.unauthenticatedPrincipal())
+
+ def testUnauthorized(self):
+ auth = self._auth
+ request = Request(None)
+ auth.unauthorized(auth.unauthenticatedPrincipal(), request)
+ self.assertEquals(request.challenge, "basic realm=zope")
+ request = Request(None)
+ auth.unauthorized(None, request)
+ self.assertEquals(request.challenge, "basic realm=zope")
+ request = Request(None)
+ auth.unauthorized("srichter", request)
+ self.assertEquals(request.challenge, None)
+
+ def testGetPrincipal(self):
+ auth = self._auth
+ self.assertEqual(auth['srichter'], auth.getPrincipal('srichter'))
+ self.assertEqual(None, auth.getPrincipal('srichter2'))
+
+ def testGetPrincipals(self):
+ auth = self._auth
+ self.assertEqual([auth['srichter']], auth.getPrincipals('srichter'))
+
+def test_suite():
+ return makeSuite(AuthServiceTest)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_cacheconfiguration.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/test_cacheconfiguration.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,156 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Unit test for CacheConfiguration.
+
+$Id$
+"""
+
+from unittest import TestCase, main, makeSuite
+from zope.app.services.cache import CacheConfiguration
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.traversing import traverse
+from zope.app.services.service import ServiceManager
+from zope.app.container.zopecontainer import ZopeContainerAdapter
+from zope.app.interfaces.services.configuration import Active, Unregistered
+from zope.app.interfaces.cache.cache import ICache
+from zope.app.interfaces.dependable import IDependable
+from zope.app.interfaces.cache.cache import ICachingService
+from zope.app.interfaces.services.configuration import IConfigurable
+from zope.app.services.configuration import ConfigurationRegistry
+from zope.app.services.service import ServiceConfiguration
+from zope.proxy.context import ContextMethod
+from zope.proxy.context import ContextWrapper
+from zope.app.interfaces.event import IObjectModifiedEvent
+
+
+class DependableStub:
+
+ __implements__ = IDependable
+
+ def addDependent(self, location):
+ pass
+
+ def removeDependent(self, location):
+ pass
+
+ def dependents(self):
+ pass
+
+
+class TestCache(DependableStub):
+
+ __implements__ = ICache, IDependable
+
+ def invalidateAll(self):
+ self.invalidated = True
+
+
+class CachingServiceStub(DependableStub):
+
+ __implements__ = ICachingService, IConfigurable, IDependable
+
+ def __init__(self):
+ self.bindings = {}
+ self.subscriptions = {}
+
+ def queryConfigurationsFor(self, cfg, default=None):
+ return self.queryConfigurations(cfg.name)
+ queryConfigurationsFor = ContextMethod(queryConfigurationsFor)
+
+ def queryConfigurations(self, name, default=None):
+ registry = self.bindings.get(name, default)
+ return ContextWrapper(registry, self)
+ queryConfigurations = ContextMethod(queryConfigurations)
+
+ def createConfigurationsFor(self, cfg):
+ return self.createConfigurations(cfg.name)
+ createConfigurationsFor = ContextMethod(createConfigurationsFor)
+
+ def createConfigurations(self, name):
+ try:
+ registry = self.bindings[name]
+ except KeyError:
+ self.bindings[name] = registry = ConfigurationRegistry()
+ return ContextWrapper(registry, self)
+ createConfigurations = ContextMethod(createConfigurations)
+
+ def subscribe(self, obj, event):
+ self.subscriptions.setdefault(obj, []).append(event)
+
+ def unsubscribe(self, obj, event):
+ self.subscriptions.setdefault(obj, []).remove(event)
+
+ def listSubscriptions(self, obj):
+ return self.subscriptions.get(obj, [])
+
+
+class TestConnectionConfiguration(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ self.default = traverse(self.rootFolder,
+ '++etc++Services/Packages/default')
+ self.default.setObject('cch', TestCache())
+ self.cch = traverse(self.default, 'cch')
+
+ self.cm = ZopeContainerAdapter(traverse(self.default, "configure"))
+ self.cm.setObject('', CacheConfiguration('cache_name',
+ '/++etc++Services/Packages/default/cch'))
+ self.config = traverse(self.default, 'configure/1')
+
+ self.default.setObject('cache_srv', CachingServiceStub())
+ self.service = traverse(self.default, 'cache_srv')
+
+ self.cm.setObject('', ServiceConfiguration('Caching',
+ '/++etc++Services/Packages/default/cache_srv'))
+ traverse(self.default, 'configure/2').status = Active
+
+ def tearDown(self):
+ PlacefulSetup.tearDown(self)
+
+ def test_getComponent(self):
+ # This should be already tested by ComponentConfiguration tests, but
+ # let's doublecheck
+ self.assertEqual(self.config.getComponent(), self.cch)
+
+ def test_status(self):
+ self.assertEqual(self.config.status, Unregistered)
+ self.config.status = Active
+ self.assertEqual(self.config.status, Active)
+ cr = self.service.queryConfigurations('cache_name')
+ self.assertEqual(cr.active(), self.config)
+
+ def test_activated(self):
+ self.config.activated()
+ self.assertEqual(self.service.listSubscriptions(self.cch),
+ [IObjectModifiedEvent])
+
+ def test_deactivated(self):
+ self.service.subscribe(self.cch, IObjectModifiedEvent)
+ self.cch.invalidated = False
+ self.config.deactivated()
+ self.assertEqual(self.service.listSubscriptions(self.cch), [])
+ self.failIf(not self.cch.invalidated,
+ "deactivation should call invalidateAll")
+
+
+def test_suite():
+ return makeSuite(TestConnectionConfiguration)
+
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_cachingservice.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/test_cachingservice.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,144 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""CachingService tests.
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.interface.verify import verifyObject
+from zope.app.interfaces.cache.cache import ICache
+from zope.app.interfaces.cache.cache import ICachingService
+from zope.app.services.cache import CacheConfiguration
+from zope.app.interfaces.services.configuration import Active, Registered
+from zope.app.services.tests.eventsetup import EventSetup
+from zope.app.services.service import ServiceConfiguration
+from zope.app.traversing import getPhysicalPathString, traverse
+
+
+def sort(list):
+ list.sort()
+ return list
+
+
+class CacheStub:
+
+ __implements__ = ICache
+
+ def __init__(self, name):
+ self.name = name
+
+ def __repr__(self):
+ return "CacheStub(%r)" % self.name
+
+
+class CachingServiceSetup(EventSetup):
+
+ def createCachingService(self, path=None):
+ from zope.app.services.cache \
+ import CachingService
+
+ folder = self.rootFolder
+ if path is not None:
+ folder = traverse(folder, path)
+
+ if not folder.hasServiceManager():
+ self.createServiceManager(folder)
+
+ default = traverse(folder, '++etc++Services/Packages/default')
+ key = default.setObject("myCachingService", CachingService())
+ service = traverse(default, key)
+
+ path = getPhysicalPathString(service)
+ configuration = ServiceConfiguration("Caching", path)
+ configure = traverse(default, 'configure')
+ key = configure.setObject(None, configuration)
+ traverse(configure, key).status = Active
+
+ return service
+
+ def addCache(self, name, cache=None, cname=None, status=Active, folder=''):
+ if not cache: cache = CacheStub("%s/%s" % (folder, name))
+ if not cname: cname = name
+ default = traverse(self.rootFolder,
+ folder +'/++etc++Services/Packages/default')
+ key = default.setObject(cname, cache)
+ cache = traverse(default, key)
+ configure = traverse(default, 'configure')
+ key = configure.setObject(None, CacheConfiguration(name,
+ getPhysicalPathString(cache)))
+ traverse(configure, key).status = status
+ return cache
+
+
+class TestCachingService(CachingServiceSetup, TestCase):
+
+ def setUp(self):
+ CachingServiceSetup.setUp(self)
+ self.service = self.createCachingService()
+ self.cache1 = self.addCache('cache1')
+ self.cache2 = self.addCache('cache2')
+ self.cache3 = self.addCache('cache3', status=Registered)
+ self.service_f1 = self.createCachingService('folder1')
+ self.cache1_f1 = self.addCache('cache1', folder='folder1')
+ self.cache4_f1 = self.addCache('cache4', folder='folder1')
+
+ def test_interface(self):
+ from zope.app.services.cache \
+ import ILocalCachingService
+ verifyObject(ILocalCachingService, self.service)
+ verifyObject(ICachingService, self.service)
+
+ def test_getCache(self):
+ self.assertEqual(self.cache1, self.service.getCache('cache1'))
+ self.assertEqual(self.cache2, self.service.getCache('cache2'))
+ self.assertRaises(KeyError, self.service.getCache, 'cache3')
+ self.assertRaises(KeyError, self.service.getCache, 'cache4')
+
+ self.assertEqual(self.cache1_f1, self.service_f1.getCache('cache1'))
+ self.assertEqual(self.cache2, self.service_f1.getCache('cache2'))
+ self.assertRaises(KeyError, self.service_f1.getCache, 'cache3')
+ self.assertEqual(self.cache4_f1, self.service_f1.getCache('cache4'))
+ self.assertRaises(KeyError, self.service_f1.getCache, 'cache5')
+
+ def test_queryCache(self):
+ self.assertEqual(self.cache1, self.service.queryCache('cache1'))
+ self.assertEqual(self.cache2, self.service.queryCache('cache2'))
+ self.assertEqual(None, self.service.queryCache('cache3'))
+ self.assertEqual('XX', self.service.queryCache('cache4', 'XX'))
+ self.assertEqual(None, self.service.queryCache('cache3'))
+ self.assertEqual('YY', self.service.queryCache('cache4', 'YY'))
+
+ self.assertEqual(self.cache1_f1, self.service_f1.queryCache('cache1'))
+ self.assertEqual(self.cache2, self.service_f1.queryCache('cache2'))
+ self.assertEqual(None, self.service_f1.queryCache('cache3'))
+ self.assertEqual('ZZ', self.service_f1.queryCache('cache3', 'ZZ'))
+ self.assertEqual(self.cache4_f1, self.service_f1.queryCache('cache4'))
+ self.assertEqual(None, self.service_f1.queryCache('cache5'))
+ self.assertEqual('12', self.service_f1.queryCache('cache5', '12'))
+
+ def test_getAvailableCaches(self):
+ self.assertEqual(['cache1', 'cache2'],
+ sort(self.service.getAvailableCaches()))
+ self.assertEqual(['cache1', 'cache2', 'cache4'],
+ sort(self.service_f1.getAvailableCaches()))
+
+
+def test_suite():
+ return TestSuite((
+ makeSuite(TestCachingService),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_configurationmanager.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/services/tests/test_configurationmanager.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,350 @@
+##############################################################################
+#
+# Copyright (c) 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 zope.app.services.configurationmanager \
+ import ConfigurationManager
+from zope.app.interfaces.services.configurationmanager \
+ import IConfigurationManager
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.interface.common.tests.basemapping import BaseTestIEnumerableMapping
+from zope.interface.verify import verifyObject
+from zope.app.interfaces.container import IDeleteNotifiable
+from zope.app.interfaces.container import IContainer
+from zope.app.interfaces.container import IZopeContainer
+from zope.app.container.zopecontainer import ZopeContainerAdapter
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component.adapter import provideAdapter
+
+
+class Undeletable:
+
+ __implements__ = IDeleteNotifiable
+
+ def manage_beforeDelete(self, object, container):
+ self.was_called = 1
+
+
+class Test(BaseTestIEnumerableMapping, PlacelessSetup, TestCase):
+
+ """Testing for Configuration Manager """
+
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+ self.__manager = manager = ConfigurationManager()
+ for l in 'abcdefghijklmnop':
+ manager.setObject('', l)
+ del manager['8']
+ del manager['10']
+
+ def test_implements_IConfigurationManager(self):
+ verifyObject(IConfigurationManager, self.__manager)
+
+ def _IEnumerableMapping__stateDict(self):
+ # Hook needed by BaseTestIEnumerableMapping
+ # also, effectively test setObject and __delitem__.
+ return {
+ '1': 'a', '2': 'b', '3': 'c', '4': 'd', '5': 'e',
+ '6': 'f', '7': 'g', '9': 'i', '11': 'k', '12': 'l',
+ '13': 'm', '14': 'n', '15': 'o', '16': 'p',
+ }
+
+ def _IEnumerableMapping__sample(self):
+ # Hook needed by BaseTestIEnumerableMapping
+ # also, effectively test setObject and __delitem__.
+ return self.__manager
+
+ def _IEnumerableMapping__absentKeys(self):
+ # Hook needed by BaseTestIEnumerableMapping
+ # also, effectively test setObject and __delitem__.
+ return ['-1', '8', '10', '17', '100', '10000']
+
+ #########################################################
+ # Move Top
+
+ def test_moveTop_nothing(self):
+ self.__manager.moveTop([])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveTop_1_no_effect(self):
+ self.__manager.moveTop(['1'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveTop_many_no_effect(self):
+ self.__manager.moveTop(['1', '88', '3', '2', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveTop_1(self):
+ self.__manager.moveTop(['3'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['3', '1', '2', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveTop_many(self):
+ self.__manager.moveTop(['1', '3', '88', '4', '11', '15', '16', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '3', '4', '11', '15', '16', '2', '5', '6', '7', '9',
+ '12', '13', '14'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveTop_one_element_container(self):
+ manager = ConfigurationManager()
+ manager.setObject('', 'a')
+ manager.moveTop(['1'])
+ self.assertEqual(list(manager.items()), [('1', 'a')])
+
+ #########################################################
+ # Move Bottom
+
+ def test_moveBottom_nothing(self):
+ self.__manager.moveBottom([])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveBottom_1_no_effect(self):
+ self.__manager.moveBottom(['16'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveBottom_many_no_effect(self):
+ self.__manager.moveBottom(['14', '88', '16', '15', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveBottom_1(self):
+ self.__manager.moveBottom(['3'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16', '3'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveBottom_many(self):
+ self.__manager.moveBottom(
+ ['1', '3', '88', '4', '11', '16', '15', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['2', '5', '6', '7', '9',
+ '12', '13', '14', '1', '3', '4', '11', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveBottom_one_element_container(self):
+ manager = ConfigurationManager()
+ manager.setObject('', 'a')
+ manager.moveBottom(['1'])
+ self.assertEqual(list(manager.items()), [('1', 'a')])
+
+ #########################################################
+ # Move Up
+
+ def test_moveUp_nothing(self):
+ self.__manager.moveUp([])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveUp_1_no_effect(self):
+ self.__manager.moveUp(['1'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveUp_many_no_effect(self):
+ self.__manager.moveUp(['1', '88', '3', '2', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveUp_1(self):
+ self.__manager.moveUp(['3'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '3', '2', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveUp_many(self):
+ self.__manager.moveUp(
+ ['1', '3', '88', '4', '11', '16', '15', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '3', '4', '2', '5', '6', '7', '11', '9',
+ '12', '13', '15', '16', '14'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveUp_one_element_container(self):
+ manager = ConfigurationManager()
+ manager.setObject('', 'a')
+ manager.moveUp(['1'])
+ self.assertEqual(list(manager.items()), [('1', 'a')])
+
+ #########################################################
+ # Move Down
+
+ def test_moveDown_nothing(self):
+ self.__manager.moveDown([])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveDown_1_no_effect(self):
+ self.__manager.moveDown(['16'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveDown_many_no_effect(self):
+ self.__manager.moveDown(['16', '88', '14', '15', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '3', '4', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveDown_1(self):
+ self.__manager.moveDown(['3'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['1', '2', '4', '3', '5', '6', '7', '9',
+ '11', '12', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveDown_many(self):
+ self.__manager.moveDown(
+ ['1', '3', '88', '4', '11', '16', '15', '99'])
+ self.assertEqual(
+ list(self.__manager.keys()),
+ ['2', '1', '5', '3', '4', '6', '7', '9',
+ '12', '11', '13', '14', '15', '16'],
+ )
+
+ # Make sure we still have thye right items
+ self.test_items()
+
+ def test_moveDown_one_element_container(self):
+ manager = ConfigurationManager()
+ manager.setObject('', 'a')
+ manager.moveDown(['1'])
+ self.assertEqual(list(manager.items()), [('1', 'a')])
+
+ #########################################################
+
+ def test_manageBeforeDelete(self):
+ provideAdapter(IContainer, IZopeContainer, ZopeContainerAdapter)
+ container = []
+ manager = ConfigurationManager()
+ thingy = Undeletable()
+ manager.setObject('xyzzy', thingy)
+ manager.manage_beforeDelete(manager, container)
+ self.failUnless(thingy.was_called)
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_configurationregistry.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_configurationregistry.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,216 @@
+##############################################################################
+#
+# 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$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.proxy.context import ContextWrapper, getItem
+from zope.app.services.configuration import ConfigurationRegistry
+from zope.app.services.service import ServiceManager
+from zope.app.traversing import traverse
+
+class Configuration:
+
+ active = 0
+
+ def activated(self):
+ self.active += 1
+
+ def deactivated(self):
+ self.active -= 1
+
+
+class Test(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ root = self.rootFolder
+
+ root.setServiceManager(ServiceManager())
+ self.__default = traverse(root, "++etc++Services/Packages/default")
+ self.__registry = ContextWrapper(ConfigurationRegistry(), root)
+
+ def __config(self, name):
+ self.__default.setObject(name, Configuration())
+ return getItem(self.__default, name)
+
+ def test_register_and_registered_and_nonzero_and_active(self):
+ registry = self.__registry
+
+ self.assertEqual(registry.active(), None)
+
+ self.failIf(registry)
+ self.__c1 = c1 = self.__config("1")
+ registry.register(c1)
+ self.failUnless(registry)
+ self.failUnless(registry.registered(c1))
+ self.assertEqual(c1.active, 0)
+
+ self.assertEqual(registry.active(), None)
+
+ self.__c2 = c2 = self.__config("2")
+ self.failIf(registry.registered(c2))
+ registry.register(c2)
+ self.failUnless(registry)
+ self.failUnless(registry.registered(c2))
+ self.assertEqual(c2.active, 0)
+
+
+ def test_unregister_and_registered_and_nonzero(self):
+ # reuse registration test to set things up (more)
+ self.test_register_and_registered_and_nonzero_and_active()
+
+ registry = self.__registry
+
+ c1 = self.__c1
+ registry.unregister(c1)
+ self.failIf(registry.registered(c1))
+ self.assertEqual(c1.active, 0)
+
+ c2 = self.__c2
+ registry.unregister(c2)
+ self.failIf(registry.registered(c2))
+ self.assertEqual(c2.active, 0)
+
+ self.failIf(registry)
+
+ def test_activate_and_active(self):
+ # reuse registration test to set things up (more)
+ self.test_register_and_registered_and_nonzero_and_active()
+
+ registry = self.__registry
+ self.assertEqual(registry.active(), None)
+
+ c1 = self.__c1
+ c2 = self.__c2
+
+ registry.activate(c2)
+ self.assertEqual(c1.active, 0)
+ self.failUnless(registry.registered(c1))
+ self.assertEqual(c2.active, 1)
+ self.failUnless(registry.registered(c2))
+ self.assertEqual(registry.active(), c2)
+
+ registry.activate(c2)
+ self.assertEqual(c1.active, 0)
+ self.failUnless(registry.registered(c1))
+ self.assertEqual(c2.active, 1)
+ self.failUnless(registry.registered(c2))
+ self.assertEqual(registry.active(), c2)
+
+ registry.activate(c1)
+ self.assertEqual(c1.active, 1)
+ self.failUnless(registry.registered(c1))
+ self.assertEqual(c2.active, 0)
+ self.failUnless(registry.registered(c2))
+ self.assertEqual(registry.active(), c1)
+
+ def test_activate_unregistered(self):
+ registry = self.__registry
+ self.assertRaises(ValueError, registry.activate, self.__config('3'))
+ self.test_activate_and_active()
+ self.assertRaises(ValueError, registry.activate, self.__config('4'))
+
+ def test_deactivate(self):
+ self.test_activate_and_active()
+
+ registry = self.__registry
+ c1 = self.__c1
+ c2 = self.__c2
+ self.assertEqual(registry.active(), c1)
+
+ registry.deactivate(c2)
+ self.assertEqual(c2.active, 0)
+ self.assertEqual(registry.active(), c1)
+
+ registry.deactivate(c1)
+ self.assertEqual(c2.active, 0)
+ self.assertEqual(c1.active, 0)
+ self.assertEqual(registry.active(), None)
+
+ self.failUnless(registry.registered(c1))
+ self.failUnless(registry.registered(c2))
+
+ def test_unregister_active(self):
+ self.test_activate_and_active()
+
+ registry = self.__registry
+ c1 = self.__c1
+ c2 = self.__c2
+ self.assertEqual(registry.active(), c1)
+
+ registry.unregister(c1)
+ self.assertEqual(c2.active, 0)
+ self.assertEqual(c1.active, 0)
+ self.assertEqual(registry.active(), None)
+
+ self.failIf(registry.registered(c1))
+ self.failUnless(registry.registered(c2))
+
+ def test_deactivate_unregistered(self):
+ registry = self.__registry
+ self.assertRaises(ValueError, registry.deactivate, self.__config('3'))
+
+ def test_info(self):
+ self.test_activate_and_active()
+
+ registry = self.__registry
+ c1 = self.__c1
+ c2 = self.__c2
+
+ info = registry.info()
+ info.sort(lambda a, b: cmp(a['id'], b['id']))
+ self.assertEqual(
+ info,
+ [
+ {'id': 'default/1',
+ 'active': True,
+ 'configuration': c1,
+ },
+ {'id': 'default/2',
+ 'active': False,
+ 'configuration': c2,
+ },
+ ])
+
+ registry.deactivate(c1)
+
+ info = registry.info()
+ info.sort(lambda a, b: cmp(a['id'], b['id']))
+ self.assertEqual(
+ info,
+ [
+ {'id': 'default/1',
+ 'active': False,
+ 'configuration': c1,
+ },
+ {'id': 'default/2',
+ 'active': False,
+ 'configuration': c2,
+ },
+ ])
+
+def test_suite():
+ return TestSuite((
+ makeSuite(Test),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_configurations.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_configurations.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,152 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Unit tests for configuration classes
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+
+from zope.interface import Interface
+from zope.app.interfaces.services.configuration \
+ import Active, Registered, Unregistered
+from zope.app.interfaces.dependable import DependencyError
+from zope.app.services.configuration import SimpleConfiguration
+from zope.app.services.configuration import NamedComponentConfiguration
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.app.services.tests.servicemanager \
+ import TestingServiceManager
+from zope.proxy.context import ContextWrapper
+from zope.app.interfaces.dependable import IDependable
+from zope.app.traversing import traverse
+from zope.security.proxy import Proxy
+
+
+class ITestComponent(Interface):
+ pass
+
+class ComponentStub:
+
+ __implements__ = IDependable
+
+ _dependents = ()
+
+ def addDependent(self, location):
+ self._dependents = tuple(
+ [d for d in self._dependents if d != location]
+ +
+ [location]
+ )
+
+ def removeDependent(self, location):
+ self._dependents = tuple(
+ [d for d in self._dependents if d != location]
+ )
+
+ def dependents(self):
+ return self._dependents
+
+
+
+class TestSimpleConfiguration(TestCase):
+
+ def test_manage_beforeDelete(self):
+ container = object()
+ cfg = SimpleConfiguration()
+
+ # cannot delete an active configuration
+ cfg.status = Active
+ self.assertRaises(DependencyError, cfg.manage_beforeDelete, cfg,
+ container)
+
+ # deletion of a registered configuration causes it to become
+ # unregistered
+ cfg.status = Registered
+ cfg.manage_beforeDelete(cfg, container)
+ self.assertEquals(cfg.status, Unregistered)
+
+
+class TestNamedComponentConfiguration(TestSimpleConfiguration, PlacefulSetup):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.__sm = TestingServiceManager()
+ self.rootFolder.setServiceManager(self.__sm)
+ self.name = 'foo'
+
+ def test_getComponent(self):
+ # set up a component
+ path, component = 'foo', object()
+ self.rootFolder.setObject(path, component)
+ # set up a configuration
+ cfg = NamedComponentConfiguration(self.name, path)
+ cfg = ContextWrapper(cfg, self.rootFolder)
+ # check that getComponent finds the configuration
+ self.assertEquals(cfg.getComponent(), component)
+
+ def test_getComponent_permission(self):
+ # set up a component
+ path, component = 'foo', object()
+ self.rootFolder.setObject(path, component)
+ # set up a configuration
+ cfg = NamedComponentConfiguration(self.name, path, 'zope.TopSecret')
+ cfg.getInterface = lambda: ITestComponent
+ cfg = ContextWrapper(cfg, self.rootFolder)
+ # check that getComponent finds the configuration
+ result = cfg.getComponent()
+ self.assertEquals(result, component)
+ self.failUnless(type(result) is Proxy)
+
+ def test_manage_afterAdd(self):
+ # set up a component
+ path, component = 'foo', ComponentStub()
+ self.rootFolder.setObject(path, component)
+ # set up a configuration
+ cfg = NamedComponentConfiguration(self.name, path)
+ self.rootFolder.setObject('cfg', cfg)
+ cfg = traverse(self.rootFolder, 'cfg')
+ # simulate IAddNotifiable
+ cfg.manage_afterAdd(cfg, self.rootFolder)
+ # check that the dependency tracking works
+ self.assertEquals(component.dependents(), ('/cfg',))
+
+ def test_manage_beforeDelete_dependents(self):
+ # set up a component
+ path, component = 'foo', ComponentStub()
+ self.rootFolder.setObject(path, component)
+ component.addDependent('/cfg')
+ # set up a configuration
+ cfg = NamedComponentConfiguration(self.name, path)
+ cfg.status = Unregistered
+ self.rootFolder.setObject('cfg', cfg)
+ cfg = traverse(self.rootFolder, 'cfg')
+ # simulate IDeleteNotifiable
+ cfg.manage_beforeDelete(cfg, self.rootFolder)
+ # check that the dependency tracking works
+ self.assertEquals(component.dependents(), ())
+
+
+# NamedConfiguration is too simple to need testing at the moment
+
+
+def test_suite():
+ return TestSuite((
+ makeSuite(TestSimpleConfiguration),
+ makeSuite(TestNamedComponentConfiguration),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_configurationstatusproperty.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_configurationstatusproperty.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,153 @@
+##############################################################################
+#
+# 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$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.component.interfaces import IServiceService
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.app.services.role import RoleService
+from zope.app.services.tests.configurationregistry \
+ import TestingConfigurationRegistry, TestingConfiguration
+from zope.app.services.configuration import ConfigurationStatusProperty
+from zope.app.interfaces.services.configuration \
+ import Active, Unregistered, Registered
+from zope.proxy.context import ContextWrapper
+from zope.component.exceptions import ComponentLookupError
+
+
+class TestingConfiguration(TestingConfiguration):
+ status = ConfigurationStatusProperty("Services")
+ service_type = "Test"
+
+class PassiveConfiguration(TestingConfiguration):
+ status = ConfigurationStatusProperty("NoSuchService")
+
+class TestingConfigurationRegistry(TestingConfigurationRegistry):
+ class_ = TestingConfiguration
+
+class TestingServiceManager:
+
+ __implements__ = IServiceService # I lied
+
+ registry = None
+
+ def getService(self, name):
+ if name == "Services":
+ return self
+ raise ComponentLookupError("Wrong service name", name)
+
+ def queryService(self, name, default=None):
+ if name == "Services":
+ return self
+ else:
+ return default
+
+ def queryConfigurationsFor(self, configuration, default=None):
+ if configuration.service_type != "Test":
+ raise ValueError("Bad service type", configuration.service_type)
+ return self.registry
+
+ def createConfigurationsFor(self, configuration):
+ if configuration.service_type != "Test":
+ raise ValueError("Bad service type", configuration.service_type)
+ self.registry = TestingConfigurationRegistry()
+ return self.registry
+
+
+class Test(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.__sm = TestingServiceManager()
+ self.rootFolder.setServiceManager(self.__sm)
+
+ def test_property(self):
+
+ configa = ContextWrapper(TestingConfiguration('a'), self.rootFolder)
+ self.assertEqual(configa.status, Unregistered)
+
+ configa.status = Registered
+ self.assertEqual(self.__sm.registry._data, (None, 'a'))
+ self.assertEqual(configa.status, Registered)
+
+ configa.status = Active
+ self.assertEqual(self.__sm.registry._data, ('a', ))
+ self.assertEqual(configa.status, Active)
+
+ configb = ContextWrapper(TestingConfiguration('b'), self.rootFolder)
+ self.assertEqual(self.__sm.registry._data, ('a', ))
+ self.assertEqual(configb.status, Unregistered)
+
+ configb.status = Registered
+ self.assertEqual(self.__sm.registry._data, ('a', 'b'))
+ self.assertEqual(configb.status, Registered)
+
+ configc = ContextWrapper(TestingConfiguration('c'), self.rootFolder)
+ self.assertEqual(configc.status, Unregistered)
+ self.assertEqual(self.__sm.registry._data, ('a', 'b'))
+
+ configc.status = Registered
+ self.assertEqual(self.__sm.registry._data, ('a', 'b', 'c'))
+ self.assertEqual(configc.status, Registered)
+
+ configc.status = Active
+ self.assertEqual(self.__sm.registry._data, ('c', 'a', 'b'))
+ self.assertEqual(configc.status, Active)
+
+ configc.status = Unregistered
+ self.assertEqual(self.__sm.registry._data, (None, 'a', 'b'))
+ self.assertEqual(configc.status, Unregistered)
+ self.assertEqual(configb.status, Registered)
+ self.assertEqual(configa.status, Registered)
+
+ def test_passive(self):
+ # scenario:
+ # 1. create and configure an SQLConnectionService
+ # 2. create and configure a database adapter&connection
+ # 3. disable SQLConnectionService
+ # now the ConnectionConfiguration.status cannot access the
+ # SQLConnectionService
+
+ configa = ContextWrapper(PassiveConfiguration('a'), self.rootFolder)
+ self.assertEqual(configa.status, Unregistered)
+
+ try:
+ configa.status = Registered
+ except ComponentLookupError:
+ self.assertEqual(configa.status, Unregistered)
+ else:
+ self.fail("should complain about missing service")
+
+ try:
+ configa.status = Active
+ except ComponentLookupError:
+ self.assertEqual(configa.status, Unregistered)
+ else:
+ self.fail("should complain about missing service")
+
+
+def test_suite():
+ return TestSuite((
+ makeSuite(Test),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_connectionconfiguration.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_connectionconfiguration.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,133 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Unit test for ConnectionConfiguration.
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+
+from zope.interface import Interface
+
+from zope.app.services.connection import ConnectionConfiguration
+
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.traversing import traverse
+from zope.app.services.service import ServiceManager
+from zope.app.container.zopecontainer import ZopeContainerAdapter
+from zope.app.interfaces.services.configuration import Active, Unregistered
+from zope.app.interfaces.services.configuration import Registered
+from zope.app.interfaces.rdb import IZopeDatabaseAdapter
+from zope.app.interfaces.dependable import IDependable
+from zope.app.interfaces.rdb import IConnectionService
+from zope.app.interfaces.services.configuration import IConfigurable
+from zope.app.services.configuration import ConfigurationRegistry
+from zope.app.services.service import ServiceConfiguration
+from zope.proxy.context import ContextMethod
+from zope.proxy.context import ContextWrapper
+
+class DependableStub:
+
+ __implements__ = IDependable
+
+ def addDependent(self, location):
+ pass
+
+ def removeDependent(self, location):
+ pass
+
+ def dependents(self):
+ pass
+
+
+class TestDA(DependableStub):
+
+ __implements__ = IZopeDatabaseAdapter, IDependable
+
+
+class ConnectionServiceStub(DependableStub):
+
+ __implements__ = IConnectionService, IConfigurable, IDependable
+
+ def __init__(self):
+ self.bindings = {}
+
+ def queryConfigurationsFor(self, cfg, default=None):
+ return self.queryConfigurations(cfg.name)
+ queryConfigurationsFor = ContextMethod(queryConfigurationsFor)
+
+ def queryConfigurations(self, name, default=None):
+ registry = self.bindings.get(name, default)
+ return ContextWrapper(registry, self)
+ queryConfigurations = ContextMethod(queryConfigurations)
+
+ def createConfigurationsFor(self, cfg):
+ return self.createConfigurations(cfg.name)
+ createConfigurationsFor = ContextMethod(createConfigurationsFor)
+
+ def createConfigurations(self, name):
+ try:
+ registry = self.bindings[name]
+ except KeyError:
+ self.bindings[name] = registry = ConfigurationRegistry()
+ return ContextWrapper(registry, self)
+ createConfigurations = ContextMethod(createConfigurations)
+
+
+class TestConnectionConfiguration(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ self.default = traverse(self.rootFolder,
+ '++etc++Services/Packages/default')
+ self.default.setObject('da', TestDA())
+ self.da = traverse(self.default, 'da')
+
+ self.cm = ZopeContainerAdapter(traverse(self.default, "configure"))
+ self.cm.setObject('', ConnectionConfiguration('conn_name',
+ '/++etc++Services/Packages/default/da'))
+ self.config = traverse(self.default, 'configure/1')
+
+ self.default.setObject('conn_srv', ConnectionServiceStub())
+ self.service = traverse(self.default, 'conn_srv')
+
+ self.cm.setObject('', ServiceConfiguration('SQLDatabaseConnections',
+ '/++etc++Services/Packages/default/conn_srv'))
+ traverse(self.default, 'configure/2').status = Active
+
+ def tearDown(self):
+ PlacefulSetup.tearDown(self)
+
+ def test_getComponent(self):
+ # This should be already tested by ComponentConfiguration tests, but
+ # let's doublecheck
+ self.assertEqual(self.config.getComponent(), self.da)
+
+ def test_status(self):
+ self.assertEqual(self.config.status, Unregistered)
+ self.config.status = Active
+ self.assertEqual(self.config.status, Active)
+ cr = self.service.queryConfigurations('conn_name')
+ self.assertEqual(cr.active(), self.config)
+
+
+def test_suite():
+ return makeSuite(TestConnectionConfiguration)
+
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_connectionservice.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_connectionservice.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,170 @@
+##############################################################################
+#
+# Copyright (c) 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
+#
+##############################################################################
+"""DT_SQLVar Tests
+
+$Id$
+"""
+
+import unittest
+from zope.app.traversing import traverse
+from zope.app.interfaces.rdb import IZopeConnection
+from zope.app.interfaces.rdb import IZopeDatabaseAdapter
+from zope.app.interfaces.rdb import \
+ IConnectionService
+from zope.app.container.zopecontainer import ZopeContainerAdapter
+from zope.app.services.connection import \
+ ConnectionService
+from zope.app.services.service \
+ import ServiceManager
+from zope.app.services.service \
+ import ServiceConfiguration
+from zope.app.interfaces.dependable import IDependable
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.app.interfaces.annotation import IAnnotatable
+from zope.app.interfaces.annotation import IAttributeAnnotatable
+from zope.app.attributeannotations import AttributeAnnotations
+from zope.app.interfaces.annotation import IAnnotations
+from zope.app.interfaces.dependable import IDependable
+from zope.app.dependable import Dependable
+from zope.component.adapter import provideAdapter
+from zope.app.interfaces.services.configuration \
+ import Active, Unregistered, Registered
+from zope.app.services.connection \
+ import ConnectionConfiguration
+
+
+class ConnectionServiceForTests(ConnectionService):
+
+ __implements__ = ConnectionService.__implements__, IAttributeAnnotatable
+
+class DAStub:
+
+ __implements__ = IZopeDatabaseAdapter, IAttributeAnnotatable
+
+ def __init__(self, n):
+ self.n = n
+
+ def __call__(self):
+ return 'DA #%d' % self.n
+
+
+def sort(list):
+ list.sort()
+ return list
+
+
+class TestConnectionService(unittest.TestCase, PlacefulSetup):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+
+ provideAdapter(IAttributeAnnotatable,
+ IAnnotations, AttributeAnnotations)
+ provideAdapter(IAnnotatable, IDependable, Dependable)
+
+ # Set up a local connection service
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ self.default = traverse(self.rootFolder,
+ '++etc++Services/Packages/default')
+ self.default.setObject('conn_srv', ConnectionServiceForTests())
+ self.service = traverse(self.default, 'conn_srv')
+
+ self.cm = ZopeContainerAdapter(traverse(self.default, "configure"))
+ self.cm.setObject('', ServiceConfiguration('SQLDatabaseConnections',
+ '/++etc++Services/Packages/default/conn_srv'))
+ traverse(self.default, 'configure/1').status = Active
+
+ self.default.setObject('da1', DAStub(1))
+ self.default.setObject('da2', DAStub(2))
+
+ self.cm.setObject('', ConnectionConfiguration('conn1',
+ '/++etc++Services/Packages/default/da1'))
+ traverse(self.default, 'configure/2').status = Active
+ self.cm.setObject('', ConnectionConfiguration('conn2',
+ '/++etc++Services/Packages/default/da2'))
+ traverse(self.default, 'configure/3').status = Active
+ self.cm.setObject('', ConnectionConfiguration('conn3',
+ '/++etc++Services/Packages/default/da1'))
+ traverse(self.default, 'configure/4').status = Registered
+ # Now self.service has conn1 and conn2 available and knows about conn3
+
+ # Set up a more local connection service
+ folder1 = traverse(self.rootFolder, 'folder1')
+ folder1.setServiceManager(ServiceManager())
+
+ default1 = traverse(folder1, '++etc++Services/Packages/default')
+ default1.setObject('conn_srv1', ConnectionServiceForTests())
+ self.service1 = traverse(default1, 'conn_srv1')
+
+ cm1 = ZopeContainerAdapter(traverse(default1, "configure"))
+ cm1.setObject('', ServiceConfiguration('SQLDatabaseConnections',
+ '/folder1/++etc++Services/Packages/default/conn_srv1'))
+ traverse(default1, 'configure/1').status = Active
+
+ default1.setObject('da3', DAStub(3))
+ default1.setObject('da4', DAStub(4))
+
+ cm1.setObject('', ConnectionConfiguration('conn1',
+ '/folder1/++etc++Services/Packages/default/da3'))
+ traverse(default1, 'configure/2').status = Active
+ cm1.setObject('', ConnectionConfiguration('conn4',
+ '/folder1/++etc++Services/Packages/default/da4'))
+ traverse(default1, 'configure/3').status = Active
+ # Now self.service1 overrides conn1, adds new conn4 available, and
+ # inherits conn2 from self.service
+
+ def testGetConnection(self):
+ self.assertEqual('DA #1', self.service.getConnection('conn1'))
+ self.assertEqual('DA #2', self.service.getConnection('conn2'))
+ self.assertRaises(KeyError, self.service.getConnection, 'conn3')
+ self.assertRaises(KeyError, self.service.getConnection, 'conn4')
+
+ self.assertEqual('DA #3', self.service1.getConnection('conn1'))
+ self.assertEqual('DA #2', self.service1.getConnection('conn2'))
+ self.assertRaises(KeyError, self.service1.getConnection, 'conn3')
+ self.assertEqual('DA #4', self.service1.getConnection('conn4'))
+ self.assertRaises(KeyError, self.service1.getConnection, 'conn5')
+
+ def testQueryConnection(self):
+ self.assertEqual('DA #1', self.service.queryConnection('conn1'))
+ self.assertEqual('DA #2', self.service.queryConnection('conn2'))
+ self.assertEqual(None, self.service.queryConnection('conn3'))
+ self.assertEqual('xx', self.service.queryConnection('conn3', 'xx'))
+ self.assertEqual(None, self.service.queryConnection('conn4'))
+ self.assertEqual('xx', self.service.queryConnection('conn4', 'xx'))
+
+ self.assertEqual('DA #3', self.service1.queryConnection('conn1'))
+ self.assertEqual('DA #2', self.service1.queryConnection('conn2'))
+ self.assertEqual(None, self.service1.queryConnection('conn3'))
+ self.assertEqual('xx', self.service1.queryConnection('conn3', 'xx'))
+ self.assertEqual('DA #4', self.service1.queryConnection('conn4'))
+ self.assertEqual(None, self.service1.queryConnection('conn5'))
+ self.assertEqual('xx', self.service1.queryConnection('conn5', 'xx'))
+
+ def testGetAvailableConnections(self):
+ self.assertEqual(['conn1', 'conn2'],
+ sort(self.service.getAvailableConnections()))
+ self.assertEqual(['conn1', 'conn2', 'conn4'],
+ sort(self.service1.getAvailableConnections()))
+
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestConnectionService))
+ return suite
+
+if __name__ == '__main__':
+ unittest.TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_errorreportingservice.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/services/tests/test_errorreportingservice.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,80 @@
+##############################################################################
+#
+# 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$
+"""
+import sys
+
+from unittest import TestCase, TestLoader, TextTestRunner
+from zope.app.services.errorr \
+ import ErrorReportingService
+from zope.testing.cleanup import CleanUp
+from zope.exceptions.exceptionformatter import format_exception
+
+
+class C1:
+ def getAnErrorInfo(self):
+ exc_info = None
+ try:
+ someerror()
+ except:
+ exc_info = sys.exc_info()
+ return exc_info
+
+
+class ErrorReportingServiceTests(CleanUp, TestCase):
+ def test_checkForEmpryLog(self):
+ # Test Check Empty Log
+ errService = ErrorReportingService()
+ getProp = errService.getLogEntries()
+ self.failIf(getProp)
+
+ def test_checkProperties(self):
+ # Test Properties test
+ errService = ErrorReportingService()
+ setProp = {
+ 'keep_entries':10,
+ 'copy_to_zlog':1,
+ 'ignored_exceptions':()
+ }
+ errService.setProperties(**setProp)
+ getProp = errService.getProperties()
+ self.assertEqual(setProp, getProp)
+
+ def test_ErrorLog(self):
+ # Test for Logging Error. Create one error and check whether its
+ # logged or not.
+ errService = ErrorReportingService()
+ exc_info = C1().getAnErrorInfo()
+ errService.raising(exc_info)
+ getErrLog = errService.getLogEntries()
+ self.assertEquals(1, len(getErrLog))
+
+ tb_text = ''.join(format_exception(*exc_info, **{'as_html': 0}))
+
+ err_id = getErrLog[0]['id']
+ self.assertEquals(tb_text,
+ errService.getLogEntryById(err_id)['tb_text'])
+
+
+
+
+def test_suite():
+ loader=TestLoader()
+ return loader.loadTestsFromTestCase(ErrorReportingServiceTests)
+
+if __name__=='__main__':
+ TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_eventservice.py 1.1 => 1.2 === (408/508 lines abridged)
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_eventservice.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,505 @@
+##############################################################################
+#
+# 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, TestLoader, TextTestRunner
+
+from zope.app.services.service import ServiceManager
+
+from zope.app.services.event import LocalEventService
+
+from zope.app.services.service import ServiceConfiguration
+
+from zope.app.traversing import getPhysicalPathString, traverse
+
+from zope.exceptions import NotFoundError
+
+from zope.event import subscribe, unsubscribe, listSubscriptions, publish
+from zope.event import getEventService
+from zope.event.tests.subscriber import DummySubscriber, DummyFilter
+from zope.app.interfaces.event import IObjectEvent
+from zope.app.interfaces.event import IObjectAddedEvent
+from zope.app.interfaces.event import IObjectRemovedEvent
+from zope.app.interfaces.event import IObjectModifiedEvent
+from zope.app.event.objectevent import ObjectAddedEvent, ObjectModifiedEvent
+from zope.app.event.objectevent import ObjectAddedEvent
+from zope.app.event.globaleventservice import GlobalEventService
+from zope.interfaces.event import IEvent
+from zope.interfaces.event import ISubscriptionAware
+from zope.app.interfaces.services.configuration import Active
+from zope.app.interfaces.services.configuration import Unregistered
+from zope.app.interfaces.services.configuration import Registered
+
[-=- -=- -=- 408 lines omitted -=- -=- -=-]
+
+ sm = traverse(self.rootFolder, "folder2/++etc++Services")
+ configuration = sm.queryConfigurations("Events").active()
+ # make sure it doesn't raise any errors
+ configuration.status = Registered
+
+ def testSubscriptionAwareInteraction(self):
+ sub = DummySubscriptionAwareSubscriber()
+ self.rootFolder.setObject(
+ "mySubscriber",
+ DummySubscriptionAwareSubscriber())
+ self.mySubscriber=ContextWrapper(
+ self.rootFolder["mySubscriber"],
+ self.rootFolder,
+ name="mySubscriber")
+ filter = DummyFilter()
+ subscribe(
+ self.mySubscriber,
+ event_type=IObjectAddedEvent,
+ filter=filter)
+ self.assertEqual(
+ self.mySubscriber.subscribable,
+ getEventService(self.rootFolder))
+ self.assertEqual(
+ self.mySubscriber.event_type,
+ IObjectAddedEvent)
+ self.assertEqual(
+ self.mySubscriber.filter,
+ filter)
+ unsubscribe(
+ self.mySubscriber,
+ event_type=IObjectAddedEvent,
+ filter=filter)
+ self.assertEqual(
+ self.mySubscriber.un_subscribable,
+ getEventService(self.rootFolder))
+ self.assertEqual(
+ self.mySubscriber.un_event_type,
+ IObjectAddedEvent)
+ self.assertEqual(
+ self.mySubscriber.un_filter,
+ filter)
+
+
+def test_suite():
+ loader=TestLoader()
+ return loader.loadTestsFromTestCase(EventServiceTests)
+
+if __name__=='__main__':
+ TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_field.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_field.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,57 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Tests for ComponentLocation field.
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.traversing import traverse
+from zope.schema.interfaces import ValidationError
+from zope.interface import Interface
+from zope.app.services.field import ComponentLocation
+
+class I1(Interface): pass
+
+class C:
+ __implements__ = I1
+
+class D:
+ pass
+
+class Test(PlacefulSetup, TestCase):
+
+ def test__validate(self):
+ self.buildFolders()
+ self.folder1.setObject('c', C())
+ self.folder1.setObject('d', D())
+
+ folder2 = traverse(self.rootFolder, 'folder2')
+
+ field = ComponentLocation(type=I1)
+ field = field.bind(folder2)
+
+ field.validate(u'/folder1/c')
+
+ self.assertRaises(ValidationError, field.validate, u'/folder1/d')
+ self.assertRaises(ValidationError, field.validate, u'/folder1/e')
+
+def test_suite():
+ return TestSuite((
+ makeSuite(Test),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_hookedhubevent.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_hookedhubevent.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,157 @@
+##############################################################################
+#
+# Copyright (c) 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$
+"""
+
+# in this version of these tests, we are no longer using a fake
+# ObjectHub, which makes these tests less pure...but still useful
+# as a test for both the events and the object hub for now.
+
+import unittest, sys
+from zope.app.services.tests.objecthubsetup import ObjectHubSetup
+from zope.app.services.hub import \
+ ObjectRegisteredHubEvent, ObjectUnregisteredHubEvent, \
+ ObjectModifiedHubEvent, ObjectMovedHubEvent, \
+ ObjectRemovedHubEvent
+from zope.app.traversing import getPhysicalPath
+
+from zope.component import getService
+
+class AbstractTestHubEvent(ObjectHubSetup, unittest.TestCase):
+
+ klass = None
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub,
+ self.hubid,
+ self.location,
+ self.obj)
+
+ def testGetLocation(self):
+ # Test getLocation method
+ self.assertEqual(self.event.location, self.location)
+
+ def testGetHubId(self):
+ # Test getHubId method
+ self.assertEqual(self.event.hubid, self.hubid)
+
+ def testGetObject(self):
+ # Test getObject method
+ self.assertEqual(self.event.object, self.obj)
+
+class TestObjectRegisteredHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectRegisteredHubEvent
+
+class TestEmptyObjectRegisteredHubEvent(TestObjectRegisteredHubEvent):
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub, self.hubid)
+
+class TestObjectUnregisteredHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectUnregisteredHubEvent
+
+class TestEmptyObjectUnregisteredHubEvent(TestObjectUnregisteredHubEvent):
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub, self.hubid, self.location)
+
+class TestObjectModifiedHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectModifiedHubEvent
+
+class TestEmptyObjectModifiedHubEvent(TestObjectModifiedHubEvent):
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub, self.hubid)
+
+class TestObjectMovedHubEvent(AbstractTestHubEvent):
+
+ fromLocation = '/old/location'
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub,
+ self.hubid,
+ self.fromLocation,
+ self.location,
+ self.obj)
+
+ def testGetFromLocation(self):
+ # Test from location
+ self.assertEqual(self.event.fromLocation, self.fromLocation)
+
+ klass = ObjectMovedHubEvent
+
+class TestEmptyObjectMovedHubEvent(TestObjectMovedHubEvent):
+
+ def setUp(self):
+ ObjectHubSetup.setUp(self)
+ self.object_hub = getService(self.rootFolder, "ObjectHub")
+ self.obj = self.folder1_2_1
+ self.hubid = self.object_hub.register(self.obj)
+ self.location = getPhysicalPath(self.obj)
+ self.event = self.klass(self.object_hub,
+ self.hubid,
+ self.fromLocation)
+
+class TestObjectRemovedHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectRemovedHubEvent
+
+# Hooked empty object removed not needed
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(TestObjectRegisteredHubEvent),
+ unittest.makeSuite(TestEmptyObjectRegisteredHubEvent),
+ unittest.makeSuite(TestObjectUnregisteredHubEvent),
+ unittest.makeSuite(TestEmptyObjectUnregisteredHubEvent),
+ unittest.makeSuite(TestObjectModifiedHubEvent),
+ unittest.makeSuite(TestEmptyObjectModifiedHubEvent),
+ unittest.makeSuite(TestObjectMovedHubEvent),
+ unittest.makeSuite(TestEmptyObjectMovedHubEvent),
+ unittest.makeSuite(TestObjectRemovedHubEvent),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_hubevent.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_hubevent.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,164 @@
+##############################################################################
+#
+# 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$
+"""
+
+import unittest, sys
+
+from zope.app.services.hub import \
+ ObjectRegisteredHubEvent, ObjectUnregisteredHubEvent, \
+ ObjectModifiedHubEvent, ObjectMovedHubEvent, \
+ ObjectRemovedHubEvent
+
+from zope.exceptions import NotFoundError
+
+class DummyObjectHub:
+
+ def __init__(self, ruid, obj, location):
+ self.ruid = ruid
+ self.obj = obj
+ self.location = location
+
+
+ def getObject(self, ruid):
+ if ruid==self.ruid:
+ return self.obj
+
+ raise NotFoundError
+
+ def getLocation(self, ruid):
+ if ruid==self.ruid:
+ return self.location
+
+ raise NotFoundError
+
+
+class AbstractTestHubEvent(unittest.TestCase):
+
+ location = '/some/location'
+ hubid = 23
+ obj = object()
+ klass = None
+
+ def setUp(self):
+ self.hub = DummyObjectHub(self.hubid, self.obj, self.location)
+ self.event = self.klass(self.hub, self.hubid, self.location, self.obj)
+
+ def testGetHub(self):
+ self.assertEqual(self.event.hub, self.hub)
+
+ def testGetLocation(self):
+ self.assertEqual(self.event.location, self.location)
+
+ def testGetHubId(self):
+ # Test hubid
+ self.assertEqual(self.event.hubid, self.hubid)
+
+ def testGetObject(self):
+ self.assertEqual(self.event.object, self.obj)
+
+class TestObjectRegisteredHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectRegisteredHubEvent
+
+class TestEmptyObjectRegisteredHubEvent(TestObjectRegisteredHubEvent):
+
+ def setUp(self):
+ self.hub = DummyObjectHub(self.hubid, self.obj, self.location)
+ self.event = self.klass(self.hub, self.hubid)
+
+class TestObjectUnregisteredHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectUnregisteredHubEvent
+
+class TestEmptyObjectUnregisteredHubEvent(unittest.TestCase):
+
+ location = '/some/location'
+ hubid = 23
+ obj = object()
+ klass = None
+
+ klass = ObjectUnregisteredHubEvent
+
+ def testRaisesTypeError(self):
+ self.assertRaises(TypeError,
+ self.klass,
+ DummyObjectHub(self.hubid,
+ self.obj,
+ self.location),
+ self.hubid)
+
+class TestObjectModifiedHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectModifiedHubEvent
+
+class TestEmptyObjectModifiedHubEvent(TestObjectModifiedHubEvent):
+
+ def setUp(self):
+ self.hub = DummyObjectHub(self.hubid, self.obj, self.location)
+ self.event = self.klass(self.hub, self.hubid)
+
+class TestObjectMovedHubEvent(AbstractTestHubEvent):
+
+ fromLocation = '/old/location'
+
+ def setUp(self):
+ self.hub = DummyObjectHub(self.hubid, self.obj, self.location)
+ self.event = self.klass(self.hub,
+ self.hubid,
+ self.fromLocation,
+ self.location,
+ self.obj)
+
+ def testGetFromLocation(self):
+ # Test from location
+ self.assertEqual(self.event.fromLocation, self.fromLocation)
+
+ klass = ObjectMovedHubEvent
+
+class TestEmptyObjectMovedHubEvent(TestObjectMovedHubEvent):
+
+ def setUp(self):
+ self.hub = DummyObjectHub(self.hubid, self.obj, self.location)
+ self.event = self.klass(self.hub,
+ self.hubid,
+ self.fromLocation)
+
+class TestObjectRemovedHubEvent(AbstractTestHubEvent):
+
+ klass = ObjectRemovedHubEvent
+
+class TestEmptyObjectRemovedHubEvent(TestEmptyObjectUnregisteredHubEvent):
+
+ klass = ObjectRemovedHubEvent
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(TestObjectRegisteredHubEvent),
+ unittest.makeSuite(TestEmptyObjectRegisteredHubEvent),
+ unittest.makeSuite(TestObjectUnregisteredHubEvent),
+ unittest.makeSuite(TestEmptyObjectUnregisteredHubEvent),
+ unittest.makeSuite(TestObjectModifiedHubEvent),
+ unittest.makeSuite(TestEmptyObjectModifiedHubEvent),
+ unittest.makeSuite(TestObjectMovedHubEvent),
+ unittest.makeSuite(TestEmptyObjectMovedHubEvent),
+ unittest.makeSuite(TestObjectRemovedHubEvent),
+ unittest.makeSuite(TestEmptyObjectRemovedHubEvent),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_nameconfigurable.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_nameconfigurable.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,147 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""NameConfigurable tests
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+
+from zope.app.services.configuration import NameConfigurable
+from zope.app.services.configuration import NameComponentConfigurable
+from zope.proxy.context import ContextWrapper
+from zope.proxy.context import getWrapperContainer
+
+class ConfigurationStub:
+
+ def __init__(self, **kw):
+ self.__dict__.update(kw)
+
+ def getComponent(self):
+ return self.component
+
+
+class RegistryStub:
+
+ def __init__(self, nonzero=0, active=None):
+ self._nonzero = nonzero or (active and 1 or 0)
+ self._active = active
+
+ def __nonzero__(self):
+ return self._nonzero
+
+ def active(self):
+ return self._active
+
+
+class TestNameConfigurable(TestCase):
+
+ def setUp(self):
+ self.container = object()
+ self.subject = ContextWrapper(NameConfigurable(), self.container)
+
+ def test_queryConfigurationsFor(self):
+ subject = self.subject
+ cfg = ConfigurationStub(name="Foo")
+ self.assertEquals(subject.queryConfigurationsFor(cfg), None)
+ self.assertEquals(subject.queryConfigurationsFor(cfg, 42), 42)
+
+ registry = RegistryStub()
+ subject._bindings["Foo"] = registry
+ result = subject.queryConfigurationsFor(cfg)
+ self.assertEquals(result, registry)
+ self.assertEquals(getWrapperContainer(result), subject)
+ self.assertEquals(getWrapperContainer(getWrapperContainer(result)),
+ self.container)
+
+ def test_queryConfigurations(self):
+ subject = self.subject
+ self.assertEquals(subject.queryConfigurations("Foo"), None)
+ self.assertEquals(subject.queryConfigurations("Foo", 42), 42)
+
+ registry = RegistryStub()
+ subject._bindings["Foo"] = registry
+ result = subject.queryConfigurations("Foo")
+ self.assertEquals(result, registry)
+ self.assertEquals(getWrapperContainer(result), subject)
+ self.assertEquals(getWrapperContainer(getWrapperContainer(result)),
+ self.container)
+
+ def test_createConfigurationsFor(self):
+ subject = self.subject
+ cfg1 = ConfigurationStub(name='Foo')
+ cfg2 = ConfigurationStub(name='Bar')
+ r1 = subject.createConfigurationsFor(cfg1)
+ r2 = subject.createConfigurationsFor(cfg2)
+ r3 = subject.createConfigurationsFor(cfg1)
+ self.assertEquals(r1, r3)
+ self.assertNotEquals(r1, r2)
+ self.assertNotEquals(r2, r3)
+ self.assertEquals(r3, subject._bindings['Foo'])
+ self.assertEquals(getWrapperContainer(r3), subject)
+ self.assertEquals(getWrapperContainer(getWrapperContainer(r3)),
+ self.container)
+ self.failUnless(subject._p_changed)
+
+ def test_createConfigurations(self):
+ subject = self.subject
+ r1 = subject.createConfigurations('Foo')
+ r2 = subject.createConfigurations('Bar')
+ r3 = subject.createConfigurations('Foo')
+ self.assertEquals(r1, r3)
+ self.assertNotEquals(r1, r2)
+ self.assertNotEquals(r2, r3)
+ self.assertEquals(r3, subject._bindings['Foo'])
+ self.assertEquals(getWrapperContainer(r3), subject)
+ self.assertEquals(getWrapperContainer(getWrapperContainer(r3)),
+ self.container)
+ self.failUnless(subject._p_changed)
+
+ def test_listConfigurationNames(self):
+ subject = self.subject
+ self.assertEquals(tuple(subject.listConfigurationNames()), ())
+ subject._bindings['Foo'] = 1
+ self.assertEquals(tuple(subject.listConfigurationNames()), ('Foo',))
+ subject._bindings['Bar'] = 0 # false values should be filtered out
+ self.assertEquals(tuple(subject.listConfigurationNames()), ('Foo',))
+
+class TestNameComponentConfigurable(TestNameConfigurable):
+
+ def setUp(self):
+ self.container = object()
+ self.subject = ContextWrapper(NameComponentConfigurable(),
+ self.container)
+
+ def test_queryActiveComponent(self):
+ subject = self.subject
+ self.assertEquals(subject.queryActiveComponent('xyzzy'), None)
+ self.assertEquals(subject.queryActiveComponent('xyzzy', 'No'), 'No')
+ subject._bindings['xyzzy'] = RegistryStub()
+ self.assertEquals(subject.queryActiveComponent('xyzzy'), None)
+ subject._bindings['xyzzy'] = RegistryStub(nonzero=1)
+ self.assertEquals(subject.queryActiveComponent('xyzzy'), None)
+ cfg = ConfigurationStub(component='X')
+ subject._bindings['xyzzy'] = RegistryStub(active=cfg)
+ self.assertEquals(subject.queryActiveComponent('xyzzy'), 'X')
+
+
+def test_suite():
+ return TestSuite((
+ makeSuite(TestNameConfigurable),
+ makeSuite(TestNameComponentConfigurable),
+ ))
+
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_objecthub.py 1.1 => 1.2 === (517/617 lines abridged)
--- /dev/null Wed Dec 25 09:13:54 2002
+++ Zope3/src/zope/app/services/tests/test_objecthub.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,614 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""testObjectHub
+
+Revision information:
+$Id$
+"""
+
+import unittest, sys
+from zope.app.services.tests.objecthubsetup import ObjectHubSetup
+
+from zope.app.interfaces.event\
+ import IObjectAddedEvent, IObjectRemovedEvent, IObjectModifiedEvent,\
+ IObjectMovedEvent
+from zope.app.event.objectevent\
+ import ObjectAddedEvent, ObjectModifiedEvent, ObjectRemovedEvent,\
+ ObjectMovedEvent, ObjectCreatedEvent
+from zope.interfaces.event import ISubscriber
+from zope.app.interfaces.services.hub import ObjectHubError
+from zope.app.interfaces.services.hub import \
+ IObjectRemovedHubEvent, IObjectModifiedHubEvent, \
+ IObjectMovedHubEvent, IObjectRegisteredHubEvent, \
+ IObjectUnregisteredHubEvent
+
+import zope.app.services.hub
+from zope.app.services.hub \
+ import ObjectModifiedHubEvent, ObjectRemovedHubEvent, \
+ ObjectMovedHubEvent, ObjectRegisteredHubEvent, \
+ ObjectUnregisteredHubEvent
+
+from zope.exceptions import NotFoundError
+from types import StringTypes
+
+from zope.app.traversing import locationAsUnicode, locationAsTuple
+
+from zope.component import getService, getServiceManager
[-=- -=- -=- 517 lines omitted -=- -=- -=-]
+
+ hub.notify(moved_event)
+ self.assertRaises(NotFoundError, hub.getHubId, location)
+ self.assertRaises(NotFoundError, hub.getHubId, new_location)
+
+ self.subscriber.verifyEventsReceived(self, [
+ (IObjectMovedEvent, new_location),
+ ])
+
+
+ def testMovedToExistingLocation(self):
+ # Test that moving to an existing location raises ObjectHubError.
+ hub = self.object_hub
+ added_event = self.added_event
+ added_event2 = self.added_new_location_event
+ moved_event = self.moved_event
+ location = self.location
+ new_location = self.new_location
+
+ hub.notify(added_event)
+ hub.notify(added_event2)
+
+ self.assertRaises(ObjectHubError, hub.notify, moved_event)
+
+ self.subscriber.verifyEventsReceived(self, [
+ (IObjectAddedEvent, location),
+ (IObjectRegisteredHubEvent, None, location),
+ (IObjectAddedEvent, new_location),
+ (IObjectRegisteredHubEvent, None, new_location),
+ (IObjectMovedEvent, new_location),
+ ])
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(TransmitObjectRemovedHubEventTest),
+ unittest.makeSuite(TransmitObjectModifiedHubEventTest),
+ unittest.makeSuite(TransmitObjectMovedHubEventTest),
+ unittest.makeSuite(TransmitObjectRegisteredHubEventTest),
+ unittest.makeSuite(TransmitObjectUnregisteredHubEventTest),
+ unittest.makeSuite(TestRegistrationEvents),
+ unittest.makeSuite(TestNoRegistration),
+ unittest.makeSuite(TestSearchRegistrations),
+ unittest.makeSuite(TestObjectAddedEvent),
+ unittest.makeSuite(TestObjectRemovedEvent),
+ unittest.makeSuite(TestObjectModifiedEvent),
+ unittest.makeSuite(TestObjectMovedEvent),
+ ))
+
+if __name__=='__main__':
+ unittest.main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_principalannotation.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_principalannotation.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,106 @@
+##############################################################################
+#
+# 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, TestLoader, TextTestRunner
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.component import getServiceManager, getService
+from zope.app.services.principalannotation import PrincipalAnnotationService, Annotations, AnnotationsForPrincipal
+from zope.app.interfaces.services.principalannotation import IPrincipalAnnotationService
+from zope.component.adapter import provideAdapter
+from zope.component import getAdapter
+from zope.app.interfaces.annotation import IAnnotations
+from zope.app.interfaces.security import IPrincipal
+
+
+class Principal:
+
+ __implements__ = IPrincipal
+
+ def __init__(self, id):
+ self.id = id
+
+ def getId(self):
+ return self.id
+
+
+class PrincipalAnnotationTests(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+
+ root_sm = getServiceManager(None)
+
+ svc = PrincipalAnnotationService()
+
+ root_sm.defineService("PrincipalAnnotation", IPrincipalAnnotationService)
+ root_sm.provideService("PrincipalAnnotation", svc)
+
+ self.createServiceManager()
+
+ sm = getServiceManager(self.rootFolder)
+ sm.PrincipalAnnotation = svc
+
+ self.svc = getService(self.rootFolder, "PrincipalAnnotation")
+
+ def testGetSimple(self):
+ prince = Principal('somebody')
+ self.assert_(not self.svc.hasAnnotation(prince.getId()))
+
+ princeAnnotation = self.svc.getAnnotation(prince.getId())
+ self.assert_(self.svc.hasAnnotation(prince.getId()))
+
+ princeAnnotation['something'] = 'whatever'
+
+ def testGetFromLayered(self):
+ princeSomebody = Principal('somebody')
+ self.createServiceManager(self.folder1)
+ sm1 = getServiceManager(self.folder1)
+ sm1.PrincipalAnnotation = PrincipalAnnotationService()
+ subService = getService(self.folder1, "PrincipalAnnotation")
+
+ parentAnnotation = self.svc.getAnnotation(princeSomebody.getId())
+ self.assert_(self.svc.hasAnnotation(princeSomebody.getId()))
+ self.assert_(not subService.hasAnnotation(princeSomebody.getId()))
+
+ parentAnnotation['hair_color'] = 'blue'
+
+ subAnnotation = subService.getAnnotation(princeSomebody.getId())
+ self.assertEquals(subAnnotation['hair_color'], 'blue')
+
+ subAnnotation['foo'] = 'bar'
+
+ self.assertEquals(parentAnnotation.get("foo"), None)
+
+
+ def testAdapter(self):
+ p = Principal('somebody')
+ provideAdapter(IPrincipal, IAnnotations, AnnotationsForPrincipal(self.svc))
+ annotations = getAdapter(p, IAnnotations)
+ annotations["test"] = "bar"
+ annotations = getAdapter(p, IAnnotations)
+ self.assertEquals(annotations["test"], "bar")
+
+
+def test_suite():
+ loader=TestLoader()
+ return loader.loadTestsFromTestCase(PrincipalAnnotationTests)
+
+if __name__=='__main__':
+ TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_roleservice.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_roleservice.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,95 @@
+##############################################################################
+#
+# 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, TestLoader, TextTestRunner
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.component import getServiceManager, getService
+from zope.app.interfaces.security import IRoleService
+from zope.app.security.registries.roleregistry import roleRegistry
+from zope.app.services.role import RoleService
+from zope.app.services.role import Role
+
+class RoleServiceTests(PlacefulSetup, TestCase):
+
+ def _Test__new(self):
+ return RoleService()
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+
+ root_sm = getServiceManager(None)
+
+ root_sm.defineService("Roles", IRoleService)
+ self.roleRegistry = roleRegistry
+ root_sm.provideService("Roles", roleRegistry)
+
+ self.createServiceManager()
+
+ sm = getServiceManager(self.rootFolder)
+ rs = RoleService()
+ sm.Roles = rs
+
+ self.rs = getService(self.rootFolder,"Roles")
+
+ def testGetRole(self):
+ self.roleRegistry.defineRole('Manager', 'Manager', '')
+
+ r = Role("Hacker","","")
+ self.rs.setObject("Hacker", r)
+ self.assertEqual(self.rs.getRole('Hacker').getId(), 'Hacker')
+ self.assertEqual(self.rs.getRole('Manager').getId(), 'Manager')
+
+ roles = [role.getId() for role in self.rs.getRoles()]
+ roles.sort()
+
+ self.assertEqual(roles, ['Anonymous', 'Hacker', 'Manager'])
+
+ def testGetRoleFromLayeredServices(self):
+ self.roleRegistry.defineRole('Manager', 'Manager', '')
+
+ r = Role("Hacker","","")
+ self.rs.setObject("Hacker", r)
+
+ self.createServiceManager(self.folder1)
+ sm1 = getServiceManager(self.folder1)
+ sm1.Roles = RoleService()
+
+ rs1 = getService(self.folder1, "Roles")
+
+ r1 = Role("Reviewer",'','')
+ rs1.setObject("Reviewer", r1)
+
+ self.assertEqual(rs1.getRole('Hacker').getId(), 'Hacker')
+ self.assertEqual(rs1.getRole('Manager').getId(), 'Manager')
+ self.assertEqual(rs1.getRole('Reviewer').getId(), 'Reviewer')
+
+ roles = [role.getId() for role in rs1.getRoles()]
+ roles.sort()
+
+ self.assertEqual(roles, ['Anonymous', 'Hacker', 'Manager','Reviewer'])
+
+
+
+def test_suite():
+ loader=TestLoader()
+ return loader.loadTestsFromTestCase(RoleServiceTests)
+
+if __name__=='__main__':
+ TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_serviceconfiguration.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_serviceconfiguration.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,145 @@
+##############################################################################
+#
+# 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$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+
+from zope.interface import Interface
+
+from zope.component import getServiceManager
+from zope.app.traversing import traverse
+from zope.app.services.service import ServiceConfiguration
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.services.service import ServiceManager
+from zope.component.service import serviceManager
+from zope.app.interfaces.services.service import IBindingAware
+from zope.app.interfaces.services.configuration import Active, Unregistered
+from zope.app.interfaces.services.configuration import Registered
+
+from zope.app.interfaces.dependable import IDependable
+from zope.app.interfaces.dependable import DependencyError
+
+from zope.app.container.zopecontainer import ZopeContainerAdapter
+
+
+class ITestService(Interface):
+ pass
+
+class TestService:
+ __implements__ = ITestService, IBindingAware, IDependable
+
+ _bound = _unbound = ()
+
+ def bound(self, name):
+ self._bound += (name, )
+
+ def unbound(self, name):
+ self._unbound += (name, )
+
+ _dependents = ()
+
+ def addDependent(self, location):
+ self._dependents = tuple(
+ [d for d in self._dependents if d != location]
+ +
+ [location]
+ )
+
+ def removeDependent(self, location):
+ self._dependents = tuple(
+ [d for d in self._dependents if d != location]
+ )
+
+ def dependents(self):
+ return self._dependents
+
+class Test(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+ serviceManager.defineService('test_service', ITestService)
+ default = traverse(self.rootFolder,
+ '++etc++Services/Packages/default')
+ self.__default = default
+
+ default.setObject('c', TestService())
+
+
+ configuration = ServiceConfiguration(
+ 'test_service', '/++etc++Services/Packages/default/c')
+
+ self.__c = traverse(default, 'c')
+ self.__cm = ZopeContainerAdapter(traverse(default, "configure"))
+
+ self.__cm.setObject('', configuration)
+
+ self.__config = traverse(default, 'configure/1')
+
+ def test_activated(self):
+ old = self.__c._bound
+ self.__config.activated()
+ self.assertEqual(self.__c._bound, old+('test_service',))
+
+ def test_deactivated(self):
+ old = self.__c._unbound
+ self.__config.deactivated()
+ self.assertEqual(self.__c._unbound, old+('test_service',))
+
+ def test_getInterface(self):
+ self.assertEquals(self.__config.getInterface(), ITestService)
+
+ # XXX the following tests check the same things as
+ # zope.app.services.tests.testconfigurations, but in a different way
+
+ def test_getComponent(self):
+ self.assertEqual(self.__config.getComponent(), self.__c)
+
+ def test_manage_afterAdd(self):
+ self.assertEqual(self.__c._dependents,
+ ('/++etc++Services/Packages/default/configure/1', ))
+
+ def test_manage_beforeDelete_and_unregistered(self):
+ self.__config.status = Registered
+
+ sm = getServiceManager(self.__default)
+ registry = sm.queryConfigurationsFor(self.__config)
+ self.failUnless(registry, "The components should be registered")
+
+ del self.__cm['1']
+ self.assertEqual(self.__c._dependents, ())
+
+ self.failIf(registry, "The components should not be registered")
+
+ def test_disallow_delete_when_active(self):
+ self.__config.status = Active
+ try:
+ del self.__cm['1']
+ except DependencyError:
+ pass # OK
+ else:
+ self.failUnless(0, "Should have gotten a depency error")
+
+
+def test_suite():
+ return makeSuite(Test)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_servicemanager.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_servicemanager.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,215 @@
+##############################################################################
+#
+# 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, TestLoader, TextTestRunner
+
+from zope.interface import Interface
+from zope.app.content.folder import RootFolder
+from zope.app.content.folder import Folder
+from zope.proxy.context import getWrapperContext, getWrapperContainer
+from zope.app.services.service import ServiceManager
+from zope.app.services.service import ServiceConfiguration
+from zope.component import getService, getServiceManager
+from zope.exceptions import ZopeError
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.traversing import traverse
+from zope.app.interfaces.services.configuration import Active, Unregistered
+from zope.app.interfaces.services.configuration import Registered
+from zope.component.service import serviceManager
+
+class ITestService(Interface):
+ pass
+
+class TestService:
+
+ __implements__ = ITestService
+
+class ServiceManagerTests(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+
+ serviceManager.defineService('test_service', ITestService)
+
+ def _Test__new(self):
+ return ServiceManager()
+
+ def createServiceManager(self):
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ def testGetService(self):
+ self.createServiceManager()
+ sm = traverse(self.rootFolder, '++etc++Services')
+ default = traverse(sm, 'Packages/default')
+
+ ts = TestService()
+ default.setObject('test_service1', ts)
+ configuration = ServiceConfiguration(
+ 'test_service',
+ '/++etc++Services/Packages/default/test_service1')
+
+ default['configure'].setObject('', configuration)
+ traverse(default, 'configure/1').status = Active
+
+ testOb = getService(self.rootFolder, 'test_service')
+ c = getWrapperContainer
+ self.assertEqual(c(c(c(c(testOb)))), self.rootFolder)
+ self.assertEqual(testOb, ts)
+
+ def test_get(self):
+ self.createServiceManager()
+ sm = traverse(self.rootFolder, '++etc++Services')
+ default = traverse(sm, 'Packages/default')
+
+ ts = TestService()
+ default.setObject('test_service1', ts)
+ configuration = ServiceConfiguration(
+ 'test_service',
+ '/++etc++Services/Packages/default/test_service1')
+
+ default['configure'].setObject('', configuration)
+ traverse(default, 'configure/1').status = Active
+
+ testOb = sm.get('test_service')
+ self.assertEqual(testOb, ts)
+ testOb = sm.get('test_service2')
+ self.assertEqual(testOb, None)
+
+ def testAddService(self):
+ self.createServiceManager()
+ sm = traverse(self.rootFolder, '++etc++Services')
+ default = traverse(sm, 'Packages/default')
+
+ ts1 = TestService()
+ default.setObject('test_service1', ts1)
+ configuration = ServiceConfiguration(
+ 'test_service',
+ '/++etc++Services/Packages/default/test_service1')
+ default['configure'].setObject('', configuration)
+ traverse(default, 'configure/1').status = Active
+
+ ts2 = TestService()
+ default.setObject('test_service2', ts2)
+ configuration = ServiceConfiguration(
+ 'test_service',
+ '/++etc++Services/Packages/default/test_service2')
+ default['configure'].setObject('', configuration)
+ traverse(default, 'configure/2').status = Registered
+
+ testOb = getService(self.rootFolder, 'test_service')
+ self.assertEqual(testOb, ts1)
+
+
+ def testUnbindService(self):
+
+ root_ts = TestService()
+ gsm = getServiceManager(None)
+ gsm.provideService('test_service', root_ts)
+
+ self.testGetService() # set up localservice
+
+ sm = traverse(self.rootFolder, '++etc++Services')
+ traverse(sm, 'Packages/default/configure/1').status = Unregistered
+
+ self.assertEqual(getService(self.rootFolder, 'test_service'), root_ts)
+
+ def testContextServiceLookup(self):
+ self.testGetService() # set up localservice
+ sm=getServiceManager(self.rootFolder)
+ self.assertEqual(getService(self.folder1_1, 'test_service'),
+ sm.Packages['default']['test_service1'])
+
+ def testContextServiceLookupWithMultipleServiceManagers(self):
+ self.testGetService() # set up root localservice
+ sm=getServiceManager(self.rootFolder)
+
+ self.folder1.setServiceManager(ServiceManager())
+ sm2=getServiceManager(self.folder1)
+
+ self.assertEqual(getService(self.folder1, 'test_service'),
+ sm.Packages['default']['test_service1'])
+
+ def testComponentArchitectureServiceLookup(self):
+ self.rootFolder.setServiceManager(ServiceManager())
+ self.folder1.setServiceManager(ServiceManager())
+
+ ts = TestService()
+
+ globsm=getServiceManager(None)
+ globsm.provideService('test_service', ts)
+
+ service = getService(self.folder1, 'test_service')
+ self.assertEqual(service, ts)
+
+ def test_resolve(self):
+ from zope.proxy.context import ContextWrapper as cw
+ from zope.app.services.module import Manager
+ import zope.app.services.tests.sample1
+ import zope.app.services.tests.sample2
+
+ self.rootFolder.setServiceManager(ServiceManager())
+ sm=getServiceManager(self.rootFolder)
+ Packages = cw(sm.Packages, sm, name='Packages')
+ default = cw(Packages['default'], Packages, name='Packages')
+ default.setObject('m1', Manager())
+ manager = cw(default['m1'], default, name='m1')
+ manager.new('zope.app.services.tests.sample1',
+ 'x = "root m1"\n')
+ default.setObject('m2', Manager())
+ manager = cw(default['m2'], default, name='m2')
+ manager.new('XXX.ZZZ', 'x = "root m2"\nZZZ = 42\n')
+
+ self.folder1.setServiceManager(ServiceManager())
+ sm2=getServiceManager(self.folder1)
+ Packages = cw(sm2.Packages, sm2, name='Packages')
+ default = cw(Packages['default'], Packages, name='Packages')
+ default.setObject('m1', Manager())
+ manager = cw(default['m1'], default, name='m1')
+ manager.new('zope.app.services.tests.sample1',
+ 'x = "folder1 m1 1"')
+
+ self.assertEqual(
+ sm2.resolve("zope.app.services.tests.sample1.x"),
+ "folder1 m1 1")
+ self.assertEqual(
+ sm.resolve("zope.app.services.tests.sample1.x"),
+ "root m1")
+
+ self.assertEqual(
+ sm2.resolve("zope.app.services.tests.sample2.y"),
+ "sample 2")
+ self.assertEqual(
+ sm.resolve("zope.app.services.tests.sample2.y"),
+ "sample 2")
+
+ self.assertEqual(sm.resolve("XXX.ZZZ.ZZZ"), 42)
+ self.assertEqual(sm.resolve("XXX.ZZZ."), 42)
+ self.assertEqual(sm.resolve("XXX.ZZZ.x"), "root m2")
+
+ self.assertEqual(sm2.resolve("XXX.ZZZ.ZZZ"), 42)
+ self.assertEqual(sm2.resolve("XXX.ZZZ."), 42)
+ self.assertEqual(sm2.resolve("XXX.ZZZ.x"), "root m2")
+
+
+def test_suite():
+ loader=TestLoader()
+ return loader.loadTestsFromTestCase(ServiceManagerTests)
+
+if __name__=='__main__':
+ TextTestRunner().run(test_suite())
=== Zope3/src/zope/app/services/tests/test_user.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_user.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,82 @@
+##############################################################################
+#
+# 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.auth import User
+
+class UserTest(TestCase):
+
+ def setUp(self):
+ self._user = User('srichter', 'Stephan Richter',
+ 'Local Authentication Service Developer',
+ 'srichter', 'hello')
+
+ def testGetLogin(self):
+ user = self._user
+ self.assertEqual('srichter', user.getLogin())
+
+ def testGetRoles(self):
+ user = self._user
+ self.assertEqual([], user.getRoles())
+
+ def testValidate(self):
+ user = self._user
+ self.assertEqual(1, user.validate('hello'))
+
+ def testGetId(self):
+ user = self._user
+ self.assertEqual('srichter', user.getId())
+
+ def testGetTitle(self):
+ user = self._user
+ self.assertEqual('Stephan Richter', user.getTitle())
+
+ def testGetDescription(self):
+ user = self._user
+ self.assertEqual('Local Authentication Service Developer',
+ user.getDescription())
+
+ def testSetTitle(self):
+ user = self._user
+ user.setTitle('Stephan 2')
+ self.assertEqual('Stephan 2', user.getTitle())
+
+ def testSetDescription(self):
+ user = self._user
+ user.setDescription('Programmer')
+ self.assertEqual('Programmer', user.getDescription())
+
+ def testSetLogin(self):
+ user = self._user
+ user.setLogin('srichter2')
+ self.assertEqual('srichter', user.getLogin())
+
+ def testSetRoles(self):
+ # XXX Needs a test
+ user = self._user
+
+ def testSetPassword(self):
+ user = self._user
+ user.setPassword('hello2')
+ self.assertEqual(1, user.validate('hello2'))
+
+
+def test_suite():
+ return makeSuite(UserTest)
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_view.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:55 2002
+++ Zope3/src/zope/app/services/tests/test_view.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,259 @@
+##############################################################################
+#
+# 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 view module
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.iconfigurable import TestingIConfigurable
+from zope.app.services.view import ViewService
+from zope.interface import Interface
+from zope.proxy.context import ContextWrapper
+from zope.component.exceptions import ComponentLookupError
+from zope.app.services.tests.placefulsetup import PlacefulSetup
+from zope.app.services.service import ServiceManager
+from zope.app.services.view import ViewConfiguration
+from zope.app.content.folder import RootFolder
+from zope.component import getServiceManager
+from zope.app.traversing import traverse
+from zope.component.interfaces import IServiceService
+from zope.component.view import provideView
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.browser import IBrowserPresentation
+from zope.app.interfaces.services.interfaces import IZPTTemplate
+from zope.app.services.view import PageConfiguration, BoundTemplate
+from zope.interface.verify import verifyObject
+from zope.component.interfaces import IViewService
+
+class I1(Interface):
+ pass
+
+class I1E(I1):
+ pass
+
+I2 = IBrowserPresentation
+
+class I3(Interface):
+ pass
+
+class I4(Interface):
+ pass
+
+
+class Configuration:
+ forInterface = I1
+ presentationType = I2
+ viewName = 'test'
+ layer = 'default'
+
+ def getView(self, object, request):
+ return self.factory(object, request)
+
+ def activated(self): pass
+ def deactivated(self): pass
+
+class C: pass
+
+class A:
+ def __init__(self, object, request):
+ self.context = object
+ self.request = request
+
+
+class TestViewService(PlacefulSetup, TestingIConfigurable, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+ self._service = ContextWrapper(ViewService(), self.rootFolder)
+
+ def test_implements_IViewService(self):
+ from zope.component.interfaces import IViewService
+ from zope.interface.verify import verifyObject
+
+ verifyObject(IViewService, self._service)
+
+
+ def createTestingConfigurable(self):
+ return ContextWrapper(ViewService(), C())
+
+ def createTestingConfiguration(self):
+ return Configuration()
+
+ def test_implements_IViewService(self):
+ verifyObject(IViewService, ViewService())
+
+ def test_queryView_no_view(self):
+ service = self._service
+ class O:
+ __implements__ = I1
+
+ o = O()
+ request = TestRequest()
+ self.assertEqual(service.queryView(o, 'test', request), None)
+ self.assertEqual(service.queryView(o, 'test', request, 42), 42)
+
+ def test_getView_no_view(self):
+ service = self._service
+ class O:
+ __implements__ = I1
+
+ o = O()
+ request = TestRequest()
+ self.assertRaises(ComponentLookupError,
+ service.getView, O(), 'test', request)
+
+ def test_queryView_and_getView(self):
+ service = self._service
+
+ sm = traverse(self.rootFolder, '++etc++Services')
+
+ configure = traverse(sm, 'Packages/default/configure')
+ configuration = Configuration()
+ configure.setObject('', configuration)
+ configuration = traverse(configure, '1')
+
+ class O:
+ __implements__ = I1
+
+ configuration.factory = A
+
+ registry = service.createConfigurationsFor(configuration)
+ registry.register(configuration)
+ registry.activate(configuration)
+
+ o = O()
+ request = TestRequest()
+
+ for m in 'queryView', 'getView':
+ for r in I1, I1E:
+ o = O()
+ o.__implements__ = r
+
+ view = getattr(service, m)(o, 'test', request)
+ self.assertEqual(view.__class__, A)
+ self.assertEqual(view.context, o)
+ self.assertEqual(view.request, request)
+
+ def test_queryView_delegation(self):
+ service = self._service
+
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+
+ sm = traverse(self.rootFolder, '++etc++Services')
+
+ configure = traverse(sm, 'Packages/default/configure')
+ configuration = Configuration()
+ configure.setObject('', configuration)
+ configuration = traverse(configure, '1')
+
+ class O:
+ __implements__ = I1
+
+ o = O()
+ request = TestRequest()
+
+ class A2(A): pass
+
+ provideView(I1, 'test', IBrowserPresentation, A2)
+
+ view = service.queryView(o, 'test', request)
+ self.assertEqual(view.__class__, A2)
+ self.assertEqual(view.context, o)
+ self.assertEqual(view.request, request)
+
+ def test_getRegisteredMatching(self):
+ self.test_queryView_and_getView()
+ registry = self._service.queryConfigurationsFor(Configuration())
+
+ for args in ((), (I1E, ), (None, I2), (I1E, I2), ):
+ r = self._service.getRegisteredMatching(*args)
+ self.assertEqual(list(r), [(I1, I2, registry, 'default', 'test')])
+
+class PhonyServiceManager(ServiceManager):
+
+ __implements__ = IServiceService
+
+ def resolve(self, name):
+ if name == 'Foo.Bar.A':
+ return A
+
+class TestViewConfiguration(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ rootFolder = RootFolder()
+ rootFolder.setServiceManager(PhonyServiceManager())
+ self.configuration = ContextWrapper(
+ ViewConfiguration(I1, 'test', IBrowserPresentation, "Foo.Bar.A"),
+ rootFolder,
+ )
+
+ def test_getView(self):
+ c = C()
+ request = TestRequest()
+ view = self.configuration.getView(c, request)
+ self.assertEqual(view.__class__, A)
+ self.assertEqual(view.context, c)
+ self.assertEqual(view.request, request)
+ self.assertEqual(self.configuration.forInterface, I1)
+ self.assertEqual(self.configuration.presentationType, I2)
+
+class PhonyTemplate:
+
+ __implements__ = IZPTTemplate
+
+class TestPageConfiguration(PlacefulSetup, TestCase):
+
+ def setUp(self):
+ PlacefulSetup.setUp(self)
+ rootFolder = RootFolder()
+ rootFolder.setServiceManager(PhonyServiceManager())
+ default = traverse(rootFolder, '++etc++Services/Packages/default')
+ self.__template = PhonyTemplate()
+ default.setObject('t', self.__template)
+ self.__configuration = ContextWrapper(
+ PageConfiguration(I1, 'test', IBrowserPresentation,
+ "Foo.Bar.A",
+ '/++etc++Services/Packages/default/t',
+ ),
+ rootFolder,
+ )
+
+ def test_getView(self):
+ c = C()
+ request = TestRequest()
+ view = self.__configuration.getView(c, request)
+ self.assertEqual(view.__class__, BoundTemplate)
+ self.assertEqual(view.template, self.__template)
+
+ view = view.view
+ self.assertEqual(view.__class__, A)
+ self.assertEqual(view.context, c)
+ self.assertEqual(view.request, request)
+ self.assertEqual(self.__configuration.forInterface, I1)
+ self.assertEqual(self.__configuration.presentationType, I2)
+
+def test_suite():
+ return TestSuite((
+ makeSuite(TestViewService),
+ makeSuite(TestViewConfiguration),
+ makeSuite(TestPageConfiguration),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')
=== Zope3/src/zope/app/services/tests/test_viewpackage.py 1.1 => 1.2 ===
--- /dev/null Wed Dec 25 09:13:56 2002
+++ Zope3/src/zope/app/services/tests/test_viewpackage.py Wed Dec 25 09:13:20 2002
@@ -0,0 +1,68 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""View package tests.
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.services.tests.placefulsetup \
+ import PlacefulSetup
+from zope.app.services.viewpackage import ViewPackage
+from zope.app.traversing import traverse
+from zope.app.services.zpt import ZPTTemplate
+from zope.app.services.view import ViewService
+from zope.app.interfaces.services.configuration import Active
+from zope.app.services.service import ServiceManager
+from zope.app.services.service \
+ import ServiceConfiguration
+from zope.interface import Interface
+
+class Test(PlacefulSetup, TestCase):
+
+ def test_setObject(self):
+ self.buildFolders()
+ self.rootFolder.setServiceManager(ServiceManager())
+ default = traverse(self.rootFolder, '++etc++Services/Packages/default')
+ default.setObject('Views', ViewPackage())
+ views = traverse(default, 'Views')
+ views.forInterface = Interface
+ views.factoryName = None
+
+ #set up view service
+ default.setObject('ViewService', ViewService())
+ configure = traverse(default, 'configure')
+ configuration = ServiceConfiguration(
+ 'Views',
+ '/++etc++Services/Packages/default/ViewService')
+ configure.setObject('', configuration)
+ configuration = traverse(configure, '1')
+ configuration.status = Active
+
+ views.setObject('foo.html', ZPTTemplate())
+
+ configuration = traverse(views, 'configure/1')
+ self.assertEqual(configuration.status, Active)
+
+ self.assertRaises(TypeError,
+ views.setObject, 'bar.html', ViewPackage())
+
+
+def test_suite():
+ return TestSuite((
+ makeSuite(Test),
+ ))
+
+if __name__=='__main__':
+ main(defaultTest='test_suite')