[Checkins] SVN: Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py Added tests to go with http://www.zope.org/Collectors/Zope/2169

Stefan H. Holek stefan at epy.co.at
Mon Aug 21 08:27:34 EDT 2006


Log message for revision 69717:
  Added tests to go with http://www.zope.org/Collectors/Zope/2169
  

Changed:
  A   Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py

-=-
Added: Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py	2006-08-21 11:59:41 UTC (rev 69716)
+++ Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py	2006-08-21 12:27:33 UTC (rev 69717)
@@ -0,0 +1,244 @@
+import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
+import transaction
+
+from Testing.makerequest import makerequest
+
+from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.SecurityManagement import noSecurityManager
+
+from OFS.SimpleItem import SimpleItem
+from OFS.Folder import Folder
+
+
+class HookCounter:
+    '''Logs calls to old-school hooks'''
+
+    def __init__(self):
+        self.reset()
+
+    def reset(self):
+        self.count = 0
+        self.afterAdd = [0]
+        self.afterClone = [0]
+        self.beforeDelete = [0]
+
+    def manage_afterAdd(self, item, container):
+        self.count = self.count + 1
+        self.afterAdd.append(self.count)
+
+    def manage_afterClone(self, item):
+        self.count = self.count + 1
+        self.afterClone.append(self.count)
+
+    def manage_beforeDelete(self, item, container):
+        self.count = self.count + 1
+        self.beforeDelete.append(self.count)
+
+    def order(self):
+        return self.afterAdd[-1], self.afterClone[-1], self.beforeDelete[-1]
+
+
+class TestItem(HookCounter, SimpleItem):
+
+    def __init__(self, id):
+        HookCounter.__init__(self)
+        self.id = id
+
+
+class TestFolder(HookCounter, Folder):
+
+    def __init__(self, id):
+        HookCounter.__init__(self)
+        self.id = id
+
+    def _verifyObjectPaste(self, object, validate_src=1):
+        # Don't verify pastes as our test objects don't have
+        # factory methods registered.
+        pass
+
+    def manage_afterAdd(self, item, container):
+        HookCounter.manage_afterAdd(self, item, container)
+        Folder.manage_afterAdd(self, item, container)
+
+    def manage_afterClone(self, item):
+        HookCounter.manage_afterClone(self, item)
+        Folder.manage_afterClone(self, item)
+
+    def manage_beforeDelete(self, item, container):
+        HookCounter.manage_beforeDelete(self, item, container)
+        Folder.manage_beforeDelete(self, item, container)
+
+
+try:
+    from Products.Five.eventconfigure import setDeprecatedManageAddDelete
+    setDeprecatedManageAddDelete(HookCounter)
+except ImportError:
+    pass
+
+
+class HookTest(unittest.TestCase):
+
+    def setUp(self):
+        self.app = makerequest(Zope2.app())
+        try:
+            uf = self.app.acl_users
+            uf._doAddUser('manager', 'secret', ['Manager'], [])
+            user = uf.getUserById('manager').__of__(uf)
+            newSecurityManager(None, user)
+        except:
+            self.tearDown()
+            raise
+
+    def tearDown(self):
+        noSecurityManager()
+        transaction.abort()
+        self.app._p_jar.close()
+
+
+class TestCopySupport(HookTest):
+    '''Tests the order in which the add/clone/del hooks are called'''
+
+    def setUp(self):
+        HookTest.setUp(self)
+        # A folder
+        self.app._setObject('folder', TestFolder('folder'))
+        self.folder = self.app['folder']
+        # A subfolder we are going to copy/move to
+        self.folder._setObject('subfolder', TestFolder('subfolder'))
+        self.subfolder = self.folder['subfolder']
+        # A document we are going to copy/move
+        self.folder._setObject('mydoc', TestItem('mydoc'))
+        # Must have _p_jars
+        transaction.savepoint(1)
+        # Reset counters
+        self.folder.mydoc.reset()
+
+    def test_1_Clone(self):
+        # Test clone
+        self.subfolder.manage_clone(self.folder.mydoc, 'yourdoc')
+        self.assertEqual(self.subfolder.yourdoc.order(), (1, 2, 0)) # add, clone
+
+    def test_2_CopyPaste(self):
+        # Test copy/paste
+        cb = self.folder.manage_copyObjects(['mydoc'])
+        self.subfolder.manage_pasteObjects(cb)
+        self.assertEqual(self.subfolder.mydoc.order(), (1, 2, 0))   # add, clone
+
+    def test_3_CutPaste(self):
+        # Test cut/paste
+        cb = self.folder.manage_cutObjects(['mydoc'])
+        self.subfolder.manage_pasteObjects(cb)
+        self.assertEqual(self.subfolder.mydoc.order(), (2, 0, 1))   # del, add
+
+    def test_4_Rename(self):
+        # Test rename
+        self.folder.manage_renameObject('mydoc', 'yourdoc')
+        self.assertEqual(self.folder.yourdoc.order(), (2, 0, 1))    # del, add
+
+    def test_5_COPY(self):
+        # Test webdav COPY
+        req = self.app.REQUEST
+        req.environ['HTTP_DEPTH'] = 'infinity'
+        req.environ['HTTP_DESTINATION'] = '%s/subfolder/mydoc' % self.folder.absolute_url()
+        self.folder.mydoc.COPY(req, req.RESPONSE)
+        self.assertEqual(req.RESPONSE.getStatus(), 201)
+        self.assertEqual(self.subfolder.mydoc.order(), (1, 2, 0))   # add, clone
+
+    def test_6_MOVE(self):
+        # Test webdav MOVE
+        req = self.app.REQUEST
+        req.environ['HTTP_DEPTH'] = 'infinity'
+        req.environ['HTTP_DESTINATION'] = '%s/subfolder/mydoc' % self.folder.absolute_url()
+        old = self.folder.mydoc
+        self.folder.mydoc.MOVE(req, req.RESPONSE)
+        self.assertEqual(req.RESPONSE.getStatus(), 201)
+        self.assertEqual(old.order(), (0, 0, 1))                    # del
+        self.assertEqual(self.subfolder.mydoc.order(), (1, 0, 0))   # add
+
+
+class TestCopySupportSublocation(HookTest):
+    '''Tests the order in which the add/clone/del hooks are called'''
+
+    def setUp(self):
+        HookTest.setUp(self)
+        # A folder
+        self.app._setObject('folder', TestFolder('folder'))
+        self.folder = self.app['folder']
+        # A subfolder we are going to copy/move to
+        self.folder._setObject('subfolder', TestFolder('subfolder'))
+        self.subfolder = self.folder['subfolder']
+        # A folderish object we are going to copy/move
+        self.folder._setObject('myfolder', TestFolder('myfolder'))
+        self.myfolder = self.folder['myfolder']
+        # A "sublocation" inside myfolder we are going to watch
+        self.myfolder._setObject('mydoc', TestItem('mydoc'))
+        # Must have _p_jars
+        transaction.savepoint(1)
+        # Reset counters
+        self.myfolder.reset()
+        self.myfolder.mydoc.reset()
+
+    def test_1_Clone(self):
+        # Test clone
+        self.subfolder.manage_clone(self.folder.myfolder, 'yourfolder')
+        self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0))          # add, clone
+        self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 2, 0))    # add, clone
+
+    def test_2_CopyPaste(self):
+        # Test copy/paste
+        cb = self.folder.manage_copyObjects(['myfolder'])
+        self.subfolder.manage_pasteObjects(cb)
+        self.assertEqual(self.subfolder.myfolder.order(), (1, 2, 0))            # add, clone
+        self.assertEqual(self.subfolder.myfolder.mydoc.order(), (1, 2, 0))      # add, clone
+
+    def test_3_CutPaste(self):
+        # Test cut/paste
+        cb = self.folder.manage_cutObjects(['myfolder'])
+        self.subfolder.manage_pasteObjects(cb)
+        self.assertEqual(self.subfolder.myfolder.order(), (2, 0, 1))            # del, add
+        self.assertEqual(self.subfolder.myfolder.mydoc.order(), (2, 0, 1))      # del, add
+
+    def test_4_Rename(self):
+        # Test rename
+        self.folder.manage_renameObject('myfolder', 'yourfolder')
+        self.assertEqual(self.folder.yourfolder.order(), (2, 0, 1))             # del, add
+        self.assertEqual(self.folder.yourfolder.mydoc.order(), (2, 0, 1))       # del, add
+
+    def test_5_COPY(self):
+        # Test webdav COPY
+        req = self.app.REQUEST
+        req.environ['HTTP_DEPTH'] = 'infinity'
+        req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
+        self.folder.myfolder.COPY(req, req.RESPONSE)
+        self.assertEqual(req.RESPONSE.getStatus(), 201)
+        self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0))          # add, clone
+        self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 2, 0))    # add, clone
+
+    def test_6_MOVE(self):
+        # Test webdav MOVE
+        req = self.app.REQUEST
+        req.environ['HTTP_DEPTH'] = 'infinity'
+        req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
+        oldfolder = self.folder.myfolder
+        olddoc = self.folder.myfolder.mydoc
+        self.folder.myfolder.MOVE(req, req.RESPONSE)
+        self.assertEqual(req.RESPONSE.getStatus(), 201)
+        self.assertEqual(oldfolder.order(), (0, 0, 1))                          # del
+        self.assertEqual(self.subfolder.yourfolder.order(), (1, 0, 0))          # add
+        self.assertEqual(olddoc.order(), (0, 0, 1))                             # del
+        self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 0, 0))    # add
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestCopySupport))
+    suite.addTest(unittest.makeSuite(TestCopySupportSublocation))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: Zope/branches/Zope-2_8-branch/lib/python/OFS/tests/testCopySupportHooks.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list