[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/ComponentArchitecture/tests - TestService.py:1.2 __init__.py:1.2 testDirectives.py:1.2 testServiceDirective.py:1.2
Jim Fulton
jim@zope.com
Mon, 10 Jun 2002 19:28:48 -0400
Update of /cvs-repository/Zope3/lib/python/Zope/App/ComponentArchitecture/tests
In directory cvs.zope.org:/tmp/cvs-serv17445/lib/python/Zope/App/ComponentArchitecture/tests
Added Files:
TestService.py __init__.py testDirectives.py
testServiceDirective.py
Log Message:
Merged Zope-3x-branch into newly forked Zope3 CVS Tree.
=== Zope3/lib/python/Zope/App/ComponentArchitecture/tests/TestService.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+__metaclass__ = type # All classes are new style when run with Python 2.2+
+
+from Interface import Interface
+
+class IFooService(Interface):
+
+ def foo(): pass
+ def foobar(): pass
+
+class FooService:
+
+ __implements__ = IFooService
+
+ def foo(self): return "foo here"
+ def foobar(self): return "foobarred"
+
+ def bar(self): return "you shouldn't get this"
+
+fooService = FooService()
+
+class Foo2(FooService): pass
+
+foo2 = Foo2()
=== Zope3/lib/python/Zope/App/ComponentArchitecture/tests/__init__.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
=== Zope3/lib/python/Zope/App/ComponentArchitecture/tests/testDirectives.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+import unittest
+import sys
+import os
+from cStringIO import StringIO
+
+from Zope.Configuration.xmlconfig import xmlconfig
+from Zope.Configuration.Exceptions import ConfigurationError
+
+from Zope.Security.Proxy import getTestProxyItems, getObject as proxiedObject
+
+from Zope.ComponentArchitecture.Exceptions import ComponentLookupError
+from Zope.ComponentArchitecture \
+ import getView, queryView, getResource, queryResource, createObject
+from Zope.ComponentArchitecture import getDefaultViewName
+
+from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
+from Zope.ComponentArchitecture.tests.TestViews import \
+ IV, IC, V1, VZMI, R1, RZMI
+from Zope.ComponentArchitecture.tests.Request import Request
+
+import Zope.App.ComponentArchitecture
+defs_path = os.path.join(
+ os.path.split(Zope.App.ComponentArchitecture.__file__)[0],
+ 'component-meta.zcml')
+
+template = """<zopeConfigure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:security='http://namespaces.zope.org/security'>
+ xmlns:test='http://www.zope.org/NS/Zope3/test'>
+ %s
+ </zopeConfigure>"""
+
+class Ob:
+ __implements__ = IC
+
+class Test(PlacelessSetup, unittest.TestCase):
+
+ # XXX: tests for other directives needed
+
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+ xmlconfig(open(defs_path))
+
+ def testAdapter(self):
+ from Zope.ComponentArchitecture import getAdapter, queryAdapter
+
+ # Full import is critical!
+ from Zope.ComponentArchitecture.tests.TestComponents \
+ import Content, IApp, Comp
+
+ self.assertEqual(queryAdapter(Content(), IV, None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <adapter
+ factory="Zope.ComponentArchitecture.tests.TestComponents.Comp"
+ provides="Zope.ComponentArchitecture.tests.TestComponents.IApp"
+ for="Zope.ComponentArchitecture.tests.TestComponents.IContent"
+ />
+ """
+ )))
+
+ self.assertEqual(getAdapter(Content(), IApp).__class__, Comp)
+
+ def testProtectedAdapter(self):
+ from Zope.ComponentArchitecture import getAdapter, queryAdapter
+
+ # Full import is critical!
+ from Zope.ComponentArchitecture.tests.TestComponents \
+ import Content, IApp, Comp
+
+ self.assertEqual(queryAdapter(Content(), IV, None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <adapter
+ factory="Zope.ComponentArchitecture.tests.TestComponents.Comp"
+ provides="Zope.ComponentArchitecture.tests.TestComponents.IApp"
+ for="Zope.ComponentArchitecture.tests.TestComponents.IContent"
+ permission="Zope.Public"
+ />
+ """
+ )))
+
+ adapter = getAdapter(Content(), IApp)
+ items = [item[0] for item in getTestProxyItems(adapter)]
+ self.assertEqual(items, ['a', 'f'])
+ self.assertEqual(proxiedObject(adapter).__class__, Comp)
+
+ def testUtility(self):
+ from Zope.ComponentArchitecture import getUtility, queryUtility
+
+ # Full import is critical!
+ from Zope.ComponentArchitecture.tests.TestComponents \
+ import IApp, comp
+
+ self.assertEqual(queryUtility(None, IV, None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <utility
+ component="Zope.ComponentArchitecture.tests.TestComponents.comp"
+ provides="Zope.ComponentArchitecture.tests.TestComponents.IApp"
+ />
+ """
+ )))
+
+ self.assertEqual(getUtility(None, IApp), comp)
+
+ def testUtilityFactory(self):
+ from Zope.ComponentArchitecture import getUtility, queryUtility
+
+ # Full import is critical!
+ from Zope.ComponentArchitecture.tests.TestComponents \
+ import IApp, Comp
+
+ self.assertEqual(queryUtility(None, IV, None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <utility
+ factory="Zope.ComponentArchitecture.tests.TestComponents.Comp"
+ provides="Zope.ComponentArchitecture.tests.TestComponents.IApp"
+ />
+ """
+ )))
+
+ self.assertEqual(getUtility(None, IApp).__class__, Comp)
+
+ def testProtectedUtility(self):
+ from Zope.ComponentArchitecture import getUtility, queryUtility
+
+ # Full import is critical!
+ from Zope.ComponentArchitecture.tests.TestComponents \
+ import IApp, comp
+
+ self.assertEqual(queryUtility(None, IV, None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <utility
+ component="Zope.ComponentArchitecture.tests.TestComponents.comp"
+ provides="Zope.ComponentArchitecture.tests.TestComponents.IApp"
+ permission="Zope.Public"
+ />
+ """
+ )))
+
+ utility = getUtility(None, IApp)
+ items = [item[0] for item in getTestProxyItems(utility)]
+ self.assertEqual(items, ['a', 'f'])
+ self.assertEqual(proxiedObject(utility), comp)
+
+
+ def testView(self):
+
+ ob = Ob()
+ self.assertEqual(queryView(ob, 'test', Request(IV), None), None)
+
+ xmlconfig(StringIO(template %
+ """
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ ))
+
+ self.assertEqual(queryView(ob, 'test', Request(IV), None).__class__,
+ V1)
+
+ def testInterfaceProtectedView(self):
+ xmlconfig(StringIO(template %
+ """
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"
+ permission="Zope.Public"
+ allowed_interface="Zope.ComponentArchitecture.tests.TestViews.IV"
+ />
+ """
+ ))
+
+ v = getView(Ob(), 'test', Request(IV))
+ self.assertEqual(v.index(), 'V1 here')
+ self.assertRaises(Exception, getattr, v, 'action')
+
+ def testAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ """
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"
+ permission="Zope.Public"
+ allowed_attributes="action"
+ />
+ """
+ ))
+
+ v = getView(Ob(), 'test', Request(IV))
+ self.assertEqual(v.action(), 'done')
+ self.assertRaises(Exception, getattr, v, 'index')
+
+ def testInterfaceAndAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ """
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"
+ permission="Zope.Public"
+ allowed_attributes="action"
+ allowed_interface="Zope.ComponentArchitecture.tests.TestViews.IV"
+ />
+ """
+ ))
+
+ v = getView(Ob(), 'test', Request(IV))
+ self.assertEqual(v.index(), 'V1 here')
+ self.assertEqual(v.action(), 'done')
+
+ def testDuplicatedInterfaceAndAttributeProtectedView(self):
+ xmlconfig(StringIO(template %
+ """
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"
+ permission="Zope.Public"
+ allowed_attributes="action index"
+ allowed_interface="Zope.ComponentArchitecture.tests.TestViews.IV"
+ />
+ """
+ ))
+
+ v = getView(Ob(), 'test', Request(IV))
+ 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.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"
+ allowed_attributes="action index"
+ />
+ """
+ ))
+
+ def testDefaultView(self):
+
+ ob = Ob()
+ self.assertEqual(queryView(ob, 'test', Request(IV), None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <defaultView name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ )))
+
+ self.assertEqual(queryView(ob, 'test', Request(IV), None).__class__,
+ V1)
+ self.assertEqual(getDefaultViewName(ob, Request(IV)), 'test')
+
+ def testDefaultViewOnly(self):
+
+ ob = Ob()
+ self.assertEqual(queryView(ob, 'test', Request(IV), None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <defaultView name="test"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ )))
+
+ self.assertEqual(queryView(ob, 'test', Request(IV), None), None)
+ self.assertEqual(getDefaultViewName(ob, Request(IV)), 'test')
+
+ def testSKinView(self):
+
+ ob = Ob()
+ self.assertEqual(queryView(ob, 'test', Request(IV), None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <skin name="zmi" layers="zmi default"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV" />
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.VZMI"
+ layer="zmi"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ <view name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.V1"
+ for="Zope.ComponentArchitecture.tests.TestViews.IC"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ )))
+
+ self.assertEqual(queryView(ob, 'test', Request(IV), None).__class__,
+ V1)
+ self.assertEqual(
+ queryView(ob, 'test', Request(IV, 'zmi'), None).__class__,
+ VZMI)
+
+ def testResource(self):
+
+ ob = Ob()
+ self.assertEqual(queryResource(ob, 'test', Request(IV), None), None)
+ xmlconfig(StringIO(template % (
+ """
+ <resource name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.R1"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ )))
+
+ self.assertEqual(queryResource(ob, 'test', Request(IV), None
+ ).__class__,
+ R1)
+
+ def testSkinResource(self):
+
+ ob = Ob()
+ self.assertEqual(queryResource(ob, 'test', Request(IV), None), None)
+
+ xmlconfig(StringIO(template % (
+ """
+ <skin name="zmi" layers="zmi default"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV" />
+ <resource name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.RZMI"
+ layer="zmi"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ <resource name="test"
+ factory="Zope.ComponentArchitecture.tests.TestViews.R1"
+ type="Zope.ComponentArchitecture.tests.TestViews.IV"/>
+ """
+ )))
+
+ self.assertEqual(
+ queryResource(ob, 'test', Request(IV), None).__class__,
+ R1)
+ self.assertEqual(
+ queryResource(ob, 'test', Request(IV, 'zmi'), None).__class__,
+ RZMI)
+
+ def testFactory(self):
+
+ self.assertRaises(ComponentLookupError, createObject, None, 'foo')
+
+ xmlconfig(StringIO(template % (
+ """
+ <factory
+ id="foo"
+ component="Zope.ComponentArchitecture.tests.TestFactory.f"
+ />
+ <factory
+ component="Zope.ComponentArchitecture.tests.TestFactory.f"
+ />
+ """
+ )))
+
+ from Zope.ComponentArchitecture.tests.TestFactory import X
+ self.assertEqual(createObject(None, 'foo').__class__, X)
+ self.assertEqual(createObject(
+ None,
+ 'Zope.ComponentArchitecture.tests.TestFactory.f').__class__, X)
+
+def test_suite():
+ loader=unittest.TestLoader()
+ return loader.loadTestsFromTestCase(Test)
+if __name__=='__main__':
+ unittest.TextTestRunner().run(test_suite())
+
=== Zope3/lib/python/Zope/App/ComponentArchitecture/tests/testServiceDirective.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+
+import unittest
+import sys
+import os
+from cStringIO import StringIO
+
+from Zope.Configuration.xmlconfig import testxmlconfig as xmlconfig
+from Zope.Configuration.Exceptions import ConfigurationError
+
+from Zope.Security.Proxy import getTestProxyItems, getObject as proxiedObject, ProxyFactory
+
+from Zope.ComponentArchitecture.Exceptions import ComponentLookupError
+
+from Zope.Exceptions import Forbidden, Unauthorized
+
+from Zope.App.ComponentArchitecture.tests.TestService \
+ import IFooService, FooService
+
+from Zope.ComponentArchitecture import getService
+
+from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
+
+import Zope.App.ComponentArchitecture
+defs_path = os.path.join(
+ os.path.split(Zope.App.ComponentArchitecture.__file__)[0],
+ 'component-meta.zcml')
+
+template = """<zopeConfigure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:security='http://namespaces.zope.org/security'>
+ xmlns:test='http://www.zope.org/NS/Zope3/test'>
+ %s
+ </zopeConfigure>"""
+
+
+class Test(PlacelessSetup, unittest.TestCase):
+
+ # XXX: tests for other directives needed
+
+ def setUp(self):
+ PlacelessSetup.setUp(self)
+ xmlconfig(open(defs_path))
+
+ def testServiceConfigNoType(self):
+ from Zope.ComponentArchitecture.GlobalServiceManager \
+ import UndefinedService
+ self.assertRaises(
+ UndefinedService,
+ xmlconfig,
+ StringIO(template % (
+ """
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.fooService"
+ />
+ """
+ )))
+
+ def testDuplicateServiceConfig(self):
+ from Zope.Configuration.xmlconfig \
+ import ZopeConflictingConfigurationError
+ self.assertRaises(
+ ZopeConflictingConfigurationError,
+ xmlconfig,
+ StringIO(template % (
+ """
+ <serviceType id="Foo"
+ interface="
+ Zope.App.ComponentArchitecture.tests.TestService.IFooService"
+ />
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.fooService"
+ />
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.foo2"
+ />
+ """
+ )))
+
+ def testServiceConfig(self):
+ self.assertRaises(ComponentLookupError, getService, None, "Foo")
+
+ xmlconfig(StringIO(template % (
+ """
+ <serviceType id="Foo"
+ interface="
+ Zope.App.ComponentArchitecture.tests.TestService.IFooService"
+ />
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.fooService"
+ />
+ """
+ )))
+
+ service = getService(None, "Foo")
+ self.assertEqual(service.foo(), "foo here")
+ self.assertEqual(service.foobar(), "foobarred")
+ self.assertEqual(service.bar(), "you shouldn't get this")
+
+ def testServiceFactoryConfig(self):
+ self.assertRaises(ComponentLookupError, getService, None, "Foo")
+
+ xmlconfig(StringIO(template % (
+ """
+ <serviceType id="Foo"
+ interface="
+ Zope.App.ComponentArchitecture.tests.TestService.IFooService"
+ />
+ <service
+ serviceType="Foo"
+ factory="
+ Zope.App.ComponentArchitecture.tests.TestService.FooService"
+ />
+ """
+ )))
+
+ service = getService(None, "Foo")
+ self.assertEqual(service.foo(), "foo here")
+ self.assertEqual(service.foobar(), "foobarred")
+ self.assertEqual(service.bar(), "you shouldn't get this")
+
+ def testPublicProtectedServiceConfig(self):
+ self.assertRaises(ComponentLookupError, getService, None, "Foo")
+
+ xmlconfig(StringIO(template % (
+ """
+ <serviceType id="Foo"
+ interface="
+ Zope.App.ComponentArchitecture.tests.TestService.IFooService"
+ />
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.fooService"
+ permission="Zope.Public"
+ />
+ """
+ )))
+
+ service = getService(None, "Foo")
+ service = ProxyFactory(service) # simulate untrusted code!
+ self.assertEqual(service.foo(), "foo here")
+ self.assertEqual(service.foobar(), "foobarred")
+ self.assertRaises(Forbidden, getattr, service, 'bar')
+
+ def testProtectedServiceConfig(self):
+ self.assertRaises(ComponentLookupError, getService, None, "Foo")
+
+ xmlconfig(StringIO(template % (
+ """
+ <directives namespace="http://namespaces.zope.org/security">
+ <directive name="permission"
+ attributes="id title description"
+ handler="Zope.App.Security.metaConfigure.definePermission" />
+ </directives>
+
+ <security:permission id="XXX" title="xxx" />
+
+ <serviceType id="Foo"
+ interface="
+ Zope.App.ComponentArchitecture.tests.TestService.IFooService"
+ />
+ <service
+ serviceType="Foo"
+ component="
+ Zope.App.ComponentArchitecture.tests.TestService.fooService"
+ permission="XXX"
+ />
+ """
+ )))
+
+
+ # Need to "log someone in" to turn on checks
+ from Zope.Security.SecurityManagement import newSecurityManager
+ newSecurityManager('someuser')
+
+ service = getService(None, "Foo")
+ service = ProxyFactory(service) # simulate untrusted code!
+
+ self.assertRaises(Unauthorized, getattr, service, 'foo')
+ self.assertRaises(Unauthorized, getattr, service, 'foobar')
+ self.assertRaises(Forbidden, getattr, service, 'bar')
+
+
+
+def test_suite():
+ loader=unittest.TestLoader()
+ return loader.loadTestsFromTestCase(Test)
+if __name__=='__main__':
+ unittest.TextTestRunner().run(test_suite())
+