[Checkins] SVN: zope.component/tseaver-test_cleanup/ Get tests to run using 'setup.py test'.
Tres Seaver
cvs-admin at zope.org
Fri May 11 01:59:05 UTC 2012
Log message for revision 125843:
Get tests to run using 'setup.py test'.
Changed:
U zope.component/tseaver-test_cleanup/CHANGES.txt
U zope.component/tseaver-test_cleanup/setup.py
A zope.component/tseaver-test_cleanup/src/zope/component/tests/
A zope.component/tseaver-test_cleanup/src/zope/component/tests/__init__.py
A zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py
D zope.component/tseaver-test_cleanup/src/zope/component/tests.py
-=-
Modified: zope.component/tseaver-test_cleanup/CHANGES.txt
===================================================================
--- zope.component/tseaver-test_cleanup/CHANGES.txt 2012-05-11 01:58:56 UTC (rev 125842)
+++ zope.component/tseaver-test_cleanup/CHANGES.txt 2012-05-11 01:59:01 UTC (rev 125843)
@@ -4,6 +4,8 @@
4.0.0 (unreleased)
==================
+- Got tests to run using ``setup.py test``.
+
- Added ``Sphinx`` documentation.
- Added ``setup.py docs`` alias (installs ``Sphinx`` and dependencies).
Modified: zope.component/tseaver-test_cleanup/setup.py
===================================================================
--- zope.component/tseaver-test_cleanup/setup.py 2012-05-11 01:58:56 UTC (rev 125842)
+++ zope.component/tseaver-test_cleanup/setup.py 2012-05-11 01:59:01 UTC (rev 125843)
@@ -32,7 +32,40 @@
'zope.component[zcml]',
]
+def _modname(path, base, name=''):
+ if path == base:
+ return name
+ dirname, basename = os.path.split(path)
+ return _modname(dirname, base, basename + '.' + name)
+def alltests():
+ import logging
+ import pkg_resources
+ import unittest
+
+ class NullHandler(logging.Handler):
+ level = 50
+
+ def emit(self, record):
+ pass
+
+ logging.getLogger().addHandler(NullHandler())
+
+ suite = unittest.TestSuite()
+ base = pkg_resources.working_set.find(
+ pkg_resources.Requirement.parse('zope.component')).location
+ for dirpath, dirnames, filenames in os.walk(base):
+ if os.path.basename(dirpath) == 'tests':
+ for filename in filenames:
+ if ( filename.endswith('.py') and
+ filename.startswith('test') ):
+ mod = __import__(
+ _modname(dirpath, base, os.path.splitext(filename)[0]),
+ {}, {}, ['*'])
+ suite.addTest(mod.test_suite())
+ return suite
+
+
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
@@ -84,6 +117,7 @@
],
namespace_packages=['zope',],
tests_require = TESTS_REQUIRE,
+ test_suite='__main__.alltests',
install_requires=['setuptools',
'zope.interface>=3.8.0',
'zope.event',
Added: zope.component/tseaver-test_cleanup/src/zope/component/tests/__init__.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests/__init__.py (rev 0)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests/__init__.py 2012-05-11 01:59:01 UTC (rev 125843)
@@ -0,0 +1 @@
+# tests package
Copied: zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py (from rev 125842, zope.component/tseaver-test_cleanup/src/zope/component/tests.py)
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py (rev 0)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py 2012-05-11 01:59:01 UTC (rev 125843)
@@ -0,0 +1,1749 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002, 2009 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (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.
+#
+##############################################################################
+"""Component Architecture Tests
+"""
+
+import __future__
+
+import doctest
+import persistent
+import re
+import sys
+import unittest
+import transaction
+from cStringIO import StringIO
+
+from zope import interface, component
+from zope.interface.verify import verifyObject
+from zope.interface.interfaces import IInterface
+from zope.testing import renormalizing
+from zope.testrunner.layer import UnitTests
+
+from zope.component.interfaces import ComponentLookupError
+from zope.component.interfaces import IComponentArchitecture
+from zope.component.interfaces import IComponentLookup
+from zope.component.testing import setUp, tearDown, PlacelessSetup
+import zope.component.persistentregistry
+import zope.component.globalregistry
+
+from zope.configuration.xmlconfig import XMLConfig, xmlconfig
+from zope.configuration.exceptions import ConfigurationError
+from zope.security.checker import ProxyFactory
+
+from zope.component.testfiles.adapter import A1, A2, A3
+from zope.component.testfiles.components import IContent, Content
+from zope.component.testfiles.components import IApp
+from zope.component.testfiles.views import Request, IC, IV, V1, R1, IR
+
+# side effect gets component-based event dispatcher installed.
+# we should obviously make this more explicit
+import zope.component.event
+
+class I1(interface.Interface):
+ pass
+class I2(interface.Interface):
+ pass
+class I2e(I2):
+ pass
+class I3(interface.Interface):
+ pass
+
+class ITestType(IInterface):
+ pass
+
+class U:
+
+ def __init__(self, name):
+ self.__name__ = name
+
+ def __repr__(self):
+ return "%s(%s)" % (self.__class__.__name__, self.__name__)
+
+class U1(U):
+ interface.implements(I1)
+
+class U12(U):
+ interface.implements(I1, I2)
+
+class IA1(interface.Interface):
+ pass
+
+class IA2(interface.Interface):
+ pass
+
+class IA3(interface.Interface):
+ pass
+
+class A:
+
+ def __init__(self, *context):
+ self.context = context
+
+ def __repr__(self):
+ return "%s%r" % (self.__class__.__name__, self.context)
+
+class A12_1(A):
+ component.adapts(I1, I2)
+ interface.implements(IA1)
+
+class A12_(A):
+ component.adapts(I1, I2)
+
+class A_2(A):
+ interface.implements(IA2)
+
+class A_3(A):
+ interface.implements(IA3)
+
+class A1_12(U):
+ component.adapts(I1)
+ interface.implements(IA1, IA2)
+
+class A1_2(U):
+ component.adapts(I1)
+ interface.implements(IA2)
+
+class A1_23(U):
+ component.adapts(I1)
+ interface.implements(IA1, IA3)
+
+def noop(*args):
+ pass
+
+ at component.adapter(I1)
+def handle1(x):
+ print 'handle1', x
+
+def handle(*objects):
+ print 'handle', objects
+
+ at component.adapter(I1)
+def handle3(x):
+ print 'handle3', x
+
+ at component.adapter(I1)
+def handle4(x):
+ print 'handle4', x
+
+class Ob(object):
+ interface.implements(I1)
+ def __repr__(self):
+ return '<instance Ob>'
+
+
+ob = Ob()
+
+class Ob2(object):
+ interface.implements(I2)
+ def __repr__(self):
+ return '<instance Ob2>'
+
+class Comp(object):
+ interface.implements(I2)
+ def __init__(self, context):
+ self.context = context
+
+comp = Comp(1)
+
+class Comp2(object):
+ interface.implements(I3)
+ def __init__(self, context):
+ self.context = context
+
+
+class ConformsToIComponentLookup(object):
+ """This object allows the sitemanager to conform/adapt to
+ `IComponentLookup` and thus to itself."""
+
+ def __init__(self, sitemanager):
+ self.sitemanager = sitemanager
+
+ def __conform__(self, interface):
+ """This method is specified by the adapter PEP to do the adaptation."""
+ if interface is IComponentLookup:
+ return self.sitemanager
+
+
+def testInterfaces():
+ """Ensure that the component architecture API is provided by
+ `zope.component`.
+
+ >>> verifyObject(IComponentArchitecture, component)
+ True
+ """
+
+def test_getGlobalSiteManager():
+ """One of the most important functions is to get the global site manager.
+
+ >>> from zope.component.interfaces import IComponentLookup
+ >>> from zope.component.globalregistry import base
+
+ Get the global site manager via the CA API function:
+
+ >>> gsm = component.getGlobalSiteManager()
+
+ Make sure that the global site manager implements the correct interface
+ and is the global site manager instance we expect to get.
+
+ >>> IComponentLookup.providedBy(gsm)
+ True
+ >>> base is gsm
+ True
+
+ Finally, ensure that we always get the same global site manager, otherwise
+ our component registry will always be reset.
+
+ >>> component.getGlobalSiteManager() is gsm
+ True
+ """
+
+def test_getSiteManager():
+ """Make sure that `getSiteManager()` always returns the correct site
+ manager instance.
+
+ We don't know anything about the default service manager, except that it
+ is an `IComponentLookup`.
+
+ >>> from zope.component.interfaces import IComponentLookup
+ >>> IComponentLookup.providedBy(component.getSiteManager())
+ True
+
+ Calling `getSiteManager()` with no args is equivalent to calling it with a
+ context of `None`.
+
+ >>> component.getSiteManager() is component.getSiteManager(None)
+ True
+
+ If the context passed to `getSiteManager()` is not `None`, it is
+ adapted to `IComponentLookup` and this adapter returned. So, we
+ create a context that can be adapted to `IComponentLookup` using
+ the `__conform__` API.
+
+ Let's create the simplest stub-implementation of a site manager possible:
+
+ >>> sitemanager = object()
+
+ Now create a context that knows how to adapt to our newly created site
+ manager.
+
+ >>> context = ConformsToIComponentLookup(sitemanager)
+
+ Now make sure that the `getSiteManager()` API call returns the correct
+ site manager.
+
+ >>> component.getSiteManager(context) is sitemanager
+ True
+
+ Using a context that is not adaptable to `IComponentLookup` should fail.
+
+ >>> component.getSiteManager(ob) #doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError: ('Could not adapt', <instance Ob>,
+ <InterfaceClass zope...interfaces.IComponentLookup>)
+ """
+
+def testAdapterInContext(self):
+ """The `getAdapterInContext()` and `queryAdapterInContext()` API functions
+ do not only use the site manager to look up the adapter, but first tries
+ to use the `__conform__()` method of the object to find an adapter as
+ specified by PEP 246.
+
+ Let's start by creating a component that support's the PEP 246's
+ `__conform__()` method:
+
+ >>> class Component(object):
+ ... interface.implements(I1)
+ ... def __conform__(self, iface, default=None):
+ ... if iface == I2:
+ ... return 42
+ ... def __repr__(self):
+ ... return '''<Component implementing 'I1'>'''
+
+ >>> ob = Component()
+
+ We also gave the component a custom representation, so it will be easier
+ to use in these tests.
+
+ We now have to create a site manager (other than the default global one)
+ with which we can register adapters for `I1`.
+
+ >>> from zope.component.globalregistry import BaseGlobalComponents
+ >>> sitemanager = BaseGlobalComponents()
+
+ Now we create a new `context` that knows how to get to our custom site
+ manager.
+
+ >>> context = ConformsToIComponentLookup(sitemanager)
+
+ We now register an adapter from `I1` to `I3`:
+
+ >>> sitemanager.registerAdapter(lambda x: 43, (I1,), I3, '')
+
+ If an object implements the interface you want to adapt to,
+ `getAdapterInContext()` should simply return the object.
+
+ >>> component.getAdapterInContext(ob, I1, context)
+ <Component implementing 'I1'>
+ >>> component.queryAdapterInContext(ob, I1, context)
+ <Component implementing 'I1'>
+
+ If an object conforms to the interface you want to adapt to,
+ `getAdapterInContext()` should simply return the conformed object.
+
+ >>> component.getAdapterInContext(ob, I2, context)
+ 42
+ >>> component.queryAdapterInContext(ob, I2, context)
+ 42
+
+ If an adapter isn't registered for the given object and interface, and you
+ provide no default, raise ComponentLookupError...
+
+ >>> class I4(interface.Interface):
+ ... pass
+
+ >>> component.getAdapterInContext(ob, I4, context) \\
+ ... #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError: (<Component implementing 'I1'>,
+ <InterfaceClass zope.component.tests.I4>)
+
+ ...otherwise, you get the default:
+
+ >>> component.queryAdapterInContext(ob, I4, context, 44)
+ 44
+
+ If you ask for an adapter for which something's registered you get the
+ registered adapter
+
+ >>> component.getAdapterInContext(ob, I3, context)
+ 43
+ >>> component.queryAdapterInContext(ob, I3, context)
+ 43
+ """
+
+def testAdapter():
+ """The `getAdapter()` and `queryAdapter()` API functions are similar to
+ `{get|query}AdapterInContext()` functions, except that they do not care
+ about the `__conform__()` but also handle named adapters. (Actually, the
+ name is a required argument.)
+
+ If an adapter isn't registered for the given object and interface, and you
+ provide no default, raise `ComponentLookupError`...
+
+ >>> component.getAdapter(ob, I2, '') #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError: (<instance Ob>,
+ <InterfaceClass zope.component.tests.I2>,
+ '')
+
+ ...otherwise, you get the default
+
+ >>> component.queryAdapter(ob, I2, '', '<default>')
+ '<default>'
+
+ Now get the global site manager and register an adapter from `I1` to `I2`
+ without a name:
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, (I1,), I2, '')
+
+ You should get a sensible error message if you forget that the 'requires'
+ argument is supposed to be a sequence
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, I1, I2, '')
+ Traceback (most recent call last):
+ ...
+ TypeError: the required argument should be a list of interfaces, not a single interface
+
+ You can now simply access the adapter using the `getAdapter()` API
+ function:
+
+ >>> adapter = component.getAdapter(ob, I2, '')
+ >>> adapter.__class__ is Comp
+ True
+ >>> adapter.context is ob
+ True
+ """
+
+def testInterfaceCall():
+ """Here we test the `adapter_hook()` function that we registered with the
+ `zope.interface` adapter hook registry, so that we can call interfaces to
+ do adaptation.
+
+ First, we need to register an adapter:
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, [I1], I2, '')
+
+ Then we try to adapt `ob` to provide an `I2` interface by calling the `I2`
+ interface with the obejct as first argument:
+
+ >>> adapter = I2(ob)
+ >>> adapter.__class__ is Comp
+ True
+ >>> adapter.context is ob
+ True
+
+ If no adapter is found, a `TypeError is raised...
+
+ >>> I1(Ob2()) #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ TypeError: ('Could not adapt', <instance Ob2>,
+ <InterfaceClass zope.component.tests.I1>)
+
+ ...unless we specify an alternative adapter:
+
+ >>> marker = object()
+ >>> I2(object(), marker) is marker
+ True
+ """
+
+def testNamedAdapter():
+ """Make sure that adapters with names are correctly selected from the
+ registry.
+
+ First we register some named adapter:
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... lambda x: 0, [I1], I2, 'foo')
+
+ If an adapter isn't registered for the given object and interface,
+ and you provide no default, raise `ComponentLookupError`...
+
+ >>> component.getAdapter(ob, I2, 'bar') \\
+ ... #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError:
+ (<instance Ob>, <InterfaceClass zope.component.tests.I2>, 'bar')
+
+ ...otherwise, you get the default
+
+ >>> component.queryAdapter(ob, I2, 'bar', '<default>')
+ '<default>'
+
+ But now we register an adapter for the object having the correct name
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, [I1], I2, 'bar')
+
+ so that the lookup succeeds:
+
+ >>> adapter = component.getAdapter(ob, I2, 'bar')
+ >>> adapter.__class__ is Comp
+ True
+ >>> adapter.context is ob
+ True
+ """
+
+def testMultiAdapter():
+ """Adapting a combination of 2 objects to an interface
+
+ Multi-adapters adapt one or more objects to another interface. To make
+ this demonstration non-trivial, we need to create a second object to be
+ adapted:
+
+ >>> ob2 = Ob2()
+
+ Like for regular adapters, if an adapter isn't registered for the given
+ objects and interface, and you provide no default, raise
+ `ComponentLookupError`...
+
+ >>> component.getMultiAdapter((ob, ob2), I3) \\
+ ... #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError:
+ ((<instance Ob>, <instance Ob2>),
+ <InterfaceClass zope.component.tests.I3>,
+ u'')
+
+ ...otherwise, you get the default
+
+ >>> component.queryMultiAdapter((ob, ob2), I3, default='<default>')
+ '<default>'
+
+ Note that the name is not a required attribute here.
+
+ To test multi-adapters, we also have to create an adapter class that
+ handles to context objects:
+
+ >>> class DoubleAdapter(object):
+ ... interface.implements(I3)
+ ... def __init__(self, first, second):
+ ... self.first = first
+ ... self.second = second
+
+ Now we can register the multi-adapter using
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... DoubleAdapter, (I1, I2), I3, '')
+
+ Notice how the required interfaces are simply provided by a tuple. Now we
+ can get the adapter:
+
+ >>> adapter = component.getMultiAdapter((ob, ob2), I3)
+ >>> adapter.__class__ is DoubleAdapter
+ True
+ >>> adapter.first is ob
+ True
+ >>> adapter.second is ob2
+ True
+ """
+
+def testAdapterForInterfaceNone():
+ """Providing an adapter for None says that your adapter can adapt anything
+ to `I2`.
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, (None,), I2, '')
+
+ >>> adapter = I2(ob)
+ >>> adapter.__class__ is Comp
+ True
+ >>> adapter.context is ob
+ True
+
+ It can really adapt any arbitrary object:
+
+ >>> something = object()
+ >>> adapter = I2(something)
+ >>> adapter.__class__ is Comp
+ True
+ >>> adapter.context is something
+ True
+ """
+
+def testGetAdapters():
+ """It is sometimes desireable to get a list of all adapters that are
+ registered for a particular output interface, given a set of
+ objects.
+
+ Let's register some adapters first:
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, [I1], I2, '')
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... Comp, [None], I2, 'foo')
+
+ Now we get all the adapters that are registered for `ob` that provide
+ `I2`:
+
+ >>> adapters = sorted(component.getAdapters((ob,), I2))
+ >>> [(name, adapter.__class__.__name__) for name, adapter in adapters]
+ [(u'', 'Comp'), (u'foo', 'Comp')]
+
+ Note that the output doesn't include None values. If an adapter
+ factory returns None, it is as if it wasn't present.
+
+ >>> component.getGlobalSiteManager().registerAdapter(
+ ... lambda context: None, [I1], I2, 'nah')
+ >>> adapters = sorted(component.getAdapters((ob,), I2))
+ >>> [(name, adapter.__class__.__name__) for name, adapter in adapters]
+ [(u'', 'Comp'), (u'foo', 'Comp')]
+
+ """
+
+def testUtility():
+ """Utilities are components that simply provide an interface. They are
+ instantiated at the time or before they are registered. Here we test the
+ simple query interface.
+
+ Before we register any utility, there is no utility available, of
+ course. The pure instatiation of an object does not make it a utility. If
+ you do not specify a default, you get a `ComponentLookupError`...
+
+ >>> component.getUtility(I1) #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError: \
+ (<InterfaceClass zope.component.tests.I1>, '')
+
+ ...otherwise, you get the default
+
+ >>> component.queryUtility(I1, default='<default>')
+ '<default>'
+ >>> component.queryUtility(I2, default='<default>')
+ '<default>'
+
+ Now we declare `ob` to be the utility providing `I1`
+
+ >>> component.getGlobalSiteManager().registerUtility(ob, I1)
+
+ so that the component is now available:
+
+ >>> component.getUtility(I1) is ob
+ True
+ """
+
+def testNamedUtility():
+ """Like adapters, utilities can be named.
+
+ Just because you register an utility having no name
+
+ >>> component.getGlobalSiteManager().registerUtility(ob, I1)
+
+ does not mean that they are available when you specify a name:
+
+ >>> component.getUtility(I1, name='foo') \\
+ ... #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError:
+ (<InterfaceClass zope.component.tests.I1>, 'foo')
+
+
+ ...otherwise, you get the default
+
+ >>> component.queryUtility(I1, name='foo', default='<default>')
+ '<default>'
+
+ Registering the utility under the correct name
+
+ >>> component.getGlobalSiteManager().registerUtility(
+ ... ob, I1, name='foo')
+
+ really helps:
+
+ >>> component.getUtility(I1, 'foo') is ob
+ True
+ """
+
+def test_getAllUtilitiesRegisteredFor():
+ """Again, like for adapters, it is often useful to get a list of all
+ utilities that have been registered for a particular interface. Utilities
+ providing a derived interface are also listed.
+
+ Thus, let's create a derivative interface of `I1`:
+
+ >>> class I11(I1):
+ ... pass
+
+ >>> class Ob11(Ob):
+ ... interface.implements(I11)
+
+ >>> ob11 = Ob11()
+ >>> ob_bob = Ob()
+
+ Now we register the new utilities:
+
+ >>> gsm = component.getGlobalSiteManager()
+ >>> gsm.registerUtility(ob, I1)
+ >>> gsm.registerUtility(ob11, I11)
+ >>> gsm.registerUtility(ob_bob, I1, name='bob')
+ >>> gsm.registerUtility(Comp(2), I2)
+
+ We can now get all the utilities that provide interface `I1`:
+
+ >>> uts = list(component.getAllUtilitiesRegisteredFor(I1))
+ >>> uts = sorted([util.__class__.__name__ for util in uts])
+ >>> uts
+ ['Ob', 'Ob', 'Ob11']
+
+ Note that `getAllUtilitiesRegisteredFor()` does not return the names of
+ the utilities.
+ """
+
+def testNotBrokenWhenNoSiteManager():
+ """Make sure that the adapter lookup is not broken, when no site manager
+ is available.
+
+ Both of those things emit `DeprecationWarnings`.
+
+ >>> I2(ob) #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ TypeError: ('Could not adapt',
+ <instance Ob>,
+ <InterfaceClass zope.component.tests.I2>)
+
+
+ >>> I2(ob, 42)
+ 42
+ """
+
+
+def testNo__component_adapts__leakage():
+ """
+ We want to make sure that an `adapts()` call in a class definition
+ doesn't affect instances.
+
+ >>> class C:
+ ... component.adapts()
+
+ >>> C.__component_adapts__
+ ()
+ >>> C().__component_adapts__
+ Traceback (most recent call last):
+ ...
+ AttributeError: __component_adapts__
+ """
+
+def test_ability_to_pickle_globalsitemanager():
+ """
+ We need to make sure that it is possible to pickle the global site manager
+ and its two global adapter registries.
+
+ >>> from zope.component import globalSiteManager
+ >>> import cPickle
+ >>> pickle = cPickle.dumps(globalSiteManager)
+ >>> sm = cPickle.loads(pickle)
+ >>> sm is globalSiteManager
+ True
+
+ Now let's ensure that the registries themselves can be pickled as well:
+
+ >>> pickle = cPickle.dumps(globalSiteManager.adapters)
+ >>> adapters = cPickle.loads(pickle)
+ >>> adapters is globalSiteManager.adapters
+ True
+ """
+
+def test_persistent_component_managers():
+ """
+Here, we'll demonstrate that changes work even when data are stored in
+a database and when accessed from multiple connections.
+
+Start by setting up a database and creating two transaction
+managers and database connections to work with.
+
+ >>> import ZODB.tests.util
+ >>> db = ZODB.tests.util.DB()
+ >>> import transaction
+ >>> t1 = transaction.TransactionManager()
+ >>> c1 = db.open(transaction_manager=t1)
+ >>> r1 = c1.root()
+ >>> t2 = transaction.TransactionManager()
+ >>> c2 = db.open(transaction_manager=t2)
+ >>> r2 = c2.root()
+
+Create a set of components registries in the database, alternating
+connections.
+
+ >>> from zope.component.persistentregistry import PersistentComponents
+
+ >>> _ = t1.begin()
+ >>> r1[1] = PersistentComponents('1')
+ >>> t1.commit()
+
+ >>> _ = t2.begin()
+ >>> r2[2] = PersistentComponents('2', (r2[1], ))
+ >>> t2.commit()
+
+ >>> _ = t1.begin()
+ >>> r1[3] = PersistentComponents('3', (r1[1], ))
+ >>> t1.commit()
+
+ >>> _ = t2.begin()
+ >>> r2[4] = PersistentComponents('4', (r2[2], r2[3]))
+ >>> t2.commit()
+
+ >>> _ = t1.begin()
+ >>> r1[1].__bases__
+ ()
+ >>> r1[2].__bases__ == (r1[1], )
+ True
+
+ >>> r1[1].registerUtility(U1(1))
+ >>> r1[1].queryUtility(I1)
+ U1(1)
+ >>> r1[2].queryUtility(I1)
+ U1(1)
+ >>> t1.commit()
+
+ >>> _ = t2.begin()
+ >>> r2[1].registerUtility(U1(2))
+ >>> r2[2].queryUtility(I1)
+ U1(2)
+
+ >>> r2[4].queryUtility(I1)
+ U1(2)
+ >>> t2.commit()
+
+
+ >>> _ = t1.begin()
+ >>> r1[1].registerUtility(U12(1), I2)
+ >>> r1[4].queryUtility(I2)
+ U12(1)
+ >>> t1.commit()
+
+
+ >>> _ = t2.begin()
+ >>> r2[3].registerUtility(U12(3), I2)
+ >>> r2[4].queryUtility(I2)
+ U12(3)
+ >>> t2.commit()
+
+ >>> _ = t1.begin()
+
+ >>> r1[1].registerHandler(handle1, info="First handler")
+ >>> r1[2].registerHandler(handle, required=[U])
+
+ >>> r1[3].registerHandler(handle3)
+
+ >>> r1[4].registerHandler(handle4)
+
+ >>> r1[4].handle(U1(1))
+ handle1 U1(1)
+ handle3 U1(1)
+ handle (U1(1),)
+ handle4 U1(1)
+
+ >>> t1.commit()
+
+ >>> _ = t2.begin()
+ >>> r2[4].handle(U1(1))
+ handle1 U1(1)
+ handle3 U1(1)
+ handle (U1(1),)
+ handle4 U1(1)
+ >>> t2.abort()
+
+ >>> db.close()
+ """
+
+def persistent_registry_doesnt_scew_up_subsribers():
+ """
+ >>> import ZODB.tests.util
+ >>> db = ZODB.tests.util.DB()
+ >>> import transaction
+ >>> t1 = transaction.TransactionManager()
+ >>> c1 = db.open(transaction_manager=t1)
+ >>> r1 = c1.root()
+ >>> t2 = transaction.TransactionManager()
+ >>> c2 = db.open(transaction_manager=t2)
+ >>> r2 = c2.root()
+
+ >>> from zope.component.persistentregistry import PersistentComponents
+
+ >>> _ = t1.begin()
+ >>> r1[1] = PersistentComponents('1')
+ >>> r1[1].registerHandler(handle1)
+ >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2)
+ >>> _ = r1[1].unregisterHandler(handle1)
+ >>> _ = r1[1].unregisterSubscriptionAdapter(handle1, provided=I2)
+ >>> t1.commit()
+ >>> _ = t1.begin()
+ >>> r1[1].registerHandler(handle1)
+ >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2)
+ >>> t1.commit()
+
+ >>> _ = t2.begin()
+ >>> len(list(r2[1].registeredHandlers()))
+ 1
+ >>> len(list(r2[1].registeredSubscriptionAdapters()))
+ 1
+ >>> t2.abort()
+
+ """
+
+
+
+class GlobalRegistry:
+ pass
+
+base = zope.component.globalregistry.GlobalAdapterRegistry(
+ GlobalRegistry, 'adapters')
+GlobalRegistry.adapters = base
+def clear_base():
+ base.__init__(GlobalRegistry, 'adapters')
+
+class IFoo(interface.Interface):
+ pass
+class Foo(persistent.Persistent):
+ interface.implements(IFoo)
+ name = ''
+ def __init__(self, name=''):
+ self.name = name
+
+ def __repr__(self):
+ return 'Foo(%r)' % self.name
+
+def test_deghostification_of_persistent_adapter_registries():
+ """
+
+We want to make sure that we see updates corrextly.
+
+ >>> len(base._v_subregistries)
+ 0
+
+ >>> import ZODB.tests.util
+ >>> db = ZODB.tests.util.DB()
+ >>> tm1 = transaction.TransactionManager()
+ >>> c1 = db.open(transaction_manager=tm1)
+ >>> r1 = zope.component.persistentregistry.PersistentAdapterRegistry(
+ ... (base,))
+ >>> r2 = zope.component.persistentregistry.PersistentAdapterRegistry((r1,))
+ >>> c1.root()[1] = r1
+ >>> c1.root()[2] = r2
+ >>> tm1.commit()
+ >>> r1._p_deactivate()
+
+ >>> len(base._v_subregistries)
+ 0
+
+ >>> tm2 = transaction.TransactionManager()
+ >>> c2 = db.open(transaction_manager=tm2)
+ >>> r1 = c2.root()[1]
+ >>> r2 = c2.root()[2]
+
+ >>> r1.lookup((), IFoo, '')
+
+ >>> base.register((), IFoo, '', Foo(''))
+ >>> r1.lookup((), IFoo, '')
+ Foo('')
+
+ >>> r2.lookup((), IFoo, '1')
+
+ >>> r1.register((), IFoo, '1', Foo('1'))
+
+ >>> r2.lookup((), IFoo, '1')
+ Foo('1')
+
+ >>> r1.lookup((), IFoo, '2')
+ >>> r2.lookup((), IFoo, '2')
+
+ >>> base.register((), IFoo, '2', Foo('2'))
+
+ >>> r1.lookup((), IFoo, '2')
+ Foo('2')
+
+ >>> r2.lookup((), IFoo, '2')
+ Foo('2')
+
+Cleanup:
+
+ >>> db.close()
+ >>> clear_base()
+
+ """
+
+
+def test_multi_handler_unregistration():
+ """
+ There was a bug where multiple handlers for the same required
+ specification would all be removed when one of them was
+ unregistered:
+
+ >>> class I(zope.interface.Interface):
+ ... pass
+ >>> def factory1(event):
+ ... print "| Factory 1 is here"
+ >>> def factory2(event):
+ ... print "| Factory 2 is here"
+ >>> class Event(object):
+ ... zope.interface.implements(I)
+ >>> from zope.interface.registry import Components
+ >>> registry = Components()
+ >>> registry.registerHandler(factory1, [I,])
+ >>> registry.registerHandler(factory2, [I,])
+ >>> registry.handle(Event())
+ | Factory 1 is here
+ | Factory 2 is here
+ >>> registry.unregisterHandler(factory1, [I,])
+ True
+ >>> registry.handle(Event())
+ | Factory 2 is here
+ """
+
+def test_next_utilities():
+ """
+ It is common for a utility to delegate its answer to a utility
+ providing the same interface in one of the component registry's
+ bases. Let's first create a global utility::
+
+ >>> import zope.interface
+ >>> class IMyUtility(zope.interface.Interface):
+ ... pass
+
+ >>> class MyUtility(ConformsToIComponentLookup):
+ ... zope.interface.implements(IMyUtility)
+ ... def __init__(self, id, sm):
+ ... self.id = id
+ ... self.sitemanager = sm
+ ... def __repr__(self):
+ ... return "%s('%s')" % (self.__class__.__name__, self.id)
+
+ >>> from zope.component import getGlobalSiteManager
+ >>> gsm = getGlobalSiteManager()
+
+ >>> gutil = MyUtility('global', gsm)
+ >>> gsm.registerUtility(gutil, IMyUtility, 'myutil')
+
+ Now, let's create two registries and set up the bases hierarchy::
+
+ >>> from zope.interface.registry import Components
+ >>> sm1 = Components('sm1', bases=(gsm, ))
+ >>> sm1_1 = Components('sm1_1', bases=(sm1, ))
+
+ Now we create two utilities and insert them in our folder hierarchy:
+
+ >>> util1 = MyUtility('one', sm1)
+ >>> sm1.registerUtility(util1, IMyUtility, 'myutil')
+ >>> IComponentLookup(util1) is sm1
+ True
+
+ >>> util1_1 = MyUtility('one-one', sm1_1)
+ >>> sm1_1.registerUtility(util1_1, IMyUtility, 'myutil')
+ >>> IComponentLookup(util1_1) is sm1_1
+ True
+
+ Now, if we ask `util1_1` for its next available utility we get the
+ ``one`` utility::
+
+ >>> from zope.component import getNextUtility
+ >>> getNextUtility(util1_1, IMyUtility, 'myutil')
+ MyUtility('one')
+
+ Next we ask `util1` for its next utility and we should get the global version:
+
+ >>> getNextUtility(util1, IMyUtility, 'myutil')
+ MyUtility('global')
+
+ However, if we ask the global utility for the next one, an error is raised
+
+ >>> getNextUtility(gutil, IMyUtility,
+ ... 'myutil') #doctest: +NORMALIZE_WHITESPACE
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError:
+ No more utilities for <InterfaceClass zope.component.tests.IMyUtility>,
+ 'myutil' have been found.
+
+ You can also use `queryNextUtility` and specify a default:
+
+ >>> from zope.component import queryNextUtility
+ >>> queryNextUtility(gutil, IMyUtility, 'myutil', 'default')
+ 'default'
+
+ Let's now ensure that the function also works with multiple registries. First
+ we create another base registry:
+
+ >>> myregistry = Components()
+
+ We now set up another utility into that registry:
+
+ >>> custom_util = MyUtility('my_custom_util', myregistry)
+ >>> myregistry.registerUtility(custom_util, IMyUtility, 'my_custom_util')
+
+ We add it as a base to the local site manager:
+
+ >>> sm1.__bases__ = (myregistry,) + sm1.__bases__
+
+ Both the ``myregistry`` and global utilities should be available:
+
+ >>> queryNextUtility(sm1, IMyUtility, 'my_custom_util')
+ MyUtility('my_custom_util')
+ >>> queryNextUtility(sm1, IMyUtility, 'myutil')
+ MyUtility('global')
+
+ Note, if the context cannot be converted to a site manager, the default is
+ retruned:
+
+ >>> queryNextUtility(object(), IMyUtility, 'myutil', 'default')
+ 'default'
+ """
+
+def dont_leak_utility_registrations_in__subscribers():
+ """
+
+ We've observed utilities getting left in _subscribers when they
+ get unregistered.
+
+ >>> import zope.interface.registry
+ >>> reg = zope.interface.registry.Components()
+ >>> class C:
+ ... def __init__(self, name):
+ ... self.name = name
+ ... def __repr__(self):
+ ... return "C(%s)" % self.name
+
+ >>> c1 = C(1)
+ >>> reg.registerUtility(c1, I1)
+ >>> reg.registerUtility(c1, I1)
+ >>> list(reg.getAllUtilitiesRegisteredFor(I1))
+ [C(1)]
+
+ >>> reg.unregisterUtility(provided=I1)
+ True
+ >>> list(reg.getAllUtilitiesRegisteredFor(I1))
+ []
+
+ >>> reg.registerUtility(c1, I1)
+ >>> reg.registerUtility(C(2), I1)
+
+ >>> list(reg.getAllUtilitiesRegisteredFor(I1))
+ [C(2)]
+
+ """
+
+def test_zcml_handler_site_manager():
+ """
+ The ZCML directives provided by zope.component use the ``getSiteManager``
+ method to get the registry where to register the components. This makes
+ possible to hook ``getSiteManager`` before loading a ZCML file:
+
+ >>> from zope.interface.registry import Components
+ >>> registry = Components()
+ >>> def dummy(context=None):
+ ... return registry
+ >>> from zope.component import getSiteManager
+ >>> ignore = getSiteManager.sethook(dummy)
+
+ >>> from zope.component.testfiles.components import comp, IApp
+ >>> from zope.component.zcml import handler
+ >>> handler('registerUtility', comp, IApp, u'')
+ >>> registry.getUtility(IApp) is comp
+ True
+ >>> ignore = getSiteManager.reset()
+
+ """
+
+class StandaloneTests(unittest.TestCase):
+ def testStandalone(self):
+ import subprocess
+ import sys
+ import os
+ import tempfile
+ import pickle
+
+ executable = os.path.abspath(sys.executable)
+ program = os.path.join(os.path.dirname(__file__), 'standalonetests.py')
+ process = subprocess.Popen([executable, program],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ stdin=subprocess.PIPE)
+ pickle.dump(sys.path, process.stdin)
+ process.stdin.close()
+
+ try:
+ process.wait()
+ except OSError, e:
+ if e.errno != 4: # MacIntel raises apparently unimportant EINTR?
+ raise # TODO verify sanity of a pass on EINTR :-/
+ lines = process.stdout.readlines()
+ process.stdout.close()
+ success = True
+ # Interpret the result: We scan the output from the end backwards
+ # until we find either a line that says 'OK' (which means the tests
+ # ran successfully) or a line that starts with quite a few dashes
+ # (which means we didn't find a line that says 'OK' within the summary
+ # of the test runner and the tests did not run successfully.)
+ for l in reversed(lines):
+ l = l.strip()
+ if not l:
+ continue
+ if l.startswith('-----'):
+ break
+ if l.endswith('OK'):
+ sucess = True
+ if not success:
+ self.fail(''.join(lines))
+
+class HookableTests(unittest.TestCase):
+
+ def test_ctor_no_func(self):
+ from zope.component.hookable import hookable
+ self.assertRaises(TypeError, hookable)
+
+ def test_ctor_simple(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ hooked = hookable(foo)
+ self.failUnless(hooked.original is foo)
+ self.failUnless(hooked.implementation is foo)
+
+ def test_ctor_extra_arg(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ self.assertRaises(TypeError, hookable, foo, foo)
+
+ def test_ctor_extra_arg(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ self.assertRaises(TypeError, hookable, foo, nonesuch=foo)
+
+ def test_sethook(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ def bar():
+ pass
+ hooked = hookable(foo)
+ hooked.sethook(bar)
+ self.failUnless(hooked.original is foo)
+ self.failUnless(hooked.implementation is bar)
+
+ def test_reset(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ def bar():
+ pass
+ hooked = hookable(foo)
+ hooked.sethook(bar)
+ hooked.reset()
+ self.failUnless(hooked.original is foo)
+ self.failUnless(hooked.implementation is foo)
+
+ def test_cant_assign_original(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ def bar():
+ pass
+ hooked = hookable(foo)
+ try:
+ hooked.original = bar
+ except TypeError:
+ pass
+ except AttributeError:
+ pass
+ else:
+ self.fail('Assigned original')
+
+ def test_cant_delete_original(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ hooked = hookable(foo)
+ try:
+ del hooked.original
+ except TypeError:
+ pass
+ except AttributeError:
+ pass
+ else:
+ self.fail('Deleted original')
+
+ def test_cant_assign_original(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ def bar():
+ pass
+ hooked = hookable(foo)
+ try:
+ hooked.implementation = bar
+ except TypeError:
+ pass
+ except AttributeError:
+ pass
+ else:
+ self.fail('Assigned implementation')
+
+ def test_readonly_original(self):
+ from zope.component.hookable import hookable
+ def foo():
+ pass
+ hooked = hookable(foo)
+ try:
+ del hooked.implementation
+ except TypeError:
+ pass
+ except AttributeError:
+ pass
+ else:
+ self.fail('Deleted implementation')
+
+class Ob3(object):
+ interface.implements(IC)
+
+template = """<configure
+ xmlns='http://namespaces.zope.org/zope'
+ i18n_domain='zope'>
+ %s
+ </configure>"""
+
+
+class ResourceViewTests(PlacelessSetup, unittest.TestCase):
+
+ def setUp(self):
+ super(ResourceViewTests, self).setUp()
+ XMLConfig('meta.zcml', zope.component)()
+ XMLConfig('meta.zcml', zope.security)()
+
+ def testView(self):
+ ob = Ob3()
+ request = Request(IV)
+ self.assertEqual(
+ zope.component.queryMultiAdapter((ob, request), name=u'test'), None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ ))
+
+ self.assertEqual(
+ zope.component.queryMultiAdapter((ob, request),
+ name=u'test').__class__,
+ V1)
+
+
+ def testMultiView(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.adapter.A3"
+ for="zope.component.testfiles.views.IC
+ zope.component.testfiles.adapter.I1
+ zope.component.testfiles.adapter.I2"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ ))
+
+
+ ob = Ob3()
+ a1 = A1()
+ a2 = A2()
+ request = Request(IV)
+ view = zope.component.queryMultiAdapter((ob, a1, a2, request),
+ name=u'test')
+ self.assertEqual(view.__class__, A3)
+ self.assertEqual(view.context, (ob, a1, a2, request))
+
+
+ def testMultiView_fails_w_multiple_factories(self):
+ self.assertRaises(
+ ConfigurationError,
+ xmlconfig,
+ StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.adapter.A3
+ zope.component.testfiles.adapter.A2"
+ for="zope.component.testfiles.views.IC
+ zope.component.testfiles.adapter.I1
+ zope.component.testfiles.adapter.I2"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ )
+ )
+
+ def testView_w_multiple_factories(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.adapter.A1
+ zope.component.testfiles.adapter.A2
+ zope.component.testfiles.adapter.A3
+ zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ ))
+
+ ob = Ob3()
+
+ # The view should be a V1 around an A3, around an A2, around
+ # an A1, anround ob:
+ view = zope.component.queryMultiAdapter((ob, Request(IV)), name=u'test')
+ self.assertEqual(view.__class__, V1)
+ a3 = view.context
+ self.assertEqual(a3.__class__, A3)
+ a2 = a3.context[0]
+ self.assertEqual(a2.__class__, A2)
+ a1 = a2.context[0]
+ self.assertEqual(a1.__class__, A1)
+ self.assertEqual(a1.context[0], ob)
+
+ def testView_fails_w_no_factories(self):
+ self.assertRaises(ConfigurationError,
+ xmlconfig,
+ StringIO(template %
+ '''
+ <view name="test"
+ factory=""
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ ),
+ )
+
+
+ def testViewThatProvidesAnInterface(self):
+ ob = Ob3()
+ self.assertEqual(
+ zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test'),
+ None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IR"
+ />
+ '''
+ ))
+
+ self.assertEqual(
+ zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test'),
+ None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IR"
+ provides="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test')
+ self.assertEqual(v.__class__, V1)
+
+
+ def testUnnamedViewThatProvidesAnInterface(self):
+ ob = Ob3()
+ self.assertEqual(
+ zope.component.queryMultiAdapter((ob, Request(IR)), IV), None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <view factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IR"
+ />
+ '''
+ ))
+
+ v = zope.component.queryMultiAdapter((ob, Request(IR)), IV)
+ self.assertEqual(v, None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <view factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IR"
+ provides="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.queryMultiAdapter((ob, Request(IR)), IV)
+ self.assertEqual(v.__class__, V1)
+
+ def testViewHavingARequiredClass(self):
+ xmlconfig(StringIO(template % (
+ '''
+ <view
+ for="zope.component.testfiles.components.Content"
+ type="zope.component.testfiles.views.IR"
+ factory="zope.component.testfiles.adapter.A1"
+ />
+ '''
+ )))
+
+ content = Content()
+ a1 = zope.component.getMultiAdapter((content, Request(IR)))
+ self.assert_(isinstance(a1, A1))
+
+ class MyContent:
+ interface.implements(IContent)
+
+ self.assertRaises(ComponentLookupError, zope.component.getMultiAdapter,
+ (MyContent(), Request(IR)))
+
+ def testInterfaceProtectedView(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.Public"
+ allowed_interface="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = ProxyFactory(zope.component.getMultiAdapter((Ob3(), Request(IV)),
+ name='test'))
+ self.assertEqual(v.index(), 'V1 here')
+ self.assertRaises(Exception, getattr, v, 'action')
+
+ def testAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.Public"
+ allowed_attributes="action"
+ />
+ '''
+ ))
+
+ v = ProxyFactory(zope.component.getMultiAdapter((Ob3(), Request(IV)),
+ name='test'))
+ self.assertEqual(v.action(), 'done')
+ self.assertRaises(Exception, getattr, v, 'index')
+
+ def testInterfaceAndAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.Public"
+ allowed_attributes="action"
+ allowed_interface="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.getMultiAdapter((Ob3(), Request(IV)), name='test')
+ self.assertEqual(v.index(), 'V1 here')
+ self.assertEqual(v.action(), 'done')
+
+ def testDuplicatedInterfaceAndAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.Public"
+ allowed_attributes="action index"
+ allowed_interface="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.getMultiAdapter((Ob3(), Request(IV)), name='test')
+ self.assertEqual(v.index(), 'V1 here')
+ self.assertEqual(v.action(), 'done')
+
+ def testIncompleteProtectedViewNoPermission(self):
+ self.assertRaises(
+ ConfigurationError,
+ xmlconfig,
+ StringIO(template %
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ allowed_attributes="action index"
+ />
+ '''
+ ))
+
+ def testViewUndefinedPermission(self):
+ config = StringIO(template % (
+ '''
+ <view name="test"
+ factory="zope.component.testfiles.views.V1"
+ for="zope.component.testfiles.views.IC"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.UndefinedPermission"
+ allowed_attributes="action index"
+ allowed_interface="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+ self.assertRaises(ValueError, xmlconfig, config, testing=1)
+
+ def testResource(self):
+ ob = Ob3()
+ self.assertEqual(
+ zope.component.queryAdapter(Request(IV), name=u'test'), None)
+ xmlconfig(StringIO(template % (
+ '''
+ <resource name="test"
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IV"/>
+ '''
+ )))
+
+ self.assertEqual(
+ zope.component.queryAdapter(Request(IV), name=u'test').__class__,
+ R1)
+
+ def testResourceThatProvidesAnInterface(self):
+ ob = Ob3()
+ self.assertEqual(zope.component.queryAdapter(Request(IR), IV, u'test'),
+ None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <resource
+ name="test"
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IR"
+ />
+ '''
+ ))
+
+ v = zope.component.queryAdapter(Request(IR), IV, name=u'test')
+ self.assertEqual(v, None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <resource
+ name="test"
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IR"
+ provides="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.queryAdapter(Request(IR), IV, name=u'test')
+ self.assertEqual(v.__class__, R1)
+
+ def testUnnamedResourceThatProvidesAnInterface(self):
+ ob = Ob3()
+ self.assertEqual(zope.component.queryAdapter(Request(IR), IV), None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <resource
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IR"
+ />
+ '''
+ ))
+
+ v = zope.component.queryAdapter(Request(IR), IV)
+ self.assertEqual(v, None)
+
+ xmlconfig(StringIO(template %
+ '''
+ <resource
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IR"
+ provides="zope.component.testfiles.views.IV"
+ />
+ '''
+ ))
+
+ v = zope.component.queryAdapter(Request(IR), IV)
+ self.assertEqual(v.__class__, R1)
+
+ def testResourceUndefinedPermission(self):
+
+ config = StringIO(template % (
+ '''
+ <resource name="test"
+ factory="zope.component.testfiles.views.R1"
+ type="zope.component.testfiles.views.IV"
+ permission="zope.UndefinedPermission"/>
+ '''
+ ))
+ self.assertRaises(ValueError, xmlconfig, config, testing=1)
+
+
+class ConditionalSecurityLayer(UnitTests):
+
+ __name__ = 'ConditionalSecurity'
+ __bases__ = ()
+
+ def setUp(self):
+ setUp()
+ self.modules = {}
+ for m in ('zope.security', 'zope.proxy'):
+ self.modules[m] = sys.modules[m]
+ sys.modules[m] = None
+ import zope.component.zcml
+ reload(zope.component.zcml)
+
+ def tearDown(self):
+ tearDown()
+ for m in ('zope.security', 'zope.proxy'):
+ sys.modules[m] = self.modules[m]
+ import zope.component.zcml
+ reload(zope.component.zcml)
+
+
+def setUpRegistryTests(tests):
+ setUp()
+
+def tearDownRegistryTests(tests):
+ tearDown()
+ import zope.event
+ zope.event.subscribers.pop()
+
+def clearZCML(test=None):
+ tearDown()
+ setUp()
+ XMLConfig('meta.zcml', component)()
+
+def test_suite():
+ checker = renormalizing.RENormalizing([
+ (re.compile('at 0x[0-9a-fA-F]+'), 'at <SOME ADDRESS>'),
+ (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
+ r'exceptions.\1Error:'),
+ ])
+
+ zcml_conditional = doctest.DocFileSuite('../zcml_conditional.txt',
+ checker=checker)
+ zcml_conditional.layer = ConditionalSecurityLayer()
+
+ with_globs = dict(with_statement=__future__.with_statement)
+ hooks_conditional = doctest.DocFileSuite(
+ '../hooks.txt', checker=checker, globs=with_globs)
+ hooks_conditional.layer = ConditionalSecurityLayer()
+
+ return unittest.TestSuite((
+ doctest.DocTestSuite(setUp=setUp, tearDown=tearDown),
+ unittest.makeSuite(HookableTests),
+ doctest.DocTestSuite('zope.component.interface',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocTestSuite('zope.component.nexttesting'),
+ doctest.DocFileSuite('../README.txt',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocFileSuite('../socketexample.txt',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocFileSuite('../factory.txt',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocFileSuite('../hooks.txt', checker=checker,
+ setUp=setUp, tearDown=tearDown,
+ globs=with_globs),
+ doctest.DocFileSuite('../event.txt',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocTestSuite('zope.component.security'),
+ doctest.DocFileSuite('../zcml.txt', checker=checker,
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocFileSuite('../configure.txt',
+ setUp=setUp, tearDown=tearDown),
+ doctest.DocFileSuite('../testlayer.txt',
+ optionflags=(doctest.ELLIPSIS +
+ doctest.NORMALIZE_WHITESPACE +
+ doctest.REPORT_NDIFF)),
+ zcml_conditional,
+ hooks_conditional,
+ unittest.makeSuite(StandaloneTests),
+ unittest.makeSuite(ResourceViewTests),
+ ))
+
+if __name__ == "__main__":
+ unittest.main(defaultTest='test_suite')
Deleted: zope.component/tseaver-test_cleanup/src/zope/component/tests.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests.py 2012-05-11 01:58:56 UTC (rev 125842)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests.py 2012-05-11 01:59:01 UTC (rev 125843)
@@ -1,1748 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002, 2009 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (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.
-#
-##############################################################################
-"""Component Architecture Tests
-"""
-
-import __future__
-
-import doctest
-import persistent
-import re
-import sys
-import unittest
-import transaction
-from cStringIO import StringIO
-
-from zope import interface, component
-from zope.interface.verify import verifyObject
-from zope.interface.interfaces import IInterface
-from zope.testing import renormalizing
-from zope.testrunner.layer import UnitTests
-
-from zope.component.interfaces import ComponentLookupError
-from zope.component.interfaces import IComponentArchitecture
-from zope.component.interfaces import IComponentLookup
-from zope.component.testing import setUp, tearDown, PlacelessSetup
-import zope.component.persistentregistry
-import zope.component.globalregistry
-
-from zope.configuration.xmlconfig import XMLConfig, xmlconfig
-from zope.configuration.exceptions import ConfigurationError
-from zope.security.checker import ProxyFactory
-
-from zope.component.testfiles.adapter import A1, A2, A3
-from zope.component.testfiles.components import IContent, Content
-from zope.component.testfiles.components import IApp
-from zope.component.testfiles.views import Request, IC, IV, V1, R1, IR
-
-# side effect gets component-based event dispatcher installed.
-# we should obviously make this more explicit
-import zope.component.event
-
-class I1(interface.Interface):
- pass
-class I2(interface.Interface):
- pass
-class I2e(I2):
- pass
-class I3(interface.Interface):
- pass
-
-class ITestType(IInterface):
- pass
-
-class U:
-
- def __init__(self, name):
- self.__name__ = name
-
- def __repr__(self):
- return "%s(%s)" % (self.__class__.__name__, self.__name__)
-
-class U1(U):
- interface.implements(I1)
-
-class U12(U):
- interface.implements(I1, I2)
-
-class IA1(interface.Interface):
- pass
-
-class IA2(interface.Interface):
- pass
-
-class IA3(interface.Interface):
- pass
-
-class A:
-
- def __init__(self, *context):
- self.context = context
-
- def __repr__(self):
- return "%s%r" % (self.__class__.__name__, self.context)
-
-class A12_1(A):
- component.adapts(I1, I2)
- interface.implements(IA1)
-
-class A12_(A):
- component.adapts(I1, I2)
-
-class A_2(A):
- interface.implements(IA2)
-
-class A_3(A):
- interface.implements(IA3)
-
-class A1_12(U):
- component.adapts(I1)
- interface.implements(IA1, IA2)
-
-class A1_2(U):
- component.adapts(I1)
- interface.implements(IA2)
-
-class A1_23(U):
- component.adapts(I1)
- interface.implements(IA1, IA3)
-
-def noop(*args):
- pass
-
- at component.adapter(I1)
-def handle1(x):
- print 'handle1', x
-
-def handle(*objects):
- print 'handle', objects
-
- at component.adapter(I1)
-def handle3(x):
- print 'handle3', x
-
- at component.adapter(I1)
-def handle4(x):
- print 'handle4', x
-
-class Ob(object):
- interface.implements(I1)
- def __repr__(self):
- return '<instance Ob>'
-
-
-ob = Ob()
-
-class Ob2(object):
- interface.implements(I2)
- def __repr__(self):
- return '<instance Ob2>'
-
-class Comp(object):
- interface.implements(I2)
- def __init__(self, context):
- self.context = context
-
-comp = Comp(1)
-
-class Comp2(object):
- interface.implements(I3)
- def __init__(self, context):
- self.context = context
-
-
-class ConformsToIComponentLookup(object):
- """This object allows the sitemanager to conform/adapt to
- `IComponentLookup` and thus to itself."""
-
- def __init__(self, sitemanager):
- self.sitemanager = sitemanager
-
- def __conform__(self, interface):
- """This method is specified by the adapter PEP to do the adaptation."""
- if interface is IComponentLookup:
- return self.sitemanager
-
-
-def testInterfaces():
- """Ensure that the component architecture API is provided by
- `zope.component`.
-
- >>> verifyObject(IComponentArchitecture, component)
- True
- """
-
-def test_getGlobalSiteManager():
- """One of the most important functions is to get the global site manager.
-
- >>> from zope.component.interfaces import IComponentLookup
- >>> from zope.component.globalregistry import base
-
- Get the global site manager via the CA API function:
-
- >>> gsm = component.getGlobalSiteManager()
-
- Make sure that the global site manager implements the correct interface
- and is the global site manager instance we expect to get.
-
- >>> IComponentLookup.providedBy(gsm)
- True
- >>> base is gsm
- True
-
- Finally, ensure that we always get the same global site manager, otherwise
- our component registry will always be reset.
-
- >>> component.getGlobalSiteManager() is gsm
- True
- """
-
-def test_getSiteManager():
- """Make sure that `getSiteManager()` always returns the correct site
- manager instance.
-
- We don't know anything about the default service manager, except that it
- is an `IComponentLookup`.
-
- >>> from zope.component.interfaces import IComponentLookup
- >>> IComponentLookup.providedBy(component.getSiteManager())
- True
-
- Calling `getSiteManager()` with no args is equivalent to calling it with a
- context of `None`.
-
- >>> component.getSiteManager() is component.getSiteManager(None)
- True
-
- If the context passed to `getSiteManager()` is not `None`, it is
- adapted to `IComponentLookup` and this adapter returned. So, we
- create a context that can be adapted to `IComponentLookup` using
- the `__conform__` API.
-
- Let's create the simplest stub-implementation of a site manager possible:
-
- >>> sitemanager = object()
-
- Now create a context that knows how to adapt to our newly created site
- manager.
-
- >>> context = ConformsToIComponentLookup(sitemanager)
-
- Now make sure that the `getSiteManager()` API call returns the correct
- site manager.
-
- >>> component.getSiteManager(context) is sitemanager
- True
-
- Using a context that is not adaptable to `IComponentLookup` should fail.
-
- >>> component.getSiteManager(ob) #doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
- Traceback (most recent call last):
- ...
- ComponentLookupError: ('Could not adapt', <instance Ob>,
- <InterfaceClass zope...interfaces.IComponentLookup>)
- """
-
-def testAdapterInContext(self):
- """The `getAdapterInContext()` and `queryAdapterInContext()` API functions
- do not only use the site manager to look up the adapter, but first tries
- to use the `__conform__()` method of the object to find an adapter as
- specified by PEP 246.
-
- Let's start by creating a component that support's the PEP 246's
- `__conform__()` method:
-
- >>> class Component(object):
- ... interface.implements(I1)
- ... def __conform__(self, iface, default=None):
- ... if iface == I2:
- ... return 42
- ... def __repr__(self):
- ... return '''<Component implementing 'I1'>'''
-
- >>> ob = Component()
-
- We also gave the component a custom representation, so it will be easier
- to use in these tests.
-
- We now have to create a site manager (other than the default global one)
- with which we can register adapters for `I1`.
-
- >>> from zope.component.globalregistry import BaseGlobalComponents
- >>> sitemanager = BaseGlobalComponents()
-
- Now we create a new `context` that knows how to get to our custom site
- manager.
-
- >>> context = ConformsToIComponentLookup(sitemanager)
-
- We now register an adapter from `I1` to `I3`:
-
- >>> sitemanager.registerAdapter(lambda x: 43, (I1,), I3, '')
-
- If an object implements the interface you want to adapt to,
- `getAdapterInContext()` should simply return the object.
-
- >>> component.getAdapterInContext(ob, I1, context)
- <Component implementing 'I1'>
- >>> component.queryAdapterInContext(ob, I1, context)
- <Component implementing 'I1'>
-
- If an object conforms to the interface you want to adapt to,
- `getAdapterInContext()` should simply return the conformed object.
-
- >>> component.getAdapterInContext(ob, I2, context)
- 42
- >>> component.queryAdapterInContext(ob, I2, context)
- 42
-
- If an adapter isn't registered for the given object and interface, and you
- provide no default, raise ComponentLookupError...
-
- >>> class I4(interface.Interface):
- ... pass
-
- >>> component.getAdapterInContext(ob, I4, context) \\
- ... #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError: (<Component implementing 'I1'>,
- <InterfaceClass zope.component.tests.I4>)
-
- ...otherwise, you get the default:
-
- >>> component.queryAdapterInContext(ob, I4, context, 44)
- 44
-
- If you ask for an adapter for which something's registered you get the
- registered adapter
-
- >>> component.getAdapterInContext(ob, I3, context)
- 43
- >>> component.queryAdapterInContext(ob, I3, context)
- 43
- """
-
-def testAdapter():
- """The `getAdapter()` and `queryAdapter()` API functions are similar to
- `{get|query}AdapterInContext()` functions, except that they do not care
- about the `__conform__()` but also handle named adapters. (Actually, the
- name is a required argument.)
-
- If an adapter isn't registered for the given object and interface, and you
- provide no default, raise `ComponentLookupError`...
-
- >>> component.getAdapter(ob, I2, '') #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError: (<instance Ob>,
- <InterfaceClass zope.component.tests.I2>,
- '')
-
- ...otherwise, you get the default
-
- >>> component.queryAdapter(ob, I2, '', '<default>')
- '<default>'
-
- Now get the global site manager and register an adapter from `I1` to `I2`
- without a name:
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, (I1,), I2, '')
-
- You should get a sensible error message if you forget that the 'requires'
- argument is supposed to be a sequence
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, I1, I2, '')
- Traceback (most recent call last):
- ...
- TypeError: the required argument should be a list of interfaces, not a single interface
-
- You can now simply access the adapter using the `getAdapter()` API
- function:
-
- >>> adapter = component.getAdapter(ob, I2, '')
- >>> adapter.__class__ is Comp
- True
- >>> adapter.context is ob
- True
- """
-
-def testInterfaceCall():
- """Here we test the `adapter_hook()` function that we registered with the
- `zope.interface` adapter hook registry, so that we can call interfaces to
- do adaptation.
-
- First, we need to register an adapter:
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, [I1], I2, '')
-
- Then we try to adapt `ob` to provide an `I2` interface by calling the `I2`
- interface with the obejct as first argument:
-
- >>> adapter = I2(ob)
- >>> adapter.__class__ is Comp
- True
- >>> adapter.context is ob
- True
-
- If no adapter is found, a `TypeError is raised...
-
- >>> I1(Ob2()) #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- TypeError: ('Could not adapt', <instance Ob2>,
- <InterfaceClass zope.component.tests.I1>)
-
- ...unless we specify an alternative adapter:
-
- >>> marker = object()
- >>> I2(object(), marker) is marker
- True
- """
-
-def testNamedAdapter():
- """Make sure that adapters with names are correctly selected from the
- registry.
-
- First we register some named adapter:
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... lambda x: 0, [I1], I2, 'foo')
-
- If an adapter isn't registered for the given object and interface,
- and you provide no default, raise `ComponentLookupError`...
-
- >>> component.getAdapter(ob, I2, 'bar') \\
- ... #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError:
- (<instance Ob>, <InterfaceClass zope.component.tests.I2>, 'bar')
-
- ...otherwise, you get the default
-
- >>> component.queryAdapter(ob, I2, 'bar', '<default>')
- '<default>'
-
- But now we register an adapter for the object having the correct name
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, [I1], I2, 'bar')
-
- so that the lookup succeeds:
-
- >>> adapter = component.getAdapter(ob, I2, 'bar')
- >>> adapter.__class__ is Comp
- True
- >>> adapter.context is ob
- True
- """
-
-def testMultiAdapter():
- """Adapting a combination of 2 objects to an interface
-
- Multi-adapters adapt one or more objects to another interface. To make
- this demonstration non-trivial, we need to create a second object to be
- adapted:
-
- >>> ob2 = Ob2()
-
- Like for regular adapters, if an adapter isn't registered for the given
- objects and interface, and you provide no default, raise
- `ComponentLookupError`...
-
- >>> component.getMultiAdapter((ob, ob2), I3) \\
- ... #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError:
- ((<instance Ob>, <instance Ob2>),
- <InterfaceClass zope.component.tests.I3>,
- u'')
-
- ...otherwise, you get the default
-
- >>> component.queryMultiAdapter((ob, ob2), I3, default='<default>')
- '<default>'
-
- Note that the name is not a required attribute here.
-
- To test multi-adapters, we also have to create an adapter class that
- handles to context objects:
-
- >>> class DoubleAdapter(object):
- ... interface.implements(I3)
- ... def __init__(self, first, second):
- ... self.first = first
- ... self.second = second
-
- Now we can register the multi-adapter using
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... DoubleAdapter, (I1, I2), I3, '')
-
- Notice how the required interfaces are simply provided by a tuple. Now we
- can get the adapter:
-
- >>> adapter = component.getMultiAdapter((ob, ob2), I3)
- >>> adapter.__class__ is DoubleAdapter
- True
- >>> adapter.first is ob
- True
- >>> adapter.second is ob2
- True
- """
-
-def testAdapterForInterfaceNone():
- """Providing an adapter for None says that your adapter can adapt anything
- to `I2`.
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, (None,), I2, '')
-
- >>> adapter = I2(ob)
- >>> adapter.__class__ is Comp
- True
- >>> adapter.context is ob
- True
-
- It can really adapt any arbitrary object:
-
- >>> something = object()
- >>> adapter = I2(something)
- >>> adapter.__class__ is Comp
- True
- >>> adapter.context is something
- True
- """
-
-def testGetAdapters():
- """It is sometimes desireable to get a list of all adapters that are
- registered for a particular output interface, given a set of
- objects.
-
- Let's register some adapters first:
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, [I1], I2, '')
- >>> component.getGlobalSiteManager().registerAdapter(
- ... Comp, [None], I2, 'foo')
-
- Now we get all the adapters that are registered for `ob` that provide
- `I2`:
-
- >>> adapters = sorted(component.getAdapters((ob,), I2))
- >>> [(name, adapter.__class__.__name__) for name, adapter in adapters]
- [(u'', 'Comp'), (u'foo', 'Comp')]
-
- Note that the output doesn't include None values. If an adapter
- factory returns None, it is as if it wasn't present.
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... lambda context: None, [I1], I2, 'nah')
- >>> adapters = sorted(component.getAdapters((ob,), I2))
- >>> [(name, adapter.__class__.__name__) for name, adapter in adapters]
- [(u'', 'Comp'), (u'foo', 'Comp')]
-
- """
-
-def testUtility():
- """Utilities are components that simply provide an interface. They are
- instantiated at the time or before they are registered. Here we test the
- simple query interface.
-
- Before we register any utility, there is no utility available, of
- course. The pure instatiation of an object does not make it a utility. If
- you do not specify a default, you get a `ComponentLookupError`...
-
- >>> component.getUtility(I1) #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError: \
- (<InterfaceClass zope.component.tests.I1>, '')
-
- ...otherwise, you get the default
-
- >>> component.queryUtility(I1, default='<default>')
- '<default>'
- >>> component.queryUtility(I2, default='<default>')
- '<default>'
-
- Now we declare `ob` to be the utility providing `I1`
-
- >>> component.getGlobalSiteManager().registerUtility(ob, I1)
-
- so that the component is now available:
-
- >>> component.getUtility(I1) is ob
- True
- """
-
-def testNamedUtility():
- """Like adapters, utilities can be named.
-
- Just because you register an utility having no name
-
- >>> component.getGlobalSiteManager().registerUtility(ob, I1)
-
- does not mean that they are available when you specify a name:
-
- >>> component.getUtility(I1, name='foo') \\
- ... #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError:
- (<InterfaceClass zope.component.tests.I1>, 'foo')
-
-
- ...otherwise, you get the default
-
- >>> component.queryUtility(I1, name='foo', default='<default>')
- '<default>'
-
- Registering the utility under the correct name
-
- >>> component.getGlobalSiteManager().registerUtility(
- ... ob, I1, name='foo')
-
- really helps:
-
- >>> component.getUtility(I1, 'foo') is ob
- True
- """
-
-def test_getAllUtilitiesRegisteredFor():
- """Again, like for adapters, it is often useful to get a list of all
- utilities that have been registered for a particular interface. Utilities
- providing a derived interface are also listed.
-
- Thus, let's create a derivative interface of `I1`:
-
- >>> class I11(I1):
- ... pass
-
- >>> class Ob11(Ob):
- ... interface.implements(I11)
-
- >>> ob11 = Ob11()
- >>> ob_bob = Ob()
-
- Now we register the new utilities:
-
- >>> gsm = component.getGlobalSiteManager()
- >>> gsm.registerUtility(ob, I1)
- >>> gsm.registerUtility(ob11, I11)
- >>> gsm.registerUtility(ob_bob, I1, name='bob')
- >>> gsm.registerUtility(Comp(2), I2)
-
- We can now get all the utilities that provide interface `I1`:
-
- >>> uts = list(component.getAllUtilitiesRegisteredFor(I1))
- >>> uts = sorted([util.__class__.__name__ for util in uts])
- >>> uts
- ['Ob', 'Ob', 'Ob11']
-
- Note that `getAllUtilitiesRegisteredFor()` does not return the names of
- the utilities.
- """
-
-def testNotBrokenWhenNoSiteManager():
- """Make sure that the adapter lookup is not broken, when no site manager
- is available.
-
- Both of those things emit `DeprecationWarnings`.
-
- >>> I2(ob) #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- TypeError: ('Could not adapt',
- <instance Ob>,
- <InterfaceClass zope.component.tests.I2>)
-
-
- >>> I2(ob, 42)
- 42
- """
-
-
-def testNo__component_adapts__leakage():
- """
- We want to make sure that an `adapts()` call in a class definition
- doesn't affect instances.
-
- >>> class C:
- ... component.adapts()
-
- >>> C.__component_adapts__
- ()
- >>> C().__component_adapts__
- Traceback (most recent call last):
- ...
- AttributeError: __component_adapts__
- """
-
-def test_ability_to_pickle_globalsitemanager():
- """
- We need to make sure that it is possible to pickle the global site manager
- and its two global adapter registries.
-
- >>> from zope.component import globalSiteManager
- >>> import cPickle
- >>> pickle = cPickle.dumps(globalSiteManager)
- >>> sm = cPickle.loads(pickle)
- >>> sm is globalSiteManager
- True
-
- Now let's ensure that the registries themselves can be pickled as well:
-
- >>> pickle = cPickle.dumps(globalSiteManager.adapters)
- >>> adapters = cPickle.loads(pickle)
- >>> adapters is globalSiteManager.adapters
- True
- """
-
-def test_persistent_component_managers():
- """
-Here, we'll demonstrate that changes work even when data are stored in
-a database and when accessed from multiple connections.
-
-Start by setting up a database and creating two transaction
-managers and database connections to work with.
-
- >>> import ZODB.tests.util
- >>> db = ZODB.tests.util.DB()
- >>> import transaction
- >>> t1 = transaction.TransactionManager()
- >>> c1 = db.open(transaction_manager=t1)
- >>> r1 = c1.root()
- >>> t2 = transaction.TransactionManager()
- >>> c2 = db.open(transaction_manager=t2)
- >>> r2 = c2.root()
-
-Create a set of components registries in the database, alternating
-connections.
-
- >>> from zope.component.persistentregistry import PersistentComponents
-
- >>> _ = t1.begin()
- >>> r1[1] = PersistentComponents('1')
- >>> t1.commit()
-
- >>> _ = t2.begin()
- >>> r2[2] = PersistentComponents('2', (r2[1], ))
- >>> t2.commit()
-
- >>> _ = t1.begin()
- >>> r1[3] = PersistentComponents('3', (r1[1], ))
- >>> t1.commit()
-
- >>> _ = t2.begin()
- >>> r2[4] = PersistentComponents('4', (r2[2], r2[3]))
- >>> t2.commit()
-
- >>> _ = t1.begin()
- >>> r1[1].__bases__
- ()
- >>> r1[2].__bases__ == (r1[1], )
- True
-
- >>> r1[1].registerUtility(U1(1))
- >>> r1[1].queryUtility(I1)
- U1(1)
- >>> r1[2].queryUtility(I1)
- U1(1)
- >>> t1.commit()
-
- >>> _ = t2.begin()
- >>> r2[1].registerUtility(U1(2))
- >>> r2[2].queryUtility(I1)
- U1(2)
-
- >>> r2[4].queryUtility(I1)
- U1(2)
- >>> t2.commit()
-
-
- >>> _ = t1.begin()
- >>> r1[1].registerUtility(U12(1), I2)
- >>> r1[4].queryUtility(I2)
- U12(1)
- >>> t1.commit()
-
-
- >>> _ = t2.begin()
- >>> r2[3].registerUtility(U12(3), I2)
- >>> r2[4].queryUtility(I2)
- U12(3)
- >>> t2.commit()
-
- >>> _ = t1.begin()
-
- >>> r1[1].registerHandler(handle1, info="First handler")
- >>> r1[2].registerHandler(handle, required=[U])
-
- >>> r1[3].registerHandler(handle3)
-
- >>> r1[4].registerHandler(handle4)
-
- >>> r1[4].handle(U1(1))
- handle1 U1(1)
- handle3 U1(1)
- handle (U1(1),)
- handle4 U1(1)
-
- >>> t1.commit()
-
- >>> _ = t2.begin()
- >>> r2[4].handle(U1(1))
- handle1 U1(1)
- handle3 U1(1)
- handle (U1(1),)
- handle4 U1(1)
- >>> t2.abort()
-
- >>> db.close()
- """
-
-def persistent_registry_doesnt_scew_up_subsribers():
- """
- >>> import ZODB.tests.util
- >>> db = ZODB.tests.util.DB()
- >>> import transaction
- >>> t1 = transaction.TransactionManager()
- >>> c1 = db.open(transaction_manager=t1)
- >>> r1 = c1.root()
- >>> t2 = transaction.TransactionManager()
- >>> c2 = db.open(transaction_manager=t2)
- >>> r2 = c2.root()
-
- >>> from zope.component.persistentregistry import PersistentComponents
-
- >>> _ = t1.begin()
- >>> r1[1] = PersistentComponents('1')
- >>> r1[1].registerHandler(handle1)
- >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2)
- >>> _ = r1[1].unregisterHandler(handle1)
- >>> _ = r1[1].unregisterSubscriptionAdapter(handle1, provided=I2)
- >>> t1.commit()
- >>> _ = t1.begin()
- >>> r1[1].registerHandler(handle1)
- >>> r1[1].registerSubscriptionAdapter(handle1, provided=I2)
- >>> t1.commit()
-
- >>> _ = t2.begin()
- >>> len(list(r2[1].registeredHandlers()))
- 1
- >>> len(list(r2[1].registeredSubscriptionAdapters()))
- 1
- >>> t2.abort()
-
- """
-
-
-
-class GlobalRegistry:
- pass
-
-base = zope.component.globalregistry.GlobalAdapterRegistry(
- GlobalRegistry, 'adapters')
-GlobalRegistry.adapters = base
-def clear_base():
- base.__init__(GlobalRegistry, 'adapters')
-
-class IFoo(interface.Interface):
- pass
-class Foo(persistent.Persistent):
- interface.implements(IFoo)
- name = ''
- def __init__(self, name=''):
- self.name = name
-
- def __repr__(self):
- return 'Foo(%r)' % self.name
-
-def test_deghostification_of_persistent_adapter_registries():
- """
-
-We want to make sure that we see updates corrextly.
-
- >>> len(base._v_subregistries)
- 0
-
- >>> import ZODB.tests.util
- >>> db = ZODB.tests.util.DB()
- >>> tm1 = transaction.TransactionManager()
- >>> c1 = db.open(transaction_manager=tm1)
- >>> r1 = zope.component.persistentregistry.PersistentAdapterRegistry(
- ... (base,))
- >>> r2 = zope.component.persistentregistry.PersistentAdapterRegistry((r1,))
- >>> c1.root()[1] = r1
- >>> c1.root()[2] = r2
- >>> tm1.commit()
- >>> r1._p_deactivate()
-
- >>> len(base._v_subregistries)
- 0
-
- >>> tm2 = transaction.TransactionManager()
- >>> c2 = db.open(transaction_manager=tm2)
- >>> r1 = c2.root()[1]
- >>> r2 = c2.root()[2]
-
- >>> r1.lookup((), IFoo, '')
-
- >>> base.register((), IFoo, '', Foo(''))
- >>> r1.lookup((), IFoo, '')
- Foo('')
-
- >>> r2.lookup((), IFoo, '1')
-
- >>> r1.register((), IFoo, '1', Foo('1'))
-
- >>> r2.lookup((), IFoo, '1')
- Foo('1')
-
- >>> r1.lookup((), IFoo, '2')
- >>> r2.lookup((), IFoo, '2')
-
- >>> base.register((), IFoo, '2', Foo('2'))
-
- >>> r1.lookup((), IFoo, '2')
- Foo('2')
-
- >>> r2.lookup((), IFoo, '2')
- Foo('2')
-
-Cleanup:
-
- >>> db.close()
- >>> clear_base()
-
- """
-
-
-def test_multi_handler_unregistration():
- """
- There was a bug where multiple handlers for the same required
- specification would all be removed when one of them was
- unregistered:
-
- >>> class I(zope.interface.Interface):
- ... pass
- >>> def factory1(event):
- ... print "| Factory 1 is here"
- >>> def factory2(event):
- ... print "| Factory 2 is here"
- >>> class Event(object):
- ... zope.interface.implements(I)
- >>> from zope.interface.registry import Components
- >>> registry = Components()
- >>> registry.registerHandler(factory1, [I,])
- >>> registry.registerHandler(factory2, [I,])
- >>> registry.handle(Event())
- | Factory 1 is here
- | Factory 2 is here
- >>> registry.unregisterHandler(factory1, [I,])
- True
- >>> registry.handle(Event())
- | Factory 2 is here
- """
-
-def test_next_utilities():
- """
- It is common for a utility to delegate its answer to a utility
- providing the same interface in one of the component registry's
- bases. Let's first create a global utility::
-
- >>> import zope.interface
- >>> class IMyUtility(zope.interface.Interface):
- ... pass
-
- >>> class MyUtility(ConformsToIComponentLookup):
- ... zope.interface.implements(IMyUtility)
- ... def __init__(self, id, sm):
- ... self.id = id
- ... self.sitemanager = sm
- ... def __repr__(self):
- ... return "%s('%s')" % (self.__class__.__name__, self.id)
-
- >>> from zope.component import getGlobalSiteManager
- >>> gsm = getGlobalSiteManager()
-
- >>> gutil = MyUtility('global', gsm)
- >>> gsm.registerUtility(gutil, IMyUtility, 'myutil')
-
- Now, let's create two registries and set up the bases hierarchy::
-
- >>> from zope.interface.registry import Components
- >>> sm1 = Components('sm1', bases=(gsm, ))
- >>> sm1_1 = Components('sm1_1', bases=(sm1, ))
-
- Now we create two utilities and insert them in our folder hierarchy:
-
- >>> util1 = MyUtility('one', sm1)
- >>> sm1.registerUtility(util1, IMyUtility, 'myutil')
- >>> IComponentLookup(util1) is sm1
- True
-
- >>> util1_1 = MyUtility('one-one', sm1_1)
- >>> sm1_1.registerUtility(util1_1, IMyUtility, 'myutil')
- >>> IComponentLookup(util1_1) is sm1_1
- True
-
- Now, if we ask `util1_1` for its next available utility we get the
- ``one`` utility::
-
- >>> from zope.component import getNextUtility
- >>> getNextUtility(util1_1, IMyUtility, 'myutil')
- MyUtility('one')
-
- Next we ask `util1` for its next utility and we should get the global version:
-
- >>> getNextUtility(util1, IMyUtility, 'myutil')
- MyUtility('global')
-
- However, if we ask the global utility for the next one, an error is raised
-
- >>> getNextUtility(gutil, IMyUtility,
- ... 'myutil') #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError:
- No more utilities for <InterfaceClass zope.component.tests.IMyUtility>,
- 'myutil' have been found.
-
- You can also use `queryNextUtility` and specify a default:
-
- >>> from zope.component import queryNextUtility
- >>> queryNextUtility(gutil, IMyUtility, 'myutil', 'default')
- 'default'
-
- Let's now ensure that the function also works with multiple registries. First
- we create another base registry:
-
- >>> myregistry = Components()
-
- We now set up another utility into that registry:
-
- >>> custom_util = MyUtility('my_custom_util', myregistry)
- >>> myregistry.registerUtility(custom_util, IMyUtility, 'my_custom_util')
-
- We add it as a base to the local site manager:
-
- >>> sm1.__bases__ = (myregistry,) + sm1.__bases__
-
- Both the ``myregistry`` and global utilities should be available:
-
- >>> queryNextUtility(sm1, IMyUtility, 'my_custom_util')
- MyUtility('my_custom_util')
- >>> queryNextUtility(sm1, IMyUtility, 'myutil')
- MyUtility('global')
-
- Note, if the context cannot be converted to a site manager, the default is
- retruned:
-
- >>> queryNextUtility(object(), IMyUtility, 'myutil', 'default')
- 'default'
- """
-
-def dont_leak_utility_registrations_in__subscribers():
- """
-
- We've observed utilities getting left in _subscribers when they
- get unregistered.
-
- >>> import zope.interface.registry
- >>> reg = zope.interface.registry.Components()
- >>> class C:
- ... def __init__(self, name):
- ... self.name = name
- ... def __repr__(self):
- ... return "C(%s)" % self.name
-
- >>> c1 = C(1)
- >>> reg.registerUtility(c1, I1)
- >>> reg.registerUtility(c1, I1)
- >>> list(reg.getAllUtilitiesRegisteredFor(I1))
- [C(1)]
-
- >>> reg.unregisterUtility(provided=I1)
- True
- >>> list(reg.getAllUtilitiesRegisteredFor(I1))
- []
-
- >>> reg.registerUtility(c1, I1)
- >>> reg.registerUtility(C(2), I1)
-
- >>> list(reg.getAllUtilitiesRegisteredFor(I1))
- [C(2)]
-
- """
-
-def test_zcml_handler_site_manager():
- """
- The ZCML directives provided by zope.component use the ``getSiteManager``
- method to get the registry where to register the components. This makes
- possible to hook ``getSiteManager`` before loading a ZCML file:
-
- >>> from zope.interface.registry import Components
- >>> registry = Components()
- >>> def dummy(context=None):
- ... return registry
- >>> from zope.component import getSiteManager
- >>> ignore = getSiteManager.sethook(dummy)
-
- >>> from zope.component.testfiles.components import comp, IApp
- >>> from zope.component.zcml import handler
- >>> handler('registerUtility', comp, IApp, u'')
- >>> registry.getUtility(IApp) is comp
- True
- >>> ignore = getSiteManager.reset()
-
- """
-
-class StandaloneTests(unittest.TestCase):
- def testStandalone(self):
- import subprocess
- import sys
- import os
- import tempfile
- import pickle
-
- executable = os.path.abspath(sys.executable)
- program = os.path.join(os.path.dirname(__file__), 'standalonetests.py')
- process = subprocess.Popen([executable, program],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- stdin=subprocess.PIPE)
- pickle.dump(sys.path, process.stdin)
- process.stdin.close()
-
- try:
- process.wait()
- except OSError, e:
- if e.errno != 4: # MacIntel raises apparently unimportant EINTR?
- raise # TODO verify sanity of a pass on EINTR :-/
- lines = process.stdout.readlines()
- process.stdout.close()
- success = True
- # Interpret the result: We scan the output from the end backwards
- # until we find either a line that says 'OK' (which means the tests
- # ran successfully) or a line that starts with quite a few dashes
- # (which means we didn't find a line that says 'OK' within the summary
- # of the test runner and the tests did not run successfully.)
- for l in reversed(lines):
- l = l.strip()
- if not l:
- continue
- if l.startswith('-----'):
- break
- if l.endswith('OK'):
- sucess = True
- if not success:
- self.fail(''.join(lines))
-
-class HookableTests(unittest.TestCase):
-
- def test_ctor_no_func(self):
- from zope.component.hookable import hookable
- self.assertRaises(TypeError, hookable)
-
- def test_ctor_simple(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- hooked = hookable(foo)
- self.failUnless(hooked.original is foo)
- self.failUnless(hooked.implementation is foo)
-
- def test_ctor_extra_arg(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- self.assertRaises(TypeError, hookable, foo, foo)
-
- def test_ctor_extra_arg(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- self.assertRaises(TypeError, hookable, foo, nonesuch=foo)
-
- def test_sethook(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- def bar():
- pass
- hooked = hookable(foo)
- hooked.sethook(bar)
- self.failUnless(hooked.original is foo)
- self.failUnless(hooked.implementation is bar)
-
- def test_reset(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- def bar():
- pass
- hooked = hookable(foo)
- hooked.sethook(bar)
- hooked.reset()
- self.failUnless(hooked.original is foo)
- self.failUnless(hooked.implementation is foo)
-
- def test_cant_assign_original(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- def bar():
- pass
- hooked = hookable(foo)
- try:
- hooked.original = bar
- except TypeError:
- pass
- except AttributeError:
- pass
- else:
- self.fail('Assigned original')
-
- def test_cant_delete_original(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- hooked = hookable(foo)
- try:
- del hooked.original
- except TypeError:
- pass
- except AttributeError:
- pass
- else:
- self.fail('Deleted original')
-
- def test_cant_assign_original(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- def bar():
- pass
- hooked = hookable(foo)
- try:
- hooked.implementation = bar
- except TypeError:
- pass
- except AttributeError:
- pass
- else:
- self.fail('Assigned implementation')
-
- def test_readonly_original(self):
- from zope.component.hookable import hookable
- def foo():
- pass
- hooked = hookable(foo)
- try:
- del hooked.implementation
- except TypeError:
- pass
- except AttributeError:
- pass
- else:
- self.fail('Deleted implementation')
-
-class Ob3(object):
- interface.implements(IC)
-
-template = """<configure
- xmlns='http://namespaces.zope.org/zope'
- i18n_domain='zope'>
- %s
- </configure>"""
-
-
-class ResourceViewTests(PlacelessSetup, unittest.TestCase):
-
- def setUp(self):
- super(ResourceViewTests, self).setUp()
- XMLConfig('meta.zcml', zope.component)()
- XMLConfig('meta.zcml', zope.security)()
-
- def testView(self):
- ob = Ob3()
- request = Request(IV)
- self.assertEqual(
- zope.component.queryMultiAdapter((ob, request), name=u'test'), None)
-
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"/>
- '''
- ))
-
- self.assertEqual(
- zope.component.queryMultiAdapter((ob, request),
- name=u'test').__class__,
- V1)
-
-
- def testMultiView(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.adapter.A3"
- for="zope.component.testfiles.views.IC
- zope.component.testfiles.adapter.I1
- zope.component.testfiles.adapter.I2"
- type="zope.component.testfiles.views.IV"/>
- '''
- ))
-
-
- ob = Ob3()
- a1 = A1()
- a2 = A2()
- request = Request(IV)
- view = zope.component.queryMultiAdapter((ob, a1, a2, request),
- name=u'test')
- self.assertEqual(view.__class__, A3)
- self.assertEqual(view.context, (ob, a1, a2, request))
-
-
- def testMultiView_fails_w_multiple_factories(self):
- self.assertRaises(
- ConfigurationError,
- xmlconfig,
- StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.adapter.A3
- zope.component.testfiles.adapter.A2"
- for="zope.component.testfiles.views.IC
- zope.component.testfiles.adapter.I1
- zope.component.testfiles.adapter.I2"
- type="zope.component.testfiles.views.IV"/>
- '''
- )
- )
-
- def testView_w_multiple_factories(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.adapter.A1
- zope.component.testfiles.adapter.A2
- zope.component.testfiles.adapter.A3
- zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"/>
- '''
- ))
-
- ob = Ob3()
-
- # The view should be a V1 around an A3, around an A2, around
- # an A1, anround ob:
- view = zope.component.queryMultiAdapter((ob, Request(IV)), name=u'test')
- self.assertEqual(view.__class__, V1)
- a3 = view.context
- self.assertEqual(a3.__class__, A3)
- a2 = a3.context[0]
- self.assertEqual(a2.__class__, A2)
- a1 = a2.context[0]
- self.assertEqual(a1.__class__, A1)
- self.assertEqual(a1.context[0], ob)
-
- def testView_fails_w_no_factories(self):
- self.assertRaises(ConfigurationError,
- xmlconfig,
- StringIO(template %
- '''
- <view name="test"
- factory=""
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"/>
- '''
- ),
- )
-
-
- def testViewThatProvidesAnInterface(self):
- ob = Ob3()
- self.assertEqual(
- zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test'),
- None)
-
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IR"
- />
- '''
- ))
-
- self.assertEqual(
- zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test'),
- None)
-
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IR"
- provides="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.queryMultiAdapter((ob, Request(IR)), IV, u'test')
- self.assertEqual(v.__class__, V1)
-
-
- def testUnnamedViewThatProvidesAnInterface(self):
- ob = Ob3()
- self.assertEqual(
- zope.component.queryMultiAdapter((ob, Request(IR)), IV), None)
-
- xmlconfig(StringIO(template %
- '''
- <view factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IR"
- />
- '''
- ))
-
- v = zope.component.queryMultiAdapter((ob, Request(IR)), IV)
- self.assertEqual(v, None)
-
- xmlconfig(StringIO(template %
- '''
- <view factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IR"
- provides="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.queryMultiAdapter((ob, Request(IR)), IV)
- self.assertEqual(v.__class__, V1)
-
- def testViewHavingARequiredClass(self):
- xmlconfig(StringIO(template % (
- '''
- <view
- for="zope.component.testfiles.components.Content"
- type="zope.component.testfiles.views.IR"
- factory="zope.component.testfiles.adapter.A1"
- />
- '''
- )))
-
- content = Content()
- a1 = zope.component.getMultiAdapter((content, Request(IR)))
- self.assert_(isinstance(a1, A1))
-
- class MyContent:
- interface.implements(IContent)
-
- self.assertRaises(ComponentLookupError, zope.component.getMultiAdapter,
- (MyContent(), Request(IR)))
-
- def testInterfaceProtectedView(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- permission="zope.Public"
- allowed_interface="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = ProxyFactory(zope.component.getMultiAdapter((Ob3(), Request(IV)),
- name='test'))
- self.assertEqual(v.index(), 'V1 here')
- self.assertRaises(Exception, getattr, v, 'action')
-
- def testAttributeProtectedView(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- permission="zope.Public"
- allowed_attributes="action"
- />
- '''
- ))
-
- v = ProxyFactory(zope.component.getMultiAdapter((Ob3(), Request(IV)),
- name='test'))
- self.assertEqual(v.action(), 'done')
- self.assertRaises(Exception, getattr, v, 'index')
-
- def testInterfaceAndAttributeProtectedView(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- permission="zope.Public"
- allowed_attributes="action"
- allowed_interface="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.getMultiAdapter((Ob3(), Request(IV)), name='test')
- self.assertEqual(v.index(), 'V1 here')
- self.assertEqual(v.action(), 'done')
-
- def testDuplicatedInterfaceAndAttributeProtectedView(self):
- xmlconfig(StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- permission="zope.Public"
- allowed_attributes="action index"
- allowed_interface="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.getMultiAdapter((Ob3(), Request(IV)), name='test')
- self.assertEqual(v.index(), 'V1 here')
- self.assertEqual(v.action(), 'done')
-
- def testIncompleteProtectedViewNoPermission(self):
- self.assertRaises(
- ConfigurationError,
- xmlconfig,
- StringIO(template %
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- allowed_attributes="action index"
- />
- '''
- ))
-
- def testViewUndefinedPermission(self):
- config = StringIO(template % (
- '''
- <view name="test"
- factory="zope.component.testfiles.views.V1"
- for="zope.component.testfiles.views.IC"
- type="zope.component.testfiles.views.IV"
- permission="zope.UndefinedPermission"
- allowed_attributes="action index"
- allowed_interface="zope.component.testfiles.views.IV"
- />
- '''
- ))
- self.assertRaises(ValueError, xmlconfig, config, testing=1)
-
- def testResource(self):
- ob = Ob3()
- self.assertEqual(
- zope.component.queryAdapter(Request(IV), name=u'test'), None)
- xmlconfig(StringIO(template % (
- '''
- <resource name="test"
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IV"/>
- '''
- )))
-
- self.assertEqual(
- zope.component.queryAdapter(Request(IV), name=u'test').__class__,
- R1)
-
- def testResourceThatProvidesAnInterface(self):
- ob = Ob3()
- self.assertEqual(zope.component.queryAdapter(Request(IR), IV, u'test'),
- None)
-
- xmlconfig(StringIO(template %
- '''
- <resource
- name="test"
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IR"
- />
- '''
- ))
-
- v = zope.component.queryAdapter(Request(IR), IV, name=u'test')
- self.assertEqual(v, None)
-
- xmlconfig(StringIO(template %
- '''
- <resource
- name="test"
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IR"
- provides="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.queryAdapter(Request(IR), IV, name=u'test')
- self.assertEqual(v.__class__, R1)
-
- def testUnnamedResourceThatProvidesAnInterface(self):
- ob = Ob3()
- self.assertEqual(zope.component.queryAdapter(Request(IR), IV), None)
-
- xmlconfig(StringIO(template %
- '''
- <resource
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IR"
- />
- '''
- ))
-
- v = zope.component.queryAdapter(Request(IR), IV)
- self.assertEqual(v, None)
-
- xmlconfig(StringIO(template %
- '''
- <resource
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IR"
- provides="zope.component.testfiles.views.IV"
- />
- '''
- ))
-
- v = zope.component.queryAdapter(Request(IR), IV)
- self.assertEqual(v.__class__, R1)
-
- def testResourceUndefinedPermission(self):
-
- config = StringIO(template % (
- '''
- <resource name="test"
- factory="zope.component.testfiles.views.R1"
- type="zope.component.testfiles.views.IV"
- permission="zope.UndefinedPermission"/>
- '''
- ))
- self.assertRaises(ValueError, xmlconfig, config, testing=1)
-
-
-class ConditionalSecurityLayer(UnitTests):
-
- __name__ = 'ConditionalSecurity'
- __bases__ = ()
-
- def setUp(self):
- setUp()
- self.modules = {}
- for m in ('zope.security', 'zope.proxy'):
- self.modules[m] = sys.modules[m]
- sys.modules[m] = None
- import zope.component.zcml
- reload(zope.component.zcml)
-
- def tearDown(self):
- tearDown()
- for m in ('zope.security', 'zope.proxy'):
- sys.modules[m] = self.modules[m]
- import zope.component.zcml
- reload(zope.component.zcml)
-
-
-def setUpRegistryTests(tests):
- setUp()
-
-def tearDownRegistryTests(tests):
- tearDown()
- import zope.event
- zope.event.subscribers.pop()
-
-def clearZCML(test=None):
- tearDown()
- setUp()
- XMLConfig('meta.zcml', component)()
-
-def test_suite():
- checker = renormalizing.RENormalizing([
- (re.compile('at 0x[0-9a-fA-F]+'), 'at <SOME ADDRESS>'),
- (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
- r'exceptions.\1Error:'),
- ])
-
- zcml_conditional = doctest.DocFileSuite('zcml_conditional.txt', checker=checker)
- zcml_conditional.layer = ConditionalSecurityLayer()
-
- with_globs = dict(with_statement=__future__.with_statement)
- hooks_conditional = doctest.DocFileSuite(
- 'hooks.txt', checker=checker, globs=with_globs)
- hooks_conditional.layer = ConditionalSecurityLayer()
-
- return unittest.TestSuite((
- doctest.DocTestSuite(setUp=setUp, tearDown=tearDown),
- unittest.makeSuite(HookableTests),
- doctest.DocTestSuite('zope.component.interface',
- setUp=setUp, tearDown=tearDown),
- doctest.DocTestSuite('zope.component.nexttesting'),
- doctest.DocFileSuite('README.txt',
- setUp=setUp, tearDown=tearDown),
- doctest.DocFileSuite('socketexample.txt',
- setUp=setUp, tearDown=tearDown),
- doctest.DocFileSuite('factory.txt',
- setUp=setUp, tearDown=tearDown),
- doctest.DocFileSuite('hooks.txt', checker=checker,
- setUp=setUp, tearDown=tearDown,
- globs=with_globs),
- doctest.DocFileSuite('event.txt',
- setUp=setUp, tearDown=tearDown),
- doctest.DocTestSuite('zope.component.security'),
- doctest.DocFileSuite('zcml.txt', checker=checker,
- setUp=setUp, tearDown=tearDown),
- doctest.DocFileSuite('configure.txt',
- setUp=setUp, tearDown=tearDown),
- doctest.DocFileSuite('testlayer.txt',
- optionflags=(doctest.ELLIPSIS +
- doctest.NORMALIZE_WHITESPACE +
- doctest.REPORT_NDIFF)),
- zcml_conditional,
- hooks_conditional,
- unittest.makeSuite(StandaloneTests),
- unittest.makeSuite(ResourceViewTests),
- ))
-
-if __name__ == "__main__":
- unittest.main(defaultTest='test_suite')
More information about the checkins
mailing list