Annotation of ExtFile/tests/testCopySupport.py, revision 1.1
1.1 ! dwinter 1: #
! 2: # Tests Zope's CopySupport
! 3: #
! 4:
! 5: import os, sys
! 6: if __name__ == '__main__':
! 7: execfile(os.path.join(sys.path[0], 'framework.py'))
! 8:
! 9: from Testing import ZopeTestCase
! 10:
! 11: from DateTime import DateTime
! 12: ZOPE274 = hasattr(DateTime, 'ISO8601')
! 13:
! 14: from Products.ExtFile import transaction
! 15:
! 16: from ExtensionClass import Base
! 17: from OFS.SimpleItem import SimpleItem
! 18: from OFS.Folder import Folder
! 19:
! 20: copymove_perms = ['Copy or Move', 'View management screens', 'Add Folders',
! 21: 'Add Documents, Images, and Files', 'Delete objects']
! 22:
! 23: # Load ZCML to get events configured
! 24: try:
! 25: import Products.Five
! 26: import OFS.subscribers
! 27: except ImportError:
! 28: pass
! 29: else:
! 30: from Products.Five import zcml
! 31: zcml.load_config('configure.zcml', Products.Five)
! 32:
! 33:
! 34: class HookCounter(Base):
! 35: '''Logs calls to old-school hooks'''
! 36: def __init__(self):
! 37: self.reset()
! 38: def reset(self):
! 39: self.count = 0
! 40: self.afterAdd = [0]
! 41: self.afterClone = [0]
! 42: self.beforeDelete = [0]
! 43: def manage_afterAdd(self, item, container):
! 44: self.count = self.count + 1
! 45: self.afterAdd.append(self.count)
! 46: def manage_afterClone(self, item):
! 47: self.count = self.count + 1
! 48: self.afterClone.append(self.count)
! 49: def manage_beforeDelete(self, item, container):
! 50: self.count = self.count + 1
! 51: self.beforeDelete.append(self.count)
! 52: def order(self):
! 53: return self.afterAdd[-1], self.afterClone[-1], self.beforeDelete[-1]
! 54:
! 55:
! 56: class TestItem(HookCounter, SimpleItem):
! 57: def __init__(self, id):
! 58: HookCounter.__init__(self)
! 59: self.id = id
! 60:
! 61:
! 62: class TestFolder(HookCounter, Folder):
! 63: def __init__(self, id):
! 64: HookCounter.__init__(self)
! 65: self.id = id
! 66: def _verifyObjectPaste(self, object, validate_src=1):
! 67: # Don't verify pastes
! 68: pass
! 69: def manage_afterAdd(self, item, container):
! 70: HookCounter.manage_afterAdd(self, item, container)
! 71: Folder.manage_afterAdd(self, item, container)
! 72: def manage_afterClone(self, item):
! 73: HookCounter.manage_afterClone(self, item)
! 74: Folder.manage_afterClone(self, item)
! 75: def manage_beforeDelete(self, item, container):
! 76: HookCounter.manage_beforeDelete(self, item, container)
! 77: Folder.manage_beforeDelete(self, item, container)
! 78:
! 79:
! 80: class RecursingFolder(TestFolder):
! 81: def manage_afterAdd(self, item, container):
! 82: TestFolder.manage_afterAdd(self, item, container)
! 83: self.__recurse('manage_afterAdd', item, container)
! 84: def manage_afterClone(self, item):
! 85: TestFolder.manage_afterClone(self, item)
! 86: self.__recurse('manage_afterClone', item)
! 87: def manage_beforeDelete(self, item, container):
! 88: self.__recurse('manage_beforeDelete', item, container)
! 89: TestFolder.manage_beforeDelete(self, item, container)
! 90: def __recurse(self, name, *args):
! 91: # Recurse like CMFCatalogAware
! 92: for ob in self.objectValues():
! 93: getattr(ob, name)(*args)
! 94:
! 95:
! 96: try:
! 97: from Products.Five.eventconfigure import setDeprecatedManageAddDelete
! 98: except ImportError:
! 99: pass
! 100: else:
! 101: setDeprecatedManageAddDelete(HookCounter)
! 102:
! 103:
! 104: class TestCopySupport(ZopeTestCase.ZopeTestCase):
! 105: '''Tests the order in which the add/clone/del hooks are called'''
! 106:
! 107: def afterSetUp(self):
! 108: # A folder that does not verify pastes
! 109: self.folder._setObject('folder', TestFolder('folder'))
! 110: self.folder = getattr(self.folder, 'folder')
! 111: # The subfolder we are going to copy/move to
! 112: self.folder._setObject('subfolder', TestFolder('subfolder'))
! 113: self.subfolder = self.folder['subfolder']
! 114: # The document we are going to copy/move
! 115: self.folder._setObject('mydoc', TestItem('mydoc'))
! 116: # Set some permissions
! 117: self.setPermissions(copymove_perms)
! 118: # Need _p_jars
! 119: transaction.savepoint(1)
! 120: # Reset counters
! 121: self.folder.mydoc.reset()
! 122:
! 123: def test_1_Clone(self):
! 124: # Test clone
! 125: self.subfolder.manage_clone(self.folder.mydoc, 'yourdoc')
! 126: self.assertEqual(self.subfolder.yourdoc.order(), (1, 2, 0)) # add, clone
! 127:
! 128: def test_2_CopyPaste(self):
! 129: # Test copy/paste
! 130: cb = self.folder.manage_copyObjects(['mydoc'])
! 131: self.subfolder.manage_pasteObjects(cb)
! 132: self.assertEqual(self.subfolder.mydoc.order(), (1, 2, 0)) # add, clone
! 133:
! 134: def test_3_CutPaste(self):
! 135: # Test cut/paste
! 136: cb = self.folder.manage_cutObjects(['mydoc'])
! 137: self.subfolder.manage_pasteObjects(cb)
! 138: self.assertEqual(self.subfolder.mydoc.order(), (2, 0, 1)) # del, add
! 139:
! 140: def test_4_Rename(self):
! 141: # Test rename
! 142: self.folder.manage_renameObject('mydoc', 'yourdoc')
! 143: self.assertEqual(self.folder.yourdoc.order(), (2, 0, 1)) # del, add
! 144:
! 145: def test_5_COPY(self):
! 146: # Test webdav COPY
! 147: req = self.app.REQUEST
! 148: req.environ['HTTP_DEPTH'] = 'infinity'
! 149: req.environ['HTTP_DESTINATION'] = '%s/subfolder/mydoc' % self.folder.absolute_url()
! 150: self.folder.mydoc.COPY(req, req.RESPONSE)
! 151: if ZOPE274:
! 152: self.assertEqual(self.subfolder.mydoc.order(), (1, 2, 0)) # add, clone
! 153: else:
! 154: self.assertEqual(self.subfolder.mydoc.order(), (2, 1, 0)) # clone, add
! 155:
! 156: def test_6_MOVE(self):
! 157: # Test webdav MOVE
! 158: req = self.app.REQUEST
! 159: req.environ['HTTP_DEPTH'] = 'infinity'
! 160: req.environ['HTTP_DESTINATION'] = '%s/subfolder/mydoc' % self.folder.absolute_url()
! 161: old = self.folder.mydoc
! 162: self.folder.mydoc.MOVE(req, req.RESPONSE)
! 163: self.assertEqual(old.order(), (0, 0, 1)) # del
! 164: self.assertEqual(self.subfolder.mydoc.order(), (1, 0, 0)) # add
! 165:
! 166: def test_7_DELETE(self):
! 167: # Test webdav DELETE
! 168: req = self.app.REQUEST
! 169: req['URL'] = '%s/mydoc' % self.folder.absolute_url()
! 170: olddoc = self.folder.mydoc
! 171: self.folder.mydoc.DELETE(req, req.RESPONSE)
! 172: self.assertEqual(olddoc.order(), (0, 0, 1)) # del
! 173:
! 174:
! 175: class TestCopySupportSublocation(ZopeTestCase.ZopeTestCase):
! 176: '''Tests the order in which the add/clone/del hooks are called'''
! 177:
! 178: def afterSetUp(self):
! 179: # A folder that does not verify pastes
! 180: self.folder._setObject('folder', TestFolder('folder'))
! 181: self.folder = getattr(self.folder, 'folder')
! 182: # The subfolder we are going to copy/move to
! 183: self.folder._setObject('subfolder', TestFolder('subfolder'))
! 184: self.subfolder = self.folder['subfolder']
! 185: # The folder we are going to copy/move
! 186: self.folder._setObject('myfolder', TestFolder('myfolder'))
! 187: self.myfolder = self.folder['myfolder']
! 188: # The "sublocation" inside our folder we are going to watch
! 189: self.myfolder._setObject('mydoc', TestItem('mydoc'))
! 190: # Set some permissions
! 191: self.setPermissions(copymove_perms)
! 192: # Need _p_jars
! 193: transaction.savepoint(1)
! 194: # Reset counters
! 195: self.myfolder.reset()
! 196: self.myfolder.mydoc.reset()
! 197:
! 198: def test_1_Clone(self):
! 199: # Test clone
! 200: self.subfolder.manage_clone(self.folder.myfolder, 'yourfolder')
! 201: self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0)) # add, clone
! 202: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 2, 0)) # add, clone
! 203:
! 204: def test_2_CopyPaste(self):
! 205: # Test copy/paste
! 206: cb = self.folder.manage_copyObjects(['myfolder'])
! 207: self.subfolder.manage_pasteObjects(cb)
! 208: self.assertEqual(self.subfolder.myfolder.order(), (1, 2, 0)) # add, clone
! 209: self.assertEqual(self.subfolder.myfolder.mydoc.order(), (1, 2, 0)) # add, clone
! 210:
! 211: def test_3_CutPaste(self):
! 212: # Test cut/paste
! 213: cb = self.folder.manage_cutObjects(['myfolder'])
! 214: self.subfolder.manage_pasteObjects(cb)
! 215: self.assertEqual(self.subfolder.myfolder.order(), (2, 0, 1)) # del, add
! 216: self.assertEqual(self.subfolder.myfolder.mydoc.order(), (2, 0, 1)) # del, add
! 217:
! 218: def test_4_Rename(self):
! 219: # Test rename
! 220: self.folder.manage_renameObject('myfolder', 'yourfolder')
! 221: self.assertEqual(self.folder.yourfolder.order(), (2, 0, 1)) # del, add
! 222: self.assertEqual(self.folder.yourfolder.mydoc.order(), (2, 0, 1)) # del, add
! 223:
! 224: def test_5_COPY(self):
! 225: # Test webdav COPY
! 226: req = self.app.REQUEST
! 227: req.environ['HTTP_DEPTH'] = 'infinity'
! 228: req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
! 229: self.folder.myfolder.COPY(req, req.RESPONSE)
! 230: if ZOPE274:
! 231: self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0)) # add, clone
! 232: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 2, 0)) # add, clone
! 233: else:
! 234: self.assertEqual(self.subfolder.yourfolder.order(), (2, 1, 0)) # clone, add
! 235: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (2, 1, 0)) # clone, add
! 236:
! 237: def test_6_MOVE(self):
! 238: # Test webdav MOVE
! 239: req = self.app.REQUEST
! 240: req.environ['HTTP_DEPTH'] = 'infinity'
! 241: req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
! 242: oldfolder = self.folder.myfolder
! 243: olddoc = self.folder.myfolder.mydoc
! 244: self.folder.myfolder.MOVE(req, req.RESPONSE)
! 245: self.assertEqual(oldfolder.order(), (0, 0, 1)) # del
! 246: self.assertEqual(self.subfolder.yourfolder.order(), (1, 0, 0)) # add
! 247: self.assertEqual(olddoc.order(), (0, 0, 1)) # del
! 248: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (1, 0, 0)) # add
! 249:
! 250: def test_7_DELETE(self):
! 251: # Test webdav DELETE
! 252: req = self.app.REQUEST
! 253: req['URL'] = '%s/myfolder' % self.folder.absolute_url()
! 254: oldfolder = self.folder.myfolder
! 255: olddoc = self.folder.myfolder.mydoc
! 256: self.folder.myfolder.DELETE(req, req.RESPONSE)
! 257: self.assertEqual(oldfolder.order(), (0, 0, 1)) # del
! 258: self.assertEqual(olddoc.order(), (0, 0, 1)) # del
! 259:
! 260:
! 261: class TestCopySupportSublocationWithRecurse(ZopeTestCase.ZopeTestCase):
! 262: '''Tests the order in which the add/clone/del hooks are called'''
! 263:
! 264: def afterSetUp(self):
! 265: # A folder that does not verify pastes
! 266: self.folder._setObject('folder', TestFolder('folder'))
! 267: self.folder = getattr(self.folder, 'folder')
! 268: # The subfolder we are going to copy/move to
! 269: self.folder._setObject('subfolder', TestFolder('subfolder'))
! 270: self.subfolder = self.folder['subfolder']
! 271: # The folder we are going to copy/move
! 272: self.folder._setObject('myfolder', RecursingFolder('myfolder'))
! 273: self.myfolder = self.folder['myfolder']
! 274: # The "sublocation" inside our folder we are going to watch
! 275: self.myfolder._setObject('mydoc', TestItem('mydoc'))
! 276: # Set some permissions
! 277: self.setPermissions(copymove_perms)
! 278: # Need _p_jars
! 279: transaction.savepoint(1)
! 280: # Reset counters
! 281: self.myfolder.reset()
! 282: self.myfolder.mydoc.reset()
! 283:
! 284: def test_1_Clone(self):
! 285: # Test clone
! 286: self.subfolder.manage_clone(self.folder.myfolder, 'yourfolder')
! 287: self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0)) # add, clone
! 288: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (2, 4, 0)) # add, clone
! 289: self.assertEqual(self.subfolder.yourfolder.mydoc.afterAdd, [0, 1, 2])
! 290: self.assertEqual(self.subfolder.yourfolder.mydoc.afterClone, [0, 3, 4])
! 291:
! 292: def test_2_CopyPaste(self):
! 293: # Test copy/paste
! 294: cb = self.folder.manage_copyObjects(['myfolder'])
! 295: self.subfolder.manage_pasteObjects(cb)
! 296: self.assertEqual(self.subfolder.myfolder.order(), (1, 2, 0)) # add, clone
! 297: self.assertEqual(self.subfolder.myfolder.mydoc.order(), (2, 4, 0)) # add, clone
! 298:
! 299: def test_3_CutPaste(self):
! 300: # Test cut/paste
! 301: cb = self.folder.manage_cutObjects(['myfolder'])
! 302: self.subfolder.manage_pasteObjects(cb)
! 303: self.assertEqual(self.subfolder.myfolder.order(), (2, 0, 1)) # del, add
! 304: self.assertEqual(self.subfolder.myfolder.mydoc.order(), (4, 0, 2)) # del, add
! 305:
! 306: def test_4_Rename(self):
! 307: # Test rename
! 308: self.folder.manage_renameObject('myfolder', 'yourfolder')
! 309: self.assertEqual(self.folder.yourfolder.order(), (2, 0, 1)) # del, add
! 310: self.assertEqual(self.folder.yourfolder.mydoc.order(), (4, 0, 2)) # del, add
! 311:
! 312: def test_5_COPY(self):
! 313: # Test webdav COPY
! 314: req = self.app.REQUEST
! 315: req.environ['HTTP_DEPTH'] = 'infinity'
! 316: req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
! 317: self.folder.myfolder.COPY(req, req.RESPONSE)
! 318: if ZOPE274:
! 319: self.assertEqual(self.subfolder.yourfolder.order(), (1, 2, 0)) # add, clone
! 320: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (2, 4, 0)) # add, clone
! 321: self.assertEqual(self.subfolder.yourfolder.mydoc.afterAdd, [0, 1, 2])
! 322: self.assertEqual(self.subfolder.yourfolder.mydoc.afterClone, [0, 3, 4])
! 323: else:
! 324: self.assertEqual(self.subfolder.yourfolder.order(), (2, 1, 0)) # clone, add
! 325: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (4, 2, 0)) # clone, add
! 326:
! 327: def test_6_MOVE(self):
! 328: # Test webdav MOVE
! 329: req = self.app.REQUEST
! 330: req.environ['HTTP_DEPTH'] = 'infinity'
! 331: req.environ['HTTP_DESTINATION'] = '%s/subfolder/yourfolder' % self.folder.absolute_url()
! 332: oldfolder = self.folder.myfolder
! 333: olddoc = self.folder.myfolder.mydoc
! 334: self.folder.myfolder.MOVE(req, req.RESPONSE)
! 335: self.assertEqual(oldfolder.order(), (0, 0, 1)) # del
! 336: self.assertEqual(self.subfolder.yourfolder.order(), (1, 0, 0)) # add
! 337: self.assertEqual(olddoc.order(), (0, 0, 2)) # del
! 338: self.assertEqual(self.subfolder.yourfolder.mydoc.order(), (2, 0, 0)) # add
! 339:
! 340: def test_7_DELETE(self):
! 341: # Test webdav DELETE
! 342: req = self.app.REQUEST
! 343: req['URL'] = '%s/myfolder' % self.folder.absolute_url()
! 344: oldfolder = self.folder.myfolder
! 345: olddoc = self.folder.myfolder.mydoc
! 346: self.folder.myfolder.DELETE(req, req.RESPONSE)
! 347: self.assertEqual(oldfolder.order(), (0, 0, 1)) # del
! 348: self.assertEqual(olddoc.order(), (0, 0, 2)) # del
! 349:
! 350:
! 351: def test_suite():
! 352: from unittest import TestSuite, makeSuite
! 353: suite = TestSuite()
! 354: suite.addTest(makeSuite(TestCopySupport))
! 355: suite.addTest(makeSuite(TestCopySupportSublocation))
! 356: suite.addTest(makeSuite(TestCopySupportSublocationWithRecurse))
! 357: return suite
! 358:
! 359: if __name__ == '__main__':
! 360: framework()
! 361:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>