[Zope-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 Zope-Checkins
mailing list