Annotation of ExtFile/tests/testExtImage.py, revision 1.1.1.1
1.1 dwinter 1: #
2: # Tests the ExtFile product
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: ZopeTestCase.installProduct('ExtFile')
12: ZopeTestCase.installProduct('PythonScripts')
13: ZopeTestCase.utils.startZServer(4)
14:
15: from Products.ExtFile.tests.ExtFileTestCase import ExtFileTestCase
16: from Products.ExtFile.tests.ExtFileTestCase import gifImage, jpegImage, tiffImage, notImage
17: from Products.ExtFile.tests.ExtFileTestCase import makeFileUpload
18: from Products.ExtFile.tests.ExtFileTestCase import copymove_perms
19: from Products.ExtFile import transaction
20: from Products.ExtFile import ExtFile, ExtImage, Config
21: from Products.ExtFile.ExtImage import UPLOAD_RESIZE
22:
23:
24: class TestExtFileAdd(ExtFileTestCase):
25: '''Test ExtFile creation'''
26:
27: def testAddFileFromFileName(self):
28: # Add File from file name
29: self.addExtFile(id='file', file=notImage)
30: self.file._finish()
31: self.failUnless(self._exists('file.exe'))
32: self.assertEqual(self.file.get_size(), self._fsize(notImage))
33:
34: def testAddFileFromFileHandle(self):
35: # Add File from file handle
36: self.addExtFile(id='file', file=open(notImage, 'rb'))
37: self.file._finish()
38: self.failUnless(self._exists('file.exe'))
39: self.assertEqual(self.file.get_size(), self._fsize(notImage))
40:
41: def testAddFileFromFileUpload(self):
42: # Add File from file upload
43: self.addExtFile(id='file', file=makeFileUpload(notImage, 'application/octet-stream'))
44: self.file._finish()
45: self.failUnless(self._exists('file.exe'))
46: self.assertEqual(self.file.get_size(), self._fsize(notImage))
47:
48: def testAddFileWithIdFromFilename(self):
49: # Add File without id - should use filename instead
50: self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='foo'))
51: self.file._finish()
52: self.assertEqual(self.file.getId(), 'foo')
53: self.failUnless(self._exists('foo.exe'))
54: self.assertEqual(self.file.get_size(), self._fsize(notImage))
55:
56: def testAddFileWithLatin1Filename(self):
57: # Add File without id - should use filename instead
58: self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='M\xe4dchen'))
59: self.file._finish()
60: self.assertEqual(self.file.getId(), 'Madchen')
61: self.failUnless(self._exists('Madchen.exe'))
62: self.assertEqual(self.file.get_size(), self._fsize(notImage))
63:
64: def testAddFileWithUTF8Filename(self):
65: # Add File without id - should use filename instead
66: self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='M\303\244dchen'))
67: self.file._finish()
68: self.assertEqual(self.file.getId(), 'Madchen')
69: self.failUnless(self._exists('Madchen.exe'))
70: self.assertEqual(self.file.get_size(), self._fsize(notImage))
71:
72:
73: class TestExtImageAdd(ExtFileTestCase):
74: '''Test ExtImage creation'''
75:
76: def testAddImageFromName(self):
77: # Add Image from file name
78: self.addExtImage(id='image', file=gifImage)
79: self.image._finish()
80: self.failUnless(self._exists('image.gif'))
81: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
82:
83: def testAddImageFromFileHandle(self):
84: # Add Image from file handle
85: self.addExtImage(id='image', file=open(gifImage, 'rb'))
86: self.image._finish()
87: self.failUnless(self._exists('image.gif'))
88: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
89:
90: def testAddImageFromFileUpload(self):
91: # Add Image from file upload
92: self.addExtImage(id='image', file=makeFileUpload(gifImage, 'image/gif'))
93: self.image._finish()
94: self.failUnless(self._exists('image.gif'))
95: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
96:
97: def testAddImageWithIdFromFilename(self):
98: # Add File without id - should use filename instead
99: self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='foo'))
100: self.image._finish()
101: self.assertEqual(self.image.getId(), 'foo')
102: self.failUnless(self._exists('foo.gif'))
103: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
104:
105: def testAddUnwrappedImage(self):
106: # This is what Photo does with displays...
107: file = ExtImage.ExtImage('foo')
108: self.assertRaises(AttributeError,
109: file.manage_file_upload, file=gifImage)
110:
111: def testAddImageWithLatin1Filename(self):
112: # Add File without id - should use filename instead
113: self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='M\xe4dchen'))
114: self.image._finish()
115: self.assertEqual(self.image.getId(), 'Madchen')
116: self.failUnless(self._exists('Madchen.gif'))
117: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
118:
119: def testAddImageWithUTF8Filename(self):
120: # Add File without id - should use filename instead
121: self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='M\303\244dchen'))
122: self.image._finish()
123: self.assertEqual(self.image.getId(), 'Madchen')
124: self.failUnless(self._exists('Madchen.gif'))
125: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
126:
127:
128: class TestExtFileUpload(ExtFileTestCase):
129: '''Test ExtFile upload'''
130:
131: def testManageFileUploadFromFileName(self):
132: # Upload File from file name
133: self.addExtFile(id='file', file='')
134: self.file.manage_file_upload(file=notImage)
135: self.file._finish()
136: self.failUnless(self._exists('file.exe'))
137: self.assertEqual(self.file.get_size(), self._fsize(notImage))
138:
139: def testManageFileUploadFromFileHandle(self):
140: # Upload File from file handle
141: self.addExtFile(id='file', file='')
142: self.file.manage_file_upload(file=open(notImage, 'rb'))
143: self.file._finish()
144: self.failUnless(self._exists('file.exe'))
145: self.assertEqual(self.file.get_size(), self._fsize(notImage))
146:
147: def testManageFileUploadFromFileUpload(self):
148: # Upload File from file upload
149: self.addExtFile(id='file', file='')
150: self.file.manage_file_upload(file=makeFileUpload(notImage, 'application/octet-stream'))
151: self.file._finish()
152: self.failUnless(self._exists('file.exe'))
153: self.assertEqual(self.file.get_size(), self._fsize(notImage))
154:
155: def testManageUploadFromStringBuffer(self):
156: # Upload File from file name
157: self.addExtFile(id='file', file='')
158: self.file.manage_upload(file=open(notImage, 'rb').read())
159: self.file._finish()
160: self.failUnless(self._exists('file.exe'))
161: self.assertEqual(self.file.get_size(), self._fsize(notImage))
162:
163: def testManageUploadFromFileHandle(self):
164: # Upload File from file handle
165: self.addExtFile(id='file', file='')
166: self.file.manage_upload(file=open(notImage, 'rb'))
167: self.file._finish()
168: self.failUnless(self._exists('file.exe'))
169: self.assertEqual(self.file.get_size(), self._fsize(notImage))
170:
171: def testManageUploadFromFileUpload(self):
172: # Upload File from file upload
173: self.addExtFile(id='file', file='')
174: self.file.manage_upload(file=makeFileUpload(notImage, 'application/octet-stream'))
175: self.file._finish()
176: self.failUnless(self._exists('file.exe'))
177: self.assertEqual(self.file.get_size(), self._fsize(notImage))
178:
179:
180: class TestExtImageUpload(ExtFileTestCase):
181: '''Test ExtImage upload'''
182:
183: def testManageFileUploadFromFileName(self):
184: # Upload Image from file name
185: self.addExtImage(id='image', file='')
186: self.image.manage_file_upload(file=gifImage)
187: self.image._finish()
188: self.failUnless(self._exists('image.gif'))
189: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
190:
191: def testManageFileUploadFromFileHandle(self):
192: # Upload Image from file handle
193: self.addExtImage(id='image', file='')
194: self.image.manage_file_upload(file=open(gifImage, 'rb'))
195: self.image._finish()
196: self.failUnless(self._exists('image.gif'))
197: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
198:
199: def testManageFileUploadFromFileUpload(self):
200: # Upload Image from file upload
201: self.addExtImage(id='image', file='')
202: self.image.manage_file_upload(file=makeFileUpload(gifImage, 'image/gif'))
203: self.image._finish()
204: self.failUnless(self._exists('image.gif'))
205: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
206:
207: def testManageUploadFromStringBuffer(self):
208: # Upload Image from file name
209: self.addExtImage(id='image', file='')
210: self.image.manage_upload(file=open(gifImage, 'rb').read())
211: self.image._finish()
212: self.failUnless(self._exists('image.gif'))
213: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
214:
215: def testManageUploadFromFileHandle(self):
216: # Upload Image from file handle
217: self.addExtImage(id='image', file='')
218: self.image.manage_upload(file=open(gifImage, 'rb'))
219: self.image._finish()
220: self.failUnless(self._exists('image.gif'))
221: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
222:
223: def testManageUploadFromFileUpload(self):
224: # Upload Image from file upload
225: self.addExtImage(id='image', file='')
226: self.image.manage_upload(file=makeFileUpload(gifImage, 'image/gif'))
227: self.image._finish()
228: self.failUnless(self._exists('image.gif'))
229: self.assertEqual(self.image.get_size(), self._fsize(gifImage))
230:
231:
232: class TestExtFileContentType(ExtFileTestCase):
233: '''Test ExtFile content-type detection'''
234:
235: def testDefaultContentType(self):
236: # Use default content type
237: self.addExtFile(id='file', file=notImage)
238: self.file._finish()
239: self.assertEqual(self.file.content_type, 'application/octet-stream')
240: self.failUnless(self._exists('file.exe'))
241:
242: def testContentTypeExplicit(self):
243: # Use passed-in content type
244: self.addExtFile(id='file', file=notImage, content_type='image/jpeg')
245: self.file._finish()
246: self.assertEqual(self.file.content_type, 'image/jpeg')
247: self.failUnless(self._exists('file.jpg'))
248:
249: def testContentTypeFromId(self):
250: # Detect GIF content type from file id
251: self.addExtFile(id='file.gif', file=notImage)
252: self.file._finish()
253: self.assertEqual(self.file.content_type, 'image/gif')
254: self.failUnless(self._exists('file.gif'))
255:
256: def testContentTypeFromIdExplicit(self):
257: # Passed-in content type trumps detection by id
258: self.addExtFile(id='file.gif', file=notImage, content_type='image/jpeg')
259: self.file._finish()
260: self.assertEqual(self.file.content_type, 'image/jpeg')
261: self.failUnless(self._exists('file.jpg'))
262:
263: def testContentTypeFromHeaders(self):
264: # Detect GIF content type from file upload headers
265: self.addExtFile(id='file', file=makeFileUpload(notImage, 'image/gif'))
266: self.file._finish()
267: self.assertEqual(self.file.content_type, 'image/gif')
268: self.failUnless(self._exists('file.gif'))
269:
270: def testContentTypeFromHeadersExplicit(self):
271: # Passed-in content type trumps detection by headers
272: self.addExtFile(id='file', file=makeFileUpload(notImage, 'image/gif'), content_type='image/jpeg')
273: self.file._finish()
274: self.assertEqual(self.file.content_type, 'image/jpeg')
275: self.failUnless(self._exists('file.jpg'))
276:
277: def testContentTypeFromHttpUpload(self):
278: # Detect content type from download headers
279: self.addExtFile(id='file', file=notImage)
280: self.file.manage_http_upload(url=self.app.TiffImage.absolute_url())
281: self.file._finish()
282: self.assertEqual(self.file.content_type, 'image/tiff')
283: # File is *not* renamed!
284: self.failUnless(self._exists('file.exe'))
285:
286: def testContentTypeFromHttpUploadDefault(self):
287: # Detect content type from download headers
288: self.addExtFile(id='file', file=notImage)
289: self.file.manage_http_upload(url=self.app.NotImage.absolute_url())
290: self.file._finish()
291: self.assertEqual(self.file.content_type, 'application/octet-stream')
292: # File is *not* renamed!
293: self.failUnless(self._exists('file.exe'))
294:
295:
296: class TestExtImageContentType(ExtFileTestCase):
297: '''Test ExtImage content-type detection'''
298:
299: def testDefaultContentType(self):
300: # Use default content type
301: self.addExtImage(id='image', file=notImage)
302: self.image._finish()
303: self.assertEqual(self.image.content_type, 'application/octet-stream')
304: self.failUnless(self._exists('image.exe'))
305:
306: def testContentTypeExplicit(self):
307: # Use passed-in content type when we cannot detect from content
308: self.addExtImage(id='image', file=notImage, content_type='image/jpeg')
309: self.image._finish()
310: self.assertEqual(self.image.content_type, 'image/jpeg')
311: self.failUnless(self._exists('image.jpg'))
312:
313: def testContentTypeFromId(self):
314: # Detect GIF content type from file id
315: self.addExtImage(id='image.gif', file=notImage)
316: self.image._finish()
317: self.assertEqual(self.image.content_type, 'image/gif')
318: self.failUnless(self._exists('image.gif'))
319:
320: def testContentTypeFromIdExplicit(self):
321: # Passed-in content type trumps detection by id
322: self.addExtImage(id='image.gif', file=notImage, content_type='image/jpeg')
323: self.image._finish()
324: self.assertEqual(self.image.content_type, 'image/jpeg')
325: self.failUnless(self._exists('image.jpg'))
326:
327: def testContentTypeFromHeaders(self):
328: # Detect GIF content type from file upload headers
329: self.addExtImage(id='image', file=makeFileUpload(notImage, 'image/gif'))
330: self.image._finish()
331: self.assertEqual(self.image.content_type, 'image/gif')
332: self.failUnless(self._exists('image.gif'))
333:
334: def testContentTypeFromHeadersExplicit(self):
335: # Passed-in content type trumps detection by headers
336: self.addExtImage(id='image', file=makeFileUpload(notImage, 'image/gif'), content_type='image/jpeg')
337: self.image._finish()
338: self.assertEqual(self.image.content_type, 'image/jpeg')
339: self.failUnless(self._exists('image.jpg'))
340:
341: def testContentTypeFromHttpUpload(self):
342: # Detect content type from download headers
343: self.addExtImage(id='image', file=notImage)
344: self.image.manage_http_upload(url=self.app.TiffImage.absolute_url())
345: self.image._finish()
346: self.assertEqual(self.image.content_type, 'image/tiff')
347: # File is *not* renamed!
348: self.failUnless(self._exists('image.exe'))
349: # Check TIFF dimension sniffing
350: self.assertEqual(self.image.width(), 200)
351: self.assertEqual(self.image.height(), 136)
352:
353: def testContentTypeFromGifContent(self):
354: # Detect GIF content type from file contents
355: self.addExtImage(id='image', file=gifImage)
356: self.image._finish()
357: self.assertEqual(self.image.content_type, 'image/gif')
358: self.failUnless(self._exists('image.gif'))
359:
360: def testContentTypeFromGifContentExplicit(self):
361: # Detect GIF content type even when passing a content type
362: self.addExtImage(id='image', file=gifImage, content_type='image/jpeg')
363: self.image._finish()
364: self.assertEqual(self.image.content_type, 'image/gif')
365: self.failUnless(self._exists('image.gif'))
366:
367: def testContentTypeFromJpegContent(self):
368: # Detect JPEG content type from file contents
369: self.addExtImage(id='image', file=jpegImage)
370: self.image._finish()
371: self.assertEqual(self.image.content_type, 'image/jpeg')
372: self.failUnless(self._exists('image.jpg'))
373:
374: def testContentTypeFromJpegContentExplicit(self):
375: # Detect JPEG content type even when passing a content type
376: self.addExtImage(id='image', file=jpegImage, content_type='image/tiff')
377: self.image._finish()
378: self.assertEqual(self.image.content_type, 'image/jpeg')
379: self.failUnless(self._exists('image.jpg'))
380:
381: def testContentTypeFromGifString(self):
382: # Detect GIF content type from string buffer
383: self.addExtImage(id='image', file=notImage)
384: self.image.manage_upload(file=open(gifImage, 'rb').read())
385: self.image._finish()
386: self.assertEqual(self.image.content_type, 'image/gif')
387: # File is *not* renamed!
388: self.failUnless(self._exists('image.exe'))
389:
390: def testContentTypeFromJpegPUT(self):
391: # Detect JPEG content type from PUT' image
392: self.addExtImage(id='image', file=open(notImage, 'rb'))
393: request = self.app.REQUEST
394: request['BODYFILE'] = open(jpegImage, 'rb')
395: self.image.PUT(request, request.RESPONSE)
396: self.image._finish()
397: self.assertEqual(self.image.content_type, 'image/jpeg')
398: # File is *not* renamed!
399: self.failUnless(self._exists('image.exe'))
400: # Check PUT works
401: self.assertEqual(self.image.get_size(), self._fsize(jpegImage))
402:
403:
404: class TestExtFileCopyPaste(ExtFileTestCase):
405: '''Tests cut/copy/paste/rename/clone'''
406:
407: def afterSetUp(self):
408: ExtFileTestCase.afterSetUp(self)
409: self.folder.manage_addFolder('subfolder')
410: self.subfolder = self.folder['subfolder']
411: self.setPermissions(copymove_perms)
412: self.addExtFile(id='image.gif', file=gifImage)
413: transaction.savepoint(1) # need a _p_jar
414:
415: def testClone(self):
416: # Clone a file
417: self.subfolder.manage_clone(self.file, 'image.gif')
418: self.file._finish()
419: self.subfolder['image.gif']._finish()
420: self.failUnless(self._exists('image.gif'))
421: self.failIf(self._exists('image.gif.undo'))
422: self.failUnless(self._exists('image.1.gif'))
423:
424: def testCopyPaste(self):
425: # Copy and paste a file
426: cb = self.folder.manage_copyObjects(['image.gif'])
427: self.subfolder.manage_pasteObjects(cb)
428: self.file._finish()
429: self.subfolder['image.gif']._finish()
430: self.failUnless(self._exists('image.gif'))
431: self.failIf(self._exists('image.gif.undo'))
432: self.failUnless(self._exists('image.1.gif'))
433: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
434:
435: def testCutPaste(self):
436: # Cut and paste a file
437: cb = self.folder.manage_cutObjects(['image.gif'])
438: self.subfolder.manage_pasteObjects(cb)
439: self.file._finish()
440: self.subfolder['image.gif']._finish()
441: self.failUnless(self._exists('image.gif'))
442: self.failIf(self._exists('image.gif.undo'))
443: self.failIf(self._exists('image.1.gif'))
444:
445: def testRename(self):
446: # Rename a file
447: self.folder.manage_renameObject('image.gif', 'image44.gif')
448: self.file._finish()
449: self.folder['image44.gif']._finish()
450: self.failUnless(self._exists('image.gif'))
451: self.failIf(self._exists('image.gif.undo'))
452: self.failIf(self._exists('image.1.gif'))
453:
454: def testCOPY(self):
455: # WebDAV copy a file
456: req = self.app.REQUEST
457: req.environ['HTTP_DEPTH'] = 'infinity'
458: req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
459: self.folder['image.gif'].COPY(req, req.RESPONSE)
460: self.file._finish()
461: self.subfolder['image.gif']._finish()
462: self.failUnless(self._exists('image.gif'))
463: self.failIf(self._exists('image.gif.undo'))
464: self.failUnless(self._exists('image.1.gif'))
465: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
466:
467: def testMOVE(self):
468: # WebDAV move a file
469: req = self.app.REQUEST
470: req.environ['HTTP_DEPTH'] = 'infinity'
471: req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
472: self.folder['image.gif'].MOVE(req, req.RESPONSE)
473: self.file._finish()
474: self.subfolder['image.gif']._finish()
475: self.failUnless(self._exists('image.gif'))
476: self.failIf(self._exists('image.gif.undo'))
477: self.failIf(self._exists('image.1.gif'))
478: self.failIf(self._exists('image.1.gif.undo'))
479: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
480:
481: def testCopyOfProtection(self):
482: # Copy and paste a file into the same folder.
483: # The filenames should not begin with 'copy_of_'
484: cb = self.folder.manage_copyObjects(['image.gif'])
485: self.folder.manage_pasteObjects(cb)
486: self.file._finish()
487: self.folder['copy_of_image.gif']._finish()
488: self.failUnless(self._exists('image.gif'))
489: self.failIf(self._exists('image.gif.undo'))
490: self.failIf(self._exists('copy_of_image.gif'))
491: self.failUnless(self._exists('image.1.gif'))
492: self.assertEqual(self.folder['copy_of_image.gif'].get_size(), self._fsize(gifImage))
493:
494:
495: class TestExtImageCopyPaste(ExtFileTestCase):
496: '''Tests cut/copy/paste/rename/clone'''
497:
498: def afterSetUp(self):
499: ExtFileTestCase.afterSetUp(self)
500: self.folder.manage_addFolder('subfolder')
501: self.subfolder = self.folder['subfolder']
502: self.setPermissions(copymove_perms)
503: self.addExtImage(id='image.gif', file=gifImage)
504: # Add a preview image as well
505: self.folder['image.gif'].manage_file_upload(file=jpegImage, is_preview=1,
506: create_prev=UPLOAD_RESIZE,
507: maxx=100, maxy=100, ratio=1)
508: transaction.savepoint(1) # need a _p_jar
509:
510: def testClone(self):
511: # Clone an image
512: self.subfolder.manage_clone(self.image, 'image.gif')
513: self.image._finish()
514: self.subfolder['image.gif']._finish()
515: self.failUnless(self._exists('image.gif'))
516: self.failIf(self._exists('image.gif.undo'))
517: self.failUnless(self._exists('image.jpg'))
518: self.failIf(self._exists('image.jpg.undo'))
519: self.failUnless(self._exists('image.1.gif'))
520: self.failUnless(self._exists('image.1.jpg'))
521:
522: def testCopyPaste(self):
523: # Copy and paste an image
524: cb = self.folder.manage_copyObjects(['image.gif'])
525: self.subfolder.manage_pasteObjects(cb)
526: self.image._finish()
527: self.subfolder['image.gif']._finish()
528: self.failUnless(self._exists('image.gif'))
529: self.failIf(self._exists('image.gif.undo'))
530: self.failUnless(self._exists('image.1.gif'))
531: self.failIf(self._exists('image.1.gif.undo'))
532: self.failUnless(self._exists('image.jpg'))
533: self.failUnless(self._exists('image.1.jpg'))
534: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
535:
536: def testCutPaste(self):
537: # Cut and paste an image
538: cb = self.folder.manage_cutObjects(['image.gif'])
539: self.subfolder.manage_pasteObjects(cb)
540: self.image._finish()
541: self.subfolder['image.gif']._finish()
542: self.failUnless(self._exists('image.gif'))
543: self.failIf(self._exists('image.gif.undo'))
544: self.failUnless(self._exists('image.jpg'))
545: self.failIf(self._exists('image.jpg.undo'))
546: self.failIf(self._exists('image.1.gif'))
547: self.failIf(self._exists('image.1.jpg'))
548:
549: def testRename(self):
550: # Rename an image
551: self.folder.manage_renameObject('image.gif', 'image44.gif')
552: self.image._finish()
553: self.folder['image44.gif']._finish()
554: self.failUnless(self._exists('image.gif'))
555: self.failIf(self._exists('image.gif.undo'))
556: self.failUnless(self._exists('image.jpg'))
557: self.failIf(self._exists('image.jpg.undo'))
558: self.failIf(self._exists('image.1.gif'))
559: self.failIf(self._exists('image.1.jpg'))
560:
561: def testCOPY(self):
562: # WebDAV copy an image
563: req = self.app.REQUEST
564: req.environ['HTTP_DEPTH'] = 'infinity'
565: req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
566: self.folder['image.gif'].COPY(req, req.RESPONSE)
567: self.image._finish()
568: self.subfolder['image.gif']._finish()
569: self.failUnless(self._exists('image.gif'))
570: self.failIf(self._exists('image.gif.undo'))
571: self.failUnless(self._exists('image.1.gif'))
572: self.failIf(self._exists('image.1.gif.undo'))
573: self.failUnless(self._exists('image.jpg'))
574: self.failUnless(self._exists('image.1.jpg'))
575: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
576:
577: def testMOVE(self):
578: # WebDAV move an image
579: req = self.app.REQUEST
580: req.environ['HTTP_DEPTH'] = 'infinity'
581: req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
582: self.folder['image.gif'].MOVE(req, req.RESPONSE)
583: self.image._finish()
584: self.subfolder['image.gif']._finish()
585: self.failUnless(self._exists('image.gif'))
586: self.failIf(self._exists('image.gif.undo'))
587: self.failUnless(self._exists('image.jpg'))
588: self.failIf(self._exists('image.jpg.undo'))
589: self.failIf(self._exists('image.1.gif'))
590: self.failIf(self._exists('image.1.jpg'))
591: self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
592:
593: def testPUTRecreatesPreview(self):
594: # PUT an image; the preview should be regenerated.
595: self.image._finish()
596: self.failUnless(self._exists('image.gif'))
597: self.failUnless(self._exists('image.jpg')) # preview
598: self.failIf(self._exists('image.gif.tmp'))
599: self.failIf(self._exists('image.jpg.tmp'))
600: req = self.app.REQUEST
601: req['BODYFILE'] = open(gifImage, 'rb')
602: self.image.PUT(req, req.RESPONSE)
603: self.failUnless(self._exists('image.gif'))
604: self.failUnless(self._exists('image.jpg')) # preview
605: self.failUnless(self._exists('image.gif.tmp')) # newly put image
606: self.failUnless(self._exists('image.jpg.tmp')) # regenerated preview
607: self.image._finish()
608: self.failUnless(self._exists('image.gif'))
609: self.failUnless(self._exists('image.jpg')) # regenerated preview
610: self.failIf(self._exists('image.gif.tmp'))
611: self.failIf(self._exists('image.jpg.tmp'))
612:
613: def testPUTRetainsPreviewBoundaries(self):
614: # PUT an image; the preview should retain maxx and maxy.
615: self.failUnless(self.image.has_preview)
616: self.assertEqual(self.image.prev_width(), 100)
617: self.assertEqual(self.image.prev_height(), 64)
618: req = self.app.REQUEST
619: req['BODYFILE'] = open(tiffImage, 'rb')
620: self.image.PUT(req, req.RESPONSE)
621: self.assertEqual(self.image.prev_width(), 100)
622: self.assertEqual(self.image.prev_height(), 68)
623:
624: def testManageHTTPUploadDoesNotAffectPreview(self):
625: # HTTP upload an image; the preview should not change.
626: self.failUnless(self.image.has_preview)
627: self.assertEqual(self.image.prev_width(), 100)
628: self.assertEqual(self.image.prev_height(), 64)
629: self.image.manage_http_upload(url=self.app.TiffImage.absolute_url())
630: self.assertEqual(self.image.prev_width(), 100)
631: self.assertEqual(self.image.prev_height(), 64)
632:
633:
634: class TestRepository(ExtFileTestCase):
635: '''Test repository directories'''
636:
637: def afterClear(self):
638: ExtFileTestCase.afterClear(self)
639: ExtFile.REPOSITORY = Config.FLAT
640: ExtFile.NORMALIZE_CASE = Config.KEEP
641: ExtFile.CUSTOM_METHOD = 'getExtFilePath'
642:
643: def testRepositoryFlat(self):
644: ExtFile.REPOSITORY = Config.FLAT
645: self.addExtImage(id='image', file=gifImage)
646: path = self.image.filename[:-1]
647: self.assertEqual(path, [])
648:
649: def testRepositorySyncZodb(self):
650: ExtFile.REPOSITORY = Config.SYNC_ZODB
651: self.addExtImage(id='image', file=gifImage)
652: path = self.image.filename[:-1]
653: self.assertEqual(path, [ZopeTestCase.folder_name])
654:
655: def testRepositorySliced(self):
656: ExtFile.REPOSITORY = Config.SLICED
657: self.addExtImage(id='image', file=gifImage)
658: path = self.image.filename[:-1]
659: self.assertEqual(path, ['i', 'm'])
660:
661: def testRepositorySlicedReverse(self):
662: ExtFile.REPOSITORY = Config.SLICED_REVERSE
663: self.addExtImage(id='image', file=gifImage)
664: path = self.image.filename[:-1]
665: self.assertEqual(path, ['e', 'g'])
666:
667: def testRepositorySlicedHash(self):
668: ExtFile.REPOSITORY = Config.SLICED_HASH
669: self.addExtImage(id='image', file=gifImage)
670: path = self.image.filename[:-1]
671: self.assertEqual(path, ['F', 'E'])
672:
673: def testRepositorySlicedHashDifferentFolder(self):
674: # Because the path is part of the hash, the results
675: # are different from the above test.
676: ExtFile.REPOSITORY = Config.SLICED_HASH
677: self.folder.manage_addFolder('subfolder')
678: self.subfolder = self.folder['subfolder']
679: self.addExtImage(id='image', file=gifImage, folder=self.subfolder)
680: path = self.image.filename[:-1]
681: self.assertEqual(path, ['L', 'd'])
682:
683: def testRepositoryCustom(self):
684:
685: def getExtFilePath(path, id):
686: return ['custom', 'path']
687: setattr(self.folder, 'getExtFilePath', getExtFilePath)
688:
689: ExtFile.REPOSITORY = Config.CUSTOM
690: self.addExtImage(id='image', file=gifImage)
691: path = self.image.filename[:-1]
692: self.assertEqual(path, ['custom', 'path'])
693:
694: def testRepositoryNormalizeCase(self):
695:
696: def getExtFilePath(path, id):
697: return ['Custom', 'Path']
698: setattr(self.folder, 'getExtFilePath', getExtFilePath)
699:
700: ExtFile.REPOSITORY = Config.CUSTOM
701: ExtFile.NORMALIZE_CASE = Config.NORMALIZE
702: self.addExtImage(id='image', file=gifImage)
703: path = self.image.filename[:-1]
704: self.assertEqual(path, ['custom', 'path'])
705:
706: def testRepositoryCustomScript(self):
707:
708: factory = self.folder.manage_addProduct['PythonScripts']
709: factory.manage_addPythonScript('getExtFilePath')
710: ps = self.folder.getExtFilePath
711: ps.ZPythonScript_edit(params='path, id', body="return ['custom', 'path']")
712:
713: ExtFile.REPOSITORY = Config.CUSTOM
714: self.addExtImage(id='image', file=gifImage)
715: path = self.image.filename[:-1]
716: self.assertEqual(path, ['custom', 'path'])
717:
718: def testRepositoryCustomContainer(self):
719: from OFS.Folder import Folder
720:
721: class CustomContainer(Folder):
722: def __init__(self, id):
723: self.id = id
724: def getExtFilePath(self, path, id):
725: return ['custom', 'path']
726:
727: self.folder._setObject('subfolder', CustomContainer('subfolder'))
728: self.folder = self.folder.subfolder
729:
730: ExtFile.REPOSITORY = Config.CUSTOM
731: self.addExtImage(id='image', file=gifImage)
732: path = self.image.filename[:-1]
733: self.assertEqual(path, ['custom', 'path'])
734:
735: def testRepositoryCustomContainerContainer(self):
736: from OFS.Folder import Folder
737:
738: class CustomContainer(Folder):
739: def __init__(self, id):
740: self.id = id
741: def getExtFilePath(self, path, id):
742: return ['custom', 'path']
743:
744: self.folder._setObject('subfolder', CustomContainer('subfolder'))
745: self.folder = self.folder.subfolder
746: self.folder._setObject('subsubfolder', Folder('subsubfolder'))
747: self.folder = self.folder.subsubfolder
748:
749: ExtFile.REPOSITORY = Config.CUSTOM
750: self.addExtImage(id='image', file=gifImage)
751: path = self.image.filename[:-1]
752: self.assertEqual(path, ['custom', 'path'])
753:
754: def testRepositoryCustomSubclass(self):
755:
756: class CustomImage(ExtImage.ExtImage):
757: def getExtFilePath(self, path, id):
758: return ['custom', 'path']
759:
760: ExtFile.REPOSITORY = Config.CUSTOM
761: self.folder._setObject('image', CustomImage('image'))
762: self.folder.image.manage_file_upload(gifImage)
763: path = self.folder.image.filename[:-1]
764: self.assertEqual(path, ['custom', 'path'])
765:
766: def testRepositoryCustomPrivateMethod(self):
767:
768: def _getExtFilePath(path, id):
769: return ['custom', 'path']
770: setattr(self.folder, '_getExtFilePath', _getExtFilePath)
771:
772: ExtFile.REPOSITORY = Config.CUSTOM
773: ExtFile.CUSTOM_METHOD = '_getExtFilePath'
774: self.addExtImage(id='image', file=gifImage)
775: path = self.image.filename[:-1]
776: self.assertEqual(path, ['custom', 'path'])
777:
778:
779: class TestRepositoryFiles(ExtFileTestCase):
780: '''Test repository files'''
781:
782: def afterSetUp(self):
783: ExtFileTestCase.afterSetUp(self)
784: self.folder.manage_addFolder('subfolder')
785: self.subfolder = self.folder['subfolder']
786:
787: def testUniqueFileName(self):
788: # Create a unique file name
789: self.addExtImage(id='image', file=gifImage)
790: self.image._finish()
791: self.addExtImage(id='image', file=gifImage, folder=self.subfolder)
792: self.image._finish()
793: self.failUnless(self._exists('image.gif'))
794: self.failIf(self._exists('image.gif.undo'))
795: self.failUnless(self._exists('image.1.gif'))
796: self.failIf(self._exists('image.1.gif.undo'))
797:
798: def testUniquePreviewName(self):
799: # Create a unique preview name
800: self.addExtImage(id='image', file=jpegImage)
801: self.image.manage_create_prev(100, 100, ratio=1)
802: self.image._finish()
803: self.failUnless(self._exists('image.jpg'))
804: self.failIf(self._exists('image.jpg.undo'))
805: self.failUnless(self._exists('image.1.jpg')) # Generated previews are always jpeg
806: self.failIf(self._exists('image.1.jpg.undo'))
807:
808: def testUndoNameOnDelete(self):
809: # Create a .undo file on delete
810: self.addExtImage(id='image', file=gifImage)
811: self.folder.manage_delObjects(['image'])
812: self.failIf(self._exists('image.gif'))
813: self.failUnless(self._exists('image.gif.undo'))
814:
815: def testUndoNameOnDeletePreview(self):
816: # Create a .undo file for the preview image on delete
817: self.addExtImage(id='image', file=gifImage)
818: self.image.manage_create_prev(100, 100, ratio=1)
819: self.image._finish()
820: self.failUnless(self._exists('image.gif'))
821: self.failUnless(self._exists('image.jpg')) # Generated previews are always jpeg
822: self.folder.manage_delObjects(['image'])
823: self.failIf(self._exists('image.gif'))
824: self.failUnless(self._exists('image.gif.undo'))
825: self.failIf(self._exists('image.jpg'))
826: self.failUnless(self._exists('image.jpg.undo'))
827:
828: def testUndoNameOnUpload(self):
829: # Do not create a .undo file on upload
830: self.addExtImage(id='image', file=gifImage)
831: self.image.manage_file_upload(file=gifImage)
832: self.image._finish()
833: self.failUnless(self._exists('image.gif'))
834: self.failIf(self._exists('image.gif.undo'))
835: self.failIf(self._exists('image.1.gif'))
836:
837: def testUndoNameIsNotReused(self):
838: # If an .undo file exists the name is not reused
839: self.addExtImage(id='image', file=gifImage)
840: self.folder.manage_delObjects(['image'])
841: self.addExtImage(id='image', file=gifImage)
842: self.image._finish()
843: self.failIf(self._exists('image.gif'))
844: self.failUnless(self._exists('image.gif.undo'))
845: self.failUnless(self._exists('image.1.gif'))
846:
847:
848: class TestRepositoryExtensions(ExtFileTestCase):
849: '''Test repository file extensions'''
850:
851: def afterClear(self):
852: ExtFileTestCase.afterClear(self)
853: ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_REPLACE
854:
855: def testDefaultContentType(self):
856: # Use default content type
857: self.addExtImage(id='image', file=notImage)
858: self.image._finish()
859: self.failUnless(self._exists('image.exe'))
860:
861: def testDefaultContentTypeKeepsExistingExtension(self):
862: # Retain existing file extension if content type is octet-stream
863: self.addExtImage(id='image.foo', file=notImage)
864: self.image._finish()
865: self.failUnless(self._exists('image.foo'))
866:
867: def testDefaultContentTypeMimetypeAppend(self):
868: # Use default content type
869: ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_APPEND
870: self.testDefaultContentType()
871:
872: def testDefaultContentTypeKeepsExistingExtensionMimetypeAppend(self):
873: # Retain existing file extension if content type is octet-stream
874: ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_APPEND
875: self.testDefaultContentTypeKeepsExistingExtension()
876:
877:
878: class TestDownloadPermission(ExtFileTestCase):
879: '''Tests the DownloadPermission'''
880:
881: def testPermissionExists(self):
882: # DownloadPermission should exist
883: perms = self.app.permissionsOfRole('Manager')
884: perms = [x['name'] for x in perms if x['selected']]
885: self.failUnless(ExtFile.DownloadPermission in perms)
886:
887: def testDownloadPermissionCheck(self):
888: # The use_download_permission_check property
889: # should control whether we can see the full image.
890: self.addExtImage(id='image', file=gifImage)
891: self.failUnless(self.image._access_permitted())
892: self.image.use_download_permission_check = 1
893: self.failIf(self.image._access_permitted())
894:
895: def testShowPreviewIfNoDownloadPermission(self):
896: # If we don't have the permission we should only
897: # see the preview.
898: self.addExtImage(id='image', file=gifImage)
899: self.image.use_download_permission_check = 1
900: self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
901: dummy, dummy, dummy, preview = self.image._get_file_to_serve()
902: self.failUnless(preview)
903:
904: def testShowIconIfNoDownloadPermission(self):
905: # If we don't have the permission, and there is no preview,
906: # we should only see the icon.
907: self.addExtImage(id='image', file=gifImage)
908: self.image.use_download_permission_check = 1
909: dummy, dummy, icon, dummy = self.image._get_file_to_serve()
910: self.failUnless(icon)
911:
912: def testPreviewTagIfNoDownloadPermission(self):
913: # If we don't have the permission we should only
914: # see the preview.
915: self.addExtImage(id='image', file=gifImage)
916: self.image.use_download_permission_check = 1
917: self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
918: tag = self.image.tag()
919: # Permission is not checked in static mode
920: if self.image.static_mode():
921: self.failUnless(tag.find('/static/image.jpg')>=0)
922: else:
923: self.failUnless(tag.find('/image?preview=1')>=0)
924:
925: def testIconTagIfNoDownloadPermission(self):
926: # If we don't have the permission, and there is no preview,
927: # we should only see the icon.
928: self.addExtImage(id='image', file=gifImage)
929: self.image.use_download_permission_check = 1
930: tag = self.image.tag()
931: self.failUnless(tag.find('/image?icon=1')>=0)
932:
933: def testPreviewTagIfNotWebviewable(self):
934: # If the image is not webviewable we should only
935: # see the preview.
936: self.addExtImage(id='image', file=tiffImage)
937: self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
938: tag = self.image.tag()
939: # Permission is not checked in static mode
940: if self.image.static_mode():
941: self.failUnless(tag.find('/static/image.jpg')>=0)
942: else:
943: self.failUnless(tag.find('/image?preview=1')>=0)
944:
945:
946: class TestGetOwner(ExtFileTestCase):
947:
948: def afterSetUp(self):
949: ExtFileTestCase.afterSetUp(self)
950: self.addExtFile(id='file.zip', file=gifImage)
951: self.addExtImage(id='image.gif', file=gifImage)
952:
953: def testFileOwner(self):
954: self.assertEqual(self.file.getOwner().getId(), ZopeTestCase.user_name)
955: self.assertEqual(self.file.getOwnerTuple(),
956: ([ZopeTestCase.folder_name, 'acl_users'], ZopeTestCase.user_name))
957:
958: def testImageOwner(self):
959: self.assertEqual(self.image.getOwner().getId(), ZopeTestCase.user_name)
960: self.assertEqual(self.image.getOwnerTuple(),
961: ([ZopeTestCase.folder_name, 'acl_users'], ZopeTestCase.user_name))
962:
963:
964: class TestFTPget(ExtFileTestCase):
965:
966: def afterSetUp(self):
967: ExtFileTestCase.afterSetUp(self)
968: self.addExtFile(id='file.zip', file=gifImage)
969: self.addExtImage(id='image.gif', file=gifImage)
970:
971: def testFTPgetFile(self):
972: from StringIO import StringIO
973: response = self.app.REQUEST.RESPONSE
974: response.stdout = StringIO() # Shut up
975: result = self.file.manage_FTPget()
976: #self.assertEqual(result, '')
977: self.assertEqual(response.headers.get('content-type'), 'application/zip')
978: self.assertEqual(response.headers.get('content-length'), '%s' % self._fsize(gifImage))
979:
980: def testFTPgetImage(self):
981: from StringIO import StringIO
982: response = self.app.REQUEST.RESPONSE
983: response.stdout = StringIO() # Shut up
984: result = self.image.manage_FTPget()
985: #self.assertEqual(result, '')
986: self.assertEqual(response.headers.get('content-type'), 'image/gif')
987: self.assertEqual(response.headers.get('content-length'), '%s' % self._fsize(gifImage))
988:
989:
990: class TestPublish(ZopeTestCase.Functional, ExtFileTestCase):
991:
992: def afterSetUp(self):
993: ExtFileTestCase.afterSetUp(self)
994: self.addExtFile(id='file.zip', file=gifImage)
995: self.addExtImage(id='image.gif', file=gifImage)
996:
997: def testPublishFile(self):
998: folder_path = self.folder.absolute_url(1)
999: response = self.publish(folder_path+'/file.zip')
1000: self.assertEqual(response.getStatus(), 200)
1001: self.failUnless(response.getHeader('Content-Type').startswith('application/zip'))
1002:
1003: def testPublishImage(self):
1004: folder_path = self.folder.absolute_url(1)
1005: response = self.publish(folder_path+'/image.gif')
1006: self.assertEqual(response.getStatus(), 200)
1007: self.failUnless(response.getHeader('Content-Type').startswith('image/gif'))
1008:
1009:
1010: def test_suite():
1011: from unittest import TestSuite, makeSuite
1012: suite = TestSuite()
1013: suite.addTest(makeSuite(TestExtFileAdd))
1014: suite.addTest(makeSuite(TestExtImageAdd))
1015: suite.addTest(makeSuite(TestExtFileUpload))
1016: suite.addTest(makeSuite(TestExtImageUpload))
1017: suite.addTest(makeSuite(TestExtFileContentType))
1018: suite.addTest(makeSuite(TestExtImageContentType))
1019: suite.addTest(makeSuite(TestExtFileCopyPaste))
1020: suite.addTest(makeSuite(TestExtImageCopyPaste))
1021: suite.addTest(makeSuite(TestRepository))
1022: suite.addTest(makeSuite(TestRepositoryFiles))
1023: suite.addTest(makeSuite(TestRepositoryExtensions))
1024: suite.addTest(makeSuite(TestDownloadPermission))
1025: suite.addTest(makeSuite(TestGetOwner))
1026: suite.addTest(makeSuite(TestFTPget))
1027: suite.addTest(makeSuite(TestPublish))
1028: return suite
1029:
1030: if __name__ == '__main__':
1031: framework()
1032:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>