[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/ContentDirective/tests - ExampleClass.py:1.2 TestModuleHookup.py:1.2 __init__.py:1.2 testDirectives.py:1.2 testFactory.py:1.2 testRequirePermissions.py:1.2
Jim Fulton
jim@zope.com
Mon, 10 Jun 2002 19:28:49 -0400
Update of /cvs-repository/Zope3/lib/python/Zope/App/ContentDirective/tests
In directory cvs.zope.org:/tmp/cvs-serv17445/lib/python/Zope/App/ContentDirective/tests
Added Files:
ExampleClass.py TestModuleHookup.py __init__.py
testDirectives.py testFactory.py testRequirePermissions.py
Log Message:
Merged Zope-3x-branch into newly forked Zope3 CVS Tree.
=== Zope3/lib/python/Zope/App/ContentDirective/tests/ExampleClass.py 1.1 => 1.2 ===
+
+class ExampleClass:
+ pass
+
+class IExample(Interface):
+ pass
+
+class IExampleContainer(Interface):
+ pass
=== Zope3/lib/python/Zope/App/ContentDirective/tests/TestModuleHookup.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.
+#
+##############################################################################
+"""Preliminaries to hookup a test suite with the external TestModule.
+
+This is necessary because the test framework interferes with seeing changes in
+the running modules via the module namespace. This enables having some
+subject classes, instances, permissions, etc, that don't live in the test
+modules, themselves."""
+
+from Interface import Interface
+
+PREFIX = "Zope.App.Security.tests.TestModule."
+import Zope.App.Security.tests.TestModule as TestModule
+TestModule.test_class = None
+class I(Interface):
+ def m1():
+ pass
+ def m2():
+ pass
+
+class I2(I):
+ def m4():
+ pass
+
+
+TestModule.I = I
+TestModule.I2 = I2
+
+template_bracket = """<zopeConfigure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:security='http://namespaces.zope.org/security'>
+ %s
+</zopeConfigure>"""
=== Zope3/lib/python/Zope/App/ContentDirective/tests/__init__.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.
+#
+##############################################################################
+""" Zope.App.ClassDirective unit tests """
=== Zope3/lib/python/Zope/App/ContentDirective/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.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+
+import unittest, sys, os
+
+from Zope.Configuration.xmlconfig import xmlconfig
+from StringIO import StringIO
+from Zope.Testing.CleanUp import CleanUp # Base class w registry cleanup
+from Zope.Configuration.xmlconfig import ZopeXMLConfigurationError
+
+# explicitly import ExampleClass and IExample using full paths
+# so that they are the same objects as resolve will get.
+from Zope.App.ContentDirective.tests.ExampleClass import ExampleClass, IExample
+
+import Zope.App.ContentDirective
+defs_path = os.path.join(
+ os.path.split(Zope.App.ContentDirective.__file__)[0],
+ 'content-meta.zcml')
+
+import Zope.App.Security
+security_defs_path = os.path.join(
+ os.path.split(Zope.App.Security.__file__)[0],
+ 'security-meta.zcml')
+
+
+def configfile(s):
+ return StringIO("""<zopeConfigure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:security='http://namespaces.zope.org/security'
+ xmlns:zmi='http://namespaces.zope.org/zmi'>
+ %s
+ </zopeConfigure>
+ """ % s)
+
+class TestContentDirective(CleanUp, unittest.TestCase):
+ def setUp(self):
+ xmlconfig(open(defs_path))
+ xmlconfig(open(security_defs_path))
+
+ try:
+ del ExampleClass.__implements__
+ except AttributeError:
+ pass
+
+ def testEmptyDirective(self):
+ f = configfile("""
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+</content>
+ """)
+ xmlconfig(f)
+
+
+ def testImplements(self):
+ f = configfile("""
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <implements interface="Zope.App.ContentDirective.tests.ExampleClass.IExample" />
+</content>
+ """)
+ xmlconfig(f)
+ self.failUnless(IExample.isImplementedByInstancesOf(ExampleClass))
+
+
+ def testRequire(self):
+ f = configfile("""
+<security:permission id="Zope.View" title="Zope view permission" />
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <security:require permission="Zope.View"
+ attributes="anAttribute anotherAttribute" />
+</content>
+ """)
+ xmlconfig(f)
+
+ def testAllow(self):
+ f = configfile("""
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <security:allow attributes="anAttribute anotherAttribute" />
+</content>
+ """)
+ xmlconfig(f)
+
+ def testMimic(self):
+ f = configfile("""
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <security:mimic class="Zope.App.ContentDirective.tests.ExampleClass." />
+</content>
+ """)
+ xmlconfig(f)
+
+
+from Zope.App.OFS.Services.AddableService.tests.AddableSetup \
+ import AddableSetup
+
+class TestFactorySubdirective(AddableSetup, CleanUp, unittest.TestCase):
+ def setUp(self):
+ AddableSetup.setUp(self)
+ xmlconfig(open(defs_path))
+ xmlconfig(open(security_defs_path))
+
+ def testFactory(self):
+ f = configfile("""
+<security:permission id="Zope.Foo" title="Zope Foo Permission" />
+
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <zmi:factory
+ id="Example"
+ permission="Zope.Foo"
+ title="Example content"
+ description="Example description"
+ for_container="Zope.App.ContentDirective.tests.ExampleClass."
+ creation_markers="Zope.App.ContentDirective.tests.ExampleClass.IExample"
+ />
+</content>
+ """)
+ xmlconfig(f)
+
+def test_suite():
+ suite = unittest.TestSuite()
+ loader = unittest.TestLoader()
+ suite.addTest(loader.loadTestsFromTestCase(TestContentDirective))
+ suite.addTest(loader.loadTestsFromTestCase(TestFactorySubdirective))
+ return suite
+
+
+if __name__=='__main__':
+ unittest.TextTestRunner().run(test_suite())
=== Zope3/lib/python/Zope/App/ContentDirective/tests/testFactory.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.
+#
+##############################################################################
+""" Test handler for 'factory' subdirective of 'content' directive """
+
+import unittest, sys, os
+
+from cStringIO import StringIO
+from Zope.Configuration.xmlconfig import xmlconfig, ZopeXMLConfigurationError
+from Zope.Testing.CleanUp import CleanUp # Base class w registry cleanup
+from Zope.App.Security.Exceptions import UndefinedPermissionError
+from Zope.App.OFS.Services.AddableService.tests.AddableSetup \
+ import AddableSetup
+
+from Zope.App.ContentDirective.tests.ExampleClass \
+ import ExampleClass, IExample, IExampleContainer
+
+import Zope.App.ContentDirective
+defs_path = os.path.join(
+ os.path.split(Zope.App.ContentDirective.__file__)[0],
+ 'content-meta.zcml')
+
+import Zope.App.Security
+security_defs_path = os.path.join(
+ os.path.split(Zope.App.Security.__file__)[0],
+ 'security-meta.zcml')
+
+
+def configfile(s):
+ return StringIO("""<zopeConfigure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:security='http://namespaces.zope.org/security'
+ xmlns:zmi='http://namespaces.zope.org/zmi'>
+ %s
+ </zopeConfigure>
+ """ % s)
+
+class Test(AddableSetup, CleanUp, unittest.TestCase):
+ def setUp(self):
+ AddableSetup.setUp(self)
+ xmlconfig(open(defs_path))
+ xmlconfig(open(security_defs_path))
+
+
+ def testFactory(self):
+ from Zope.ComponentArchitecture import getService
+ from Zope.Proxy.ProxyIntrospection import removeAllProxies
+ f = configfile("""
+<security:permission id="Zope.Foo" title="Zope Foo Permission" />
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <zmi:factory
+ id="Example"
+ permission="Zope.Foo"
+ title="Example content"
+ description="Example description"
+ for_container="Zope.App.ContentDirective.tests.ExampleClass.IExampleContainer"
+ creation_markers="Zope.App.ContentDirective.tests.ExampleClass.IExample"
+ />
+</content>
+ """)
+ xmlconfig(f)
+ obj = getService(None, "Factories").createObject('Example')
+ obj = removeAllProxies(obj)
+ self.failUnless(isinstance(obj, ExampleClass))
+
+ def testFactoryDefaultId(self):
+ from Zope.ComponentArchitecture import getService
+ from Zope.Proxy.ProxyIntrospection import removeAllProxies
+ f = configfile("""
+<security:permission id="Zope.Foo" title="Zope Foo Permission" />
+<content class="Zope.App.ContentDirective.tests.ExampleClass.">
+ <zmi:factory
+ permission="Zope.Foo"
+ title="Example content"
+ description="Example description"
+ for_container="Zope.App.ContentDirective.tests.ExampleClass.IExampleContainer"
+ creation_markers="Zope.App.ContentDirective.tests.ExampleClass.IExample"
+ />
+</content>
+ """)
+ xmlconfig(f)
+ obj = getService(None, "Factories").createObject(
+ 'Zope.App.ContentDirective.tests.ExampleClass.')
+ obj = removeAllProxies(obj)
+ self.failUnless(isinstance(obj, ExampleClass))
+
+
+def test_suite():
+ loader=unittest.TestLoader()
+ return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+ unittest.TextTestRunner().run(test_suite())
+
+
+
=== Zope3/lib/python/Zope/App/ContentDirective/tests/testRequirePermissions.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.
+#
+##############################################################################
+""" Test handler for 'require' subdirective of 'content' directive """
+
+import unittest, sys, os
+
+from Zope.App.Security import protectClass
+
+# So we can use config parser to exercise protectClass stuff.
+from cStringIO import StringIO
+from Zope.Configuration.xmlconfig import xmlconfig, ZopeXMLConfigurationError
+from TestModuleHookup import *
+from Zope.Testing.CleanUp import CleanUp # Base class w registry cleanup
+from Zope.App.Security.Exceptions import UndefinedPermissionError
+
+
+import Zope.App.ContentDirective
+defs_path = os.path.join(
+ os.path.split(Zope.App.ContentDirective.__file__)[0],
+ 'content-meta.zcml')
+
+import Zope.App.Security
+security_defs_path = os.path.join(
+ os.path.split(Zope.App.Security.__file__)[0],
+ 'security-meta.zcml')
+
+def defineDirectives():
+ xmlconfig(open(defs_path))
+ xmlconfig(open(security_defs_path))
+ xmlconfig(StringIO("""<zopeConfigure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:security='http://namespaces.zope.org/security'>
+ <security:permission id="extravagant" title="extravagant" />
+ <security:permission id="paltry" title="paltry" />
+ </zopeConfigure>"""))
+
+NOTSET = []
+
+P1 = "extravagant"
+P2 = "paltry"
+
+class Test(CleanUp, unittest.TestCase):
+
+ def setUp(self):
+ defineDirectives()
+ class B:
+ def m1(self):
+ return "m1"
+ def m2(self):
+ return "m2"
+ class C(B):
+ __implements__ = I
+ def m3(self):
+ return "m3"
+ def m4(self):
+ return "m4"
+ TestModule.test_base = B
+ TestModule.test_class = C
+ TestModule.test_instance = C()
+ self.assertState()
+
+ def tearDown(self):
+ CleanUp.tearDown(self)
+ TestModule.test_class = None
+
+ def assertState(self, instP=NOTSET,
+ m1P=NOTSET, m2P=NOTSET, m3P=NOTSET):
+ "Verify that class, instance, and methods have expected permissions."
+
+ from Zope.Security.Checker import selectChecker
+ from Zope.Exceptions import Forbidden
+
+ checker = selectChecker(TestModule.test_instance)
+ self.assertEqual(checker.permission_id('m1'), (m1P or None))
+ self.assertEqual(checker.permission_id('m2'), (m2P or None))
+ self.assertEqual(checker.permission_id('m3'), (m3P or None))
+
+ def assertDeclaration(self, declaration, **state):
+ apply_declaration(template_bracket % declaration)
+ self.assertState(**state)
+
+ def testClass(self):
+ declaration = ("""<content class="%s">
+ <security:require permission="%s" />
+ </content>"""
+ % (PREFIX+"test_class", P1))
+ self.assertDeclaration(declaration,
+ instP=P1)
+
+ # "testSimple*" exercises tags that do NOT have children. This mode
+ # inherently sets the instances as well as the class attributes.
+
+ def testSimpleMethodsPlural(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ attributes="m1 m3"/>
+ </content>"""
+ % (PREFIX+"test_class", P1))
+ self.assertDeclaration(declaration,
+ instP=P1, m1P=P1, m3P=P1)
+
+ def testSimpleInterface(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ interface="%s"/>
+ </content>"""
+ % (PREFIX+"test_class", P1, PREFIX+"I"))
+ # m1 and m2 are in the interface, so should be set, and m3 should not:
+ self.assertDeclaration(declaration,
+ instP=P1, m1P=P1, m2P=P1)
+
+ # "testComposite*" exercises tags that DO have children.
+ # "testComposite*TopPerm" exercises tags with permission in containing tag.
+ # "testComposite*ElementPerm" exercises tags w/permission in children.
+
+ def testCompositeNoPerm(self):
+ # Establish rejection of declarations lacking a permission spec.
+ declaration = ("""<content class="%s">
+ <security:require
+ attributes="m1"/>
+ </content>"""
+ % (PREFIX+"test_class"))
+ self.assertRaises(ZopeXMLConfigurationError,
+ self.assertDeclaration,
+ declaration)
+
+
+
+ def testCompositeMethodsPluralElementPerm(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ attributes="m1 m3"/>
+ </content>"""
+ % (PREFIX+"test_class", P1))
+ self.assertDeclaration(declaration,
+ m1P=P1, m3P=P1)
+
+ def testCompositeInterfaceTopPerm(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ interface="%s"/>
+ </content>"""
+ % (PREFIX+"test_class", P1, PREFIX+"I"))
+ self.assertDeclaration(declaration,
+ m1P=P1, m2P=P1)
+
+
+ def testSubInterfaces(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ interface="%s"/>
+ </content>"""
+ % (PREFIX+"test_class", P1, PREFIX+"I2"))
+ # m1 and m2 are in the interface, so should be set, and m3 should not:
+ self.assertDeclaration(declaration,
+ instP=P1, m1P=P1, m2P=P1)
+
+
+ def testMimicOnly(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ attributes="m1 m2"/>
+ </content>
+ <content class="%s">
+ <security:mimic class="%s" />
+ </content>
+ """ % (PREFIX+"test_base", P1,
+ PREFIX+"test_class", PREFIX+"test_base"))
+ # m1 and m2 are in the interface, so should be set, and m3 should not:
+ self.assertDeclaration(declaration,
+ m1P=P1, m2P=P1)
+
+
+ def testMimicAsDefault(self):
+ declaration = ("""<content class="%s">
+ <security:require
+ permission="%s"
+ attributes="m1 m2"/>
+ </content>
+ <content class="%s">
+ <security:mimic class="%s" />
+ <security:require
+ permission="%s"
+ attributes="m2 m3"/>
+ </content>
+ """ % (PREFIX+"test_base", P1,
+ PREFIX+"test_class", PREFIX+"test_base", P2))
+
+ # m1 and m2 are in the interface, so should be set, and m3 should not:
+ self.assertDeclaration(declaration,
+ m1P=P1, m2P=P2, m3P=P2)
+
+
+def apply_declaration(declaration):
+ """Apply the xmlconfig machinery."""
+ return xmlconfig(StringIO(declaration))
+
+def test_suite():
+ loader=unittest.TestLoader()
+ return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+ unittest.TextTestRunner().run(test_suite())