[Zope-Checkins] SVN: Zope/trunk/src/Products/ZCatalog/tests/test_ Split tests for catalog and zcatalog modules

Hanno Schlichting hannosch at hannosch.eu
Sun Aug 1 07:59:56 EDT 2010


Log message for revision 115316:
  Split tests for catalog and zcatalog modules
  

Changed:
  U   Zope/trunk/src/Products/ZCatalog/tests/test_catalog.py
  A   Zope/trunk/src/Products/ZCatalog/tests/test_zcatalog.py

-=-
Modified: Zope/trunk/src/Products/ZCatalog/tests/test_catalog.py
===================================================================
--- Zope/trunk/src/Products/ZCatalog/tests/test_catalog.py	2010-08-01 11:02:58 UTC (rev 115315)
+++ Zope/trunk/src/Products/ZCatalog/tests/test_catalog.py	2010-08-01 11:59:56 UTC (rev 115316)
@@ -21,13 +21,8 @@
 from itertools import chain
 import random
 
-from AccessControl.SecurityManagement import setSecurityManager
-from AccessControl.SecurityManagement import noSecurityManager
-from AccessControl import Unauthorized
-from Acquisition import Implicit
 import ExtensionClass
 import OFS.Application
-from OFS.Folder import Folder as OFS_Folder
 from Products.PluginIndexes.FieldIndex.FieldIndex import FieldIndex
 from Products.PluginIndexes.KeywordIndex.KeywordIndex import KeywordIndex
 from Products.ZCTextIndex.OkapiIndex import OkapiIndex
@@ -60,12 +55,6 @@
     return L
 
 
-class Folder(OFS_Folder):
-    def __init__(self, id):
-        self._setId(id)
-        OFS_Folder.__init__(self)
-
-
 class CatalogBase:
 
     def setUp(self):
@@ -148,179 +137,6 @@
         return '%d' % self.num
 
 
-class zdummyFalse(zdummy):
-
-    def __nonzero__(self):
-        return False
-
-# make objects with failing __len__ and __nonzero__
-
-class dummyLenFail(zdummy):
-
-    def __init__(self, num, fail):
-        zdummy.__init__(self, num)
-        self.fail = fail
-
-    def __len__(self):
-        self.fail("__len__() was called")
-
-
-class dummyNonzeroFail(zdummy):
-    def __init__(self, num, fail):
-        zdummy.__init__(self, num)
-        self.fail = fail
-
-    def __nonzero__(self):
-        self.fail("__nonzero__() was called")
-
-
-class FakeTraversalError(KeyError):
-    """fake traversal exception for testing"""
-
-
-class fakeparent(Implicit):
-
-    # fake parent mapping unrestrictedTraverse to
-    # catalog.resolve_path as simulated by TestZCatalog
-
-    marker = object()
-
-    def __init__(self, d):
-        self.d = d
-
-    def unrestrictedTraverse(self, path, default=marker):
-        result = self.d.get(path, default)
-        if result is self.marker:
-            raise FakeTraversalError(path)
-        return result
-
-
-class TestZCatalog(unittest.TestCase):
-
-    def setUp(self):
-        from Products.ZCatalog.ZCatalog import ZCatalog
-        self._catalog = ZCatalog('Catalog')
-        self._catalog.resolve_path = self._resolve_num
-        self._catalog.addIndex('title', 'KeywordIndex')
-        self._catalog.addColumn('title')
-
-        self.upper = 10
-
-        self.d = {}
-        for x in range(0, self.upper):
-            # make uid a string of the number
-            ob = zdummy(x)
-            self.d[str(x)] = ob
-            self._catalog.catalog_object(ob, str(x))
-
-    def _resolve_num(self, num):
-        return self.d[num]
-
-    def test_interfaces(self):
-        from Products.ZCatalog.interfaces import IZCatalog
-        from Products.ZCatalog.ZCatalog import ZCatalog
-        from zope.interface.verify import verifyClass
-
-        verifyClass(IZCatalog, ZCatalog)
-
-    def testGetMetadataForUID(self):
-        testNum = str(self.upper - 3) # as good as any..
-        data = self._catalog.getMetadataForUID(testNum)
-        self.assertEqual(data['title'], testNum)
-
-    def testGetIndexDataForUID(self):
-        testNum = str(self.upper - 3)
-        data = self._catalog.getIndexDataForUID(testNum)
-        self.assertEqual(data['title'][0], testNum)
-
-    def testSearch(self):
-        query = {'title': ['5', '6', '7']}
-        sr = self._catalog.searchResults(query)
-        self.assertEqual(len(sr), 3)
-        sr = self._catalog.search(query)
-        self.assertEqual(len(sr), 3)
-
-    def testUpdateMetadata(self):
-        self._catalog.catalog_object(zdummy(1), '1')
-        data = self._catalog.getMetadataForUID('1')
-        self.assertEqual(data['title'], '1')
-        self._catalog.catalog_object(zdummy(2), '1', update_metadata=0)
-        data = self._catalog.getMetadataForUID('1')
-        self.assertEqual(data['title'], '1')
-        self._catalog.catalog_object(zdummy(2), '1', update_metadata=1)
-        data = self._catalog.getMetadataForUID('1')
-        self.assertEqual(data['title'], '2')
-        # update_metadata defaults to true, test that here
-        self._catalog.catalog_object(zdummy(1), '1')
-        data = self._catalog.getMetadataForUID('1')
-        self.assertEqual(data['title'], '1')
-
-    def testReindexIndexDoesntDoMetadata(self):
-        self.d['0'].num = 9999
-        self._catalog.reindexIndex('title', {})
-        data = self._catalog.getMetadataForUID('0')
-        self.assertEqual(data['title'], '0')
-
-    def testReindexIndexesFalse(self):
-        # setup
-        false_id = self.upper + 1
-        ob = zdummyFalse(false_id)
-        self.d[str(false_id)] = ob
-        self._catalog.catalog_object(ob, str(false_id))
-        # test, object evaluates to false; there was bug which caused the
-        # object to be removed from index
-        ob.num = 9999
-        self._catalog.reindexIndex('title', {})
-        result = self._catalog(title='9999')
-        self.assertEquals(1, len(result))
-
-    def testBooleanEvalOn_manage_catalogObject(self):
-        self.d['11'] = dummyLenFail(11, self.fail)
-        self.d['12'] = dummyNonzeroFail(12, self.fail)
-        # create a fake response that doesn't bomb on manage_catalogObject()
-        class myresponse:
-            def redirect(self, url):
-                pass
-        # this next call should not fail
-        self._catalog.manage_catalogObject(None, myresponse(),
-                                           'URL1', urls=('11', '12'))
-
-    def testBooleanEvalOn_refreshCatalog_getobject(self):
-        # wrap catalog under the fake parent providing unrestrictedTraverse()
-        catalog = self._catalog.__of__(fakeparent(self.d))
-        # replace entries to test refreshCatalog
-        self.d['0'] = dummyLenFail(0, self.fail)
-        self.d['1'] = dummyNonzeroFail(1, self.fail)
-        # this next call should not fail
-        catalog.refreshCatalog()
-
-        for uid in ('0', '1'):
-            rid = catalog.getrid(uid)
-            # neither should these
-            catalog.getobject(rid)
-
-    def test_getobject_traversal(self):
-        # getobject doesn't mask TraversalErrors and doesn't delegate to
-        # resolve_url
-        # wrap catalog under the fake parent providing unrestrictedTraverse()
-        catalog = self._catalog.__of__(fakeparent(self.d))
-        # make resolve_url fail if ZCatalog falls back on it
-        def resolve_url(path, REQUEST):
-            self.fail(".resolve_url() should not be called by .getobject()")
-        catalog.resolve_url = resolve_url
-
-        # traversal should work at first
-        rid0 = catalog.getrid('0')
-        # lets set it up so the traversal fails
-        del self.d['0']
-        self.assertRaises(FakeTraversalError,
-                          catalog.getobject, rid0, REQUEST=object())
-        # and if there is a None at the traversal point, that's where it
-        # should return
-        self.d['0'] = None
-        self.assertEquals(catalog.getobject(rid0), None)
-
-
 class dummy(ExtensionClass.Base):
 
     att1 = 'att1'
@@ -692,135 +508,11 @@
         self.assertEqual(merged_rids, expected)
 
 
-class PickySecurityManager:
-
-    def __init__(self, badnames=[]):
-        self.badnames = badnames
-
-    def validateValue(self, value):
-        return 1
-
-    def validate(self, accessed, container, name, value):
-        if name not in self.badnames:
-            return 1
-        raise Unauthorized(name)
-
-
-class TestZCatalogGetObject(unittest.TestCase):
-    # Test what objects are returned by brain.getObject()
-
-    def setUp(self):
-        from Products.ZCatalog.ZCatalog import ZCatalog
-        catalog = ZCatalog('catalog')
-        catalog.addIndex('id', 'FieldIndex')
-        root = Folder('')
-        root.getPhysicalRoot = lambda: root
-        self.root = root
-        self.root.catalog = catalog
-
-    def tearDown(self):
-        noSecurityManager()
-
-    def test_getObject_found(self):
-        # Check normal traversal
-        root = self.root
-        catalog = root.catalog
-        root.ob = Folder('ob')
-        catalog.catalog_object(root.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        self.assertEqual(brain.getPath(), '/ob')
-        self.assertEqual(brain.getObject().getId(), 'ob')
-
-    def test_getObject_missing_raises_NotFound(self):
-        # Check that if the object is missing we raise
-        from zExceptions import NotFound
-        root = self.root
-        catalog = root.catalog
-        root.ob = Folder('ob')
-        catalog.catalog_object(root.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        del root.ob
-        self.assertRaises((NotFound, AttributeError, KeyError),
-                          brain.getObject)
-
-    def test_getObject_restricted_raises_Unauthorized(self):
-        # Check that if the object's security does not allow traversal,
-        # None is returned
-        root = self.root
-        catalog = root.catalog
-        root.fold = Folder('fold')
-        root.fold.ob = Folder('ob')
-        catalog.catalog_object(root.fold.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        # allow all accesses
-        pickySecurityManager = PickySecurityManager()
-        setSecurityManager(pickySecurityManager)
-        self.assertEqual(brain.getObject().getId(), 'ob')
-        # disallow just 'ob' access
-        pickySecurityManager = PickySecurityManager(['ob'])
-        setSecurityManager(pickySecurityManager)
-        self.assertRaises(Unauthorized, brain.getObject)
-        # disallow just 'fold' access
-        pickySecurityManager = PickySecurityManager(['fold'])
-        setSecurityManager(pickySecurityManager)
-        ob = brain.getObject()
-        self.failIf(ob is None)
-        self.assertEqual(ob.getId(), 'ob')
-
-    # Now test _unrestrictedGetObject
-
-    def test_unrestrictedGetObject_found(self):
-        # Check normal traversal
-        root = self.root
-        catalog = root.catalog
-        root.ob = Folder('ob')
-        catalog.catalog_object(root.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        self.assertEqual(brain.getPath(), '/ob')
-        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
-
-    def test_unrestrictedGetObject_restricted(self):
-        # Check that if the object's security does not allow traversal,
-        # it's still is returned
-        root = self.root
-        catalog = root.catalog
-        root.fold = Folder('fold')
-        root.fold.ob = Folder('ob')
-        catalog.catalog_object(root.fold.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        # allow all accesses
-        pickySecurityManager = PickySecurityManager()
-        setSecurityManager(pickySecurityManager)
-        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
-        # disallow just 'ob' access
-        pickySecurityManager = PickySecurityManager(['ob'])
-        setSecurityManager(pickySecurityManager)
-        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
-        # disallow just 'fold' access
-        pickySecurityManager = PickySecurityManager(['fold'])
-        setSecurityManager(pickySecurityManager)
-        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
-
-    def test_unrestrictedGetObject_missing_raises_NotFound(self):
-        # Check that if the object is missing we raise
-        from zExceptions import NotFound
-        root = self.root
-        catalog = root.catalog
-        root.ob = Folder('ob')
-        catalog.catalog_object(root.ob)
-        brain = catalog.searchResults({'id': 'ob'})[0]
-        del root.ob
-        self.assertRaises((NotFound, AttributeError, KeyError),
-                          brain._unrestrictedGetObject)
-
-
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(TestAddDelColumn))
     suite.addTest(unittest.makeSuite(TestAddDelIndexes))
-    suite.addTest(unittest.makeSuite(TestZCatalog))
     suite.addTest(unittest.makeSuite(TestCatalogObject))
     suite.addTest(unittest.makeSuite(TestRS))
     suite.addTest(unittest.makeSuite(TestMerge))
-    suite.addTest(unittest.makeSuite(TestZCatalogGetObject))
     return suite

Copied: Zope/trunk/src/Products/ZCatalog/tests/test_zcatalog.py (from rev 115301, Zope/trunk/src/Products/ZCatalog/tests/test_catalog.py)
===================================================================
--- Zope/trunk/src/Products/ZCatalog/tests/test_zcatalog.py	                        (rev 0)
+++ Zope/trunk/src/Products/ZCatalog/tests/test_zcatalog.py	2010-08-01 11:59:56 UTC (rev 115316)
@@ -0,0 +1,357 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Foundation and Contributors.
+#
+# 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.
+#
+##############################################################################
+""" Unittests for Catalog.
+"""
+
+import unittest
+import Zope2
+Zope2.startup()
+
+from AccessControl.SecurityManagement import setSecurityManager
+from AccessControl.SecurityManagement import noSecurityManager
+from AccessControl import Unauthorized
+from Acquisition import Implicit
+import ExtensionClass
+import OFS.Application
+from OFS.Folder import Folder as OFS_Folder
+from ZODB.DB import DB
+from ZODB.DemoStorage import DemoStorage
+import transaction
+
+
+def createDatabase():
+    # Create a DemoStorage and put an Application in it
+    db = DB(DemoStorage())
+    conn = db.open()
+    root = conn.root()
+    app = OFS.Application.Application()
+    root['Application'] = app
+    transaction.commit()
+    return app
+
+app = createDatabase()
+
+
+class Folder(OFS_Folder):
+    def __init__(self, id):
+        self._setId(id)
+        OFS_Folder.__init__(self)
+
+
+class zdummy(ExtensionClass.Base):
+    def __init__(self, num):
+        self.num = num
+
+    def title(self):
+        return '%d' % self.num
+
+
+class zdummyFalse(zdummy):
+
+    def __nonzero__(self):
+        return False
+
+# make objects with failing __len__ and __nonzero__
+
+class dummyLenFail(zdummy):
+
+    def __init__(self, num, fail):
+        zdummy.__init__(self, num)
+        self.fail = fail
+
+    def __len__(self):
+        self.fail("__len__() was called")
+
+
+class dummyNonzeroFail(zdummy):
+    def __init__(self, num, fail):
+        zdummy.__init__(self, num)
+        self.fail = fail
+
+    def __nonzero__(self):
+        self.fail("__nonzero__() was called")
+
+
+class FakeTraversalError(KeyError):
+    """fake traversal exception for testing"""
+
+
+class fakeparent(Implicit):
+
+    # fake parent mapping unrestrictedTraverse to
+    # catalog.resolve_path as simulated by TestZCatalog
+
+    marker = object()
+
+    def __init__(self, d):
+        self.d = d
+
+    def unrestrictedTraverse(self, path, default=marker):
+        result = self.d.get(path, default)
+        if result is self.marker:
+            raise FakeTraversalError(path)
+        return result
+
+
+class TestZCatalog(unittest.TestCase):
+
+    def setUp(self):
+        from Products.ZCatalog.ZCatalog import ZCatalog
+        self._catalog = ZCatalog('Catalog')
+        self._catalog.resolve_path = self._resolve_num
+        self._catalog.addIndex('title', 'KeywordIndex')
+        self._catalog.addColumn('title')
+
+        self.upper = 10
+        self.d = {}
+        for x in range(0, self.upper):
+            # make uid a string of the number
+            ob = zdummy(x)
+            self.d[str(x)] = ob
+            self._catalog.catalog_object(ob, str(x))
+
+    def _resolve_num(self, num):
+        return self.d[num]
+
+    def test_interfaces(self):
+        from Products.ZCatalog.interfaces import IZCatalog
+        from Products.ZCatalog.ZCatalog import ZCatalog
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IZCatalog, ZCatalog)
+
+    def testGetMetadataForUID(self):
+        testNum = str(self.upper - 3) # as good as any..
+        data = self._catalog.getMetadataForUID(testNum)
+        self.assertEqual(data['title'], testNum)
+
+    def testGetIndexDataForUID(self):
+        testNum = str(self.upper - 3)
+        data = self._catalog.getIndexDataForUID(testNum)
+        self.assertEqual(data['title'][0], testNum)
+
+    def testSearch(self):
+        query = {'title': ['5', '6', '7']}
+        sr = self._catalog.searchResults(query)
+        self.assertEqual(len(sr), 3)
+        sr = self._catalog.search(query)
+        self.assertEqual(len(sr), 3)
+
+    def testUpdateMetadata(self):
+        self._catalog.catalog_object(zdummy(1), '1')
+        data = self._catalog.getMetadataForUID('1')
+        self.assertEqual(data['title'], '1')
+        self._catalog.catalog_object(zdummy(2), '1', update_metadata=0)
+        data = self._catalog.getMetadataForUID('1')
+        self.assertEqual(data['title'], '1')
+        self._catalog.catalog_object(zdummy(2), '1', update_metadata=1)
+        data = self._catalog.getMetadataForUID('1')
+        self.assertEqual(data['title'], '2')
+        # update_metadata defaults to true, test that here
+        self._catalog.catalog_object(zdummy(1), '1')
+        data = self._catalog.getMetadataForUID('1')
+        self.assertEqual(data['title'], '1')
+
+    def testReindexIndexDoesntDoMetadata(self):
+        self.d['0'].num = 9999
+        self._catalog.reindexIndex('title', {})
+        data = self._catalog.getMetadataForUID('0')
+        self.assertEqual(data['title'], '0')
+
+    def testReindexIndexesFalse(self):
+        # setup
+        false_id = self.upper + 1
+        ob = zdummyFalse(false_id)
+        self.d[str(false_id)] = ob
+        self._catalog.catalog_object(ob, str(false_id))
+        # test, object evaluates to false; there was bug which caused the
+        # object to be removed from index
+        ob.num = 9999
+        self._catalog.reindexIndex('title', {})
+        result = self._catalog(title='9999')
+        self.assertEquals(1, len(result))
+
+    def testBooleanEvalOn_manage_catalogObject(self):
+        self.d['11'] = dummyLenFail(11, self.fail)
+        self.d['12'] = dummyNonzeroFail(12, self.fail)
+        # create a fake response that doesn't bomb on manage_catalogObject()
+        class myresponse:
+            def redirect(self, url):
+                pass
+        # this next call should not fail
+        self._catalog.manage_catalogObject(None, myresponse(),
+                                           'URL1', urls=('11', '12'))
+
+    def testBooleanEvalOn_refreshCatalog_getobject(self):
+        # wrap catalog under the fake parent providing unrestrictedTraverse()
+        catalog = self._catalog.__of__(fakeparent(self.d))
+        # replace entries to test refreshCatalog
+        self.d['0'] = dummyLenFail(0, self.fail)
+        self.d['1'] = dummyNonzeroFail(1, self.fail)
+        # this next call should not fail
+        catalog.refreshCatalog()
+
+        for uid in ('0', '1'):
+            rid = catalog.getrid(uid)
+            # neither should these
+            catalog.getobject(rid)
+
+    def test_getobject_traversal(self):
+        # getobject doesn't mask TraversalErrors and doesn't delegate to
+        # resolve_url
+        # wrap catalog under the fake parent providing unrestrictedTraverse()
+        catalog = self._catalog.__of__(fakeparent(self.d))
+        # make resolve_url fail if ZCatalog falls back on it
+        def resolve_url(path, REQUEST):
+            self.fail(".resolve_url() should not be called by .getobject()")
+        catalog.resolve_url = resolve_url
+
+        # traversal should work at first
+        rid0 = catalog.getrid('0')
+        # lets set it up so the traversal fails
+        del self.d['0']
+        self.assertRaises(FakeTraversalError,
+                          catalog.getobject, rid0, REQUEST=object())
+        # and if there is a None at the traversal point, that's where it
+        # should return
+        self.d['0'] = None
+        self.assertEquals(catalog.getobject(rid0), None)
+
+
+class PickySecurityManager:
+
+    def __init__(self, badnames=[]):
+        self.badnames = badnames
+
+    def validateValue(self, value):
+        return 1
+
+    def validate(self, accessed, container, name, value):
+        if name not in self.badnames:
+            return 1
+        raise Unauthorized(name)
+
+
+class TestZCatalogGetObject(unittest.TestCase):
+    # Test what objects are returned by brain.getObject()
+
+    def setUp(self):
+        from Products.ZCatalog.ZCatalog import ZCatalog
+        catalog = ZCatalog('catalog')
+        catalog.addIndex('id', 'FieldIndex')
+        root = Folder('')
+        root.getPhysicalRoot = lambda: root
+        self.root = root
+        self.root.catalog = catalog
+
+    def tearDown(self):
+        noSecurityManager()
+
+    def test_getObject_found(self):
+        # Check normal traversal
+        root = self.root
+        catalog = root.catalog
+        root.ob = Folder('ob')
+        catalog.catalog_object(root.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        self.assertEqual(brain.getPath(), '/ob')
+        self.assertEqual(brain.getObject().getId(), 'ob')
+
+    def test_getObject_missing_raises_NotFound(self):
+        # Check that if the object is missing we raise
+        from zExceptions import NotFound
+        root = self.root
+        catalog = root.catalog
+        root.ob = Folder('ob')
+        catalog.catalog_object(root.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        del root.ob
+        self.assertRaises((NotFound, AttributeError, KeyError),
+                          brain.getObject)
+
+    def test_getObject_restricted_raises_Unauthorized(self):
+        # Check that if the object's security does not allow traversal,
+        # None is returned
+        root = self.root
+        catalog = root.catalog
+        root.fold = Folder('fold')
+        root.fold.ob = Folder('ob')
+        catalog.catalog_object(root.fold.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        # allow all accesses
+        pickySecurityManager = PickySecurityManager()
+        setSecurityManager(pickySecurityManager)
+        self.assertEqual(brain.getObject().getId(), 'ob')
+        # disallow just 'ob' access
+        pickySecurityManager = PickySecurityManager(['ob'])
+        setSecurityManager(pickySecurityManager)
+        self.assertRaises(Unauthorized, brain.getObject)
+        # disallow just 'fold' access
+        pickySecurityManager = PickySecurityManager(['fold'])
+        setSecurityManager(pickySecurityManager)
+        ob = brain.getObject()
+        self.failIf(ob is None)
+        self.assertEqual(ob.getId(), 'ob')
+
+    # Now test _unrestrictedGetObject
+
+    def test_unrestrictedGetObject_found(self):
+        # Check normal traversal
+        root = self.root
+        catalog = root.catalog
+        root.ob = Folder('ob')
+        catalog.catalog_object(root.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        self.assertEqual(brain.getPath(), '/ob')
+        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
+
+    def test_unrestrictedGetObject_restricted(self):
+        # Check that if the object's security does not allow traversal,
+        # it's still is returned
+        root = self.root
+        catalog = root.catalog
+        root.fold = Folder('fold')
+        root.fold.ob = Folder('ob')
+        catalog.catalog_object(root.fold.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        # allow all accesses
+        pickySecurityManager = PickySecurityManager()
+        setSecurityManager(pickySecurityManager)
+        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
+        # disallow just 'ob' access
+        pickySecurityManager = PickySecurityManager(['ob'])
+        setSecurityManager(pickySecurityManager)
+        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
+        # disallow just 'fold' access
+        pickySecurityManager = PickySecurityManager(['fold'])
+        setSecurityManager(pickySecurityManager)
+        self.assertEqual(brain._unrestrictedGetObject().getId(), 'ob')
+
+    def test_unrestrictedGetObject_missing_raises_NotFound(self):
+        # Check that if the object is missing we raise
+        from zExceptions import NotFound
+        root = self.root
+        catalog = root.catalog
+        root.ob = Folder('ob')
+        catalog.catalog_object(root.ob)
+        brain = catalog.searchResults({'id': 'ob'})[0]
+        del root.ob
+        self.assertRaises((NotFound, AttributeError, KeyError),
+                          brain._unrestrictedGetObject)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestZCatalog))
+    suite.addTest(unittest.makeSuite(TestZCatalogGetObject))
+    return suite



More information about the Zope-Checkins mailing list