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>