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>