Annotation of ExtFile/tests/testCopySupport.py, revision 1.1.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>