#
# Tests the ExtFile product
#
import os, sys
if __name__ == '__main__':
execfile(os.path.join(sys.path[0], 'framework.py'))
from Testing import ZopeTestCase
ZopeTestCase.installProduct('ExtFile')
ZopeTestCase.installProduct('PythonScripts')
ZopeTestCase.utils.startZServer(4)
from Products.ExtFile.tests.ExtFileTestCase import ExtFileTestCase
from Products.ExtFile.tests.ExtFileTestCase import gifImage, jpegImage, tiffImage, notImage
from Products.ExtFile.tests.ExtFileTestCase import makeFileUpload
from Products.ExtFile.tests.ExtFileTestCase import copymove_perms
from Products.ExtFile import transaction
from Products.ExtFile import ExtFile, ExtImage, Config
from Products.ExtFile.ExtImage import UPLOAD_RESIZE
class TestExtFileAdd(ExtFileTestCase):
'''Test ExtFile creation'''
def testAddFileFromFileName(self):
# Add File from file name
self.addExtFile(id='file', file=notImage)
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testAddFileFromFileHandle(self):
# Add File from file handle
self.addExtFile(id='file', file=open(notImage, 'rb'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testAddFileFromFileUpload(self):
# Add File from file upload
self.addExtFile(id='file', file=makeFileUpload(notImage, 'application/octet-stream'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testAddFileWithIdFromFilename(self):
# Add File without id - should use filename instead
self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='foo'))
self.file._finish()
self.assertEqual(self.file.getId(), 'foo')
self.failUnless(self._exists('foo.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testAddFileWithLatin1Filename(self):
# Add File without id - should use filename instead
self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='M\xe4dchen'))
self.file._finish()
self.assertEqual(self.file.getId(), 'Madchen')
self.failUnless(self._exists('Madchen.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testAddFileWithUTF8Filename(self):
# Add File without id - should use filename instead
self.addExtFile(id='', file=makeFileUpload(notImage, 'application/octet-stream', filename='M\303\244dchen'))
self.file._finish()
self.assertEqual(self.file.getId(), 'Madchen')
self.failUnless(self._exists('Madchen.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
class TestExtImageAdd(ExtFileTestCase):
'''Test ExtImage creation'''
def testAddImageFromName(self):
# Add Image from file name
self.addExtImage(id='image', file=gifImage)
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testAddImageFromFileHandle(self):
# Add Image from file handle
self.addExtImage(id='image', file=open(gifImage, 'rb'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testAddImageFromFileUpload(self):
# Add Image from file upload
self.addExtImage(id='image', file=makeFileUpload(gifImage, 'image/gif'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testAddImageWithIdFromFilename(self):
# Add File without id - should use filename instead
self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='foo'))
self.image._finish()
self.assertEqual(self.image.getId(), 'foo')
self.failUnless(self._exists('foo.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testAddUnwrappedImage(self):
# This is what Photo does with displays...
file = ExtImage.ExtImage('foo')
self.assertRaises(AttributeError,
file.manage_file_upload, file=gifImage)
def testAddImageWithLatin1Filename(self):
# Add File without id - should use filename instead
self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='M\xe4dchen'))
self.image._finish()
self.assertEqual(self.image.getId(), 'Madchen')
self.failUnless(self._exists('Madchen.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testAddImageWithUTF8Filename(self):
# Add File without id - should use filename instead
self.addExtImage(id='', file=makeFileUpload(gifImage, 'image/gif', filename='M\303\244dchen'))
self.image._finish()
self.assertEqual(self.image.getId(), 'Madchen')
self.failUnless(self._exists('Madchen.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
class TestExtFileUpload(ExtFileTestCase):
'''Test ExtFile upload'''
def testManageFileUploadFromFileName(self):
# Upload File from file name
self.addExtFile(id='file', file='')
self.file.manage_file_upload(file=notImage)
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testManageFileUploadFromFileHandle(self):
# Upload File from file handle
self.addExtFile(id='file', file='')
self.file.manage_file_upload(file=open(notImage, 'rb'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testManageFileUploadFromFileUpload(self):
# Upload File from file upload
self.addExtFile(id='file', file='')
self.file.manage_file_upload(file=makeFileUpload(notImage, 'application/octet-stream'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testManageUploadFromStringBuffer(self):
# Upload File from file name
self.addExtFile(id='file', file='')
self.file.manage_upload(file=open(notImage, 'rb').read())
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testManageUploadFromFileHandle(self):
# Upload File from file handle
self.addExtFile(id='file', file='')
self.file.manage_upload(file=open(notImage, 'rb'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
def testManageUploadFromFileUpload(self):
# Upload File from file upload
self.addExtFile(id='file', file='')
self.file.manage_upload(file=makeFileUpload(notImage, 'application/octet-stream'))
self.file._finish()
self.failUnless(self._exists('file.exe'))
self.assertEqual(self.file.get_size(), self._fsize(notImage))
class TestExtImageUpload(ExtFileTestCase):
'''Test ExtImage upload'''
def testManageFileUploadFromFileName(self):
# Upload Image from file name
self.addExtImage(id='image', file='')
self.image.manage_file_upload(file=gifImage)
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testManageFileUploadFromFileHandle(self):
# Upload Image from file handle
self.addExtImage(id='image', file='')
self.image.manage_file_upload(file=open(gifImage, 'rb'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testManageFileUploadFromFileUpload(self):
# Upload Image from file upload
self.addExtImage(id='image', file='')
self.image.manage_file_upload(file=makeFileUpload(gifImage, 'image/gif'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testManageUploadFromStringBuffer(self):
# Upload Image from file name
self.addExtImage(id='image', file='')
self.image.manage_upload(file=open(gifImage, 'rb').read())
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testManageUploadFromFileHandle(self):
# Upload Image from file handle
self.addExtImage(id='image', file='')
self.image.manage_upload(file=open(gifImage, 'rb'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
def testManageUploadFromFileUpload(self):
# Upload Image from file upload
self.addExtImage(id='image', file='')
self.image.manage_upload(file=makeFileUpload(gifImage, 'image/gif'))
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.assertEqual(self.image.get_size(), self._fsize(gifImage))
class TestExtFileContentType(ExtFileTestCase):
'''Test ExtFile content-type detection'''
def testDefaultContentType(self):
# Use default content type
self.addExtFile(id='file', file=notImage)
self.file._finish()
self.assertEqual(self.file.content_type, 'application/octet-stream')
self.failUnless(self._exists('file.exe'))
def testContentTypeExplicit(self):
# Use passed-in content type
self.addExtFile(id='file', file=notImage, content_type='image/jpeg')
self.file._finish()
self.assertEqual(self.file.content_type, 'image/jpeg')
self.failUnless(self._exists('file.jpg'))
def testContentTypeFromId(self):
# Detect GIF content type from file id
self.addExtFile(id='file.gif', file=notImage)
self.file._finish()
self.assertEqual(self.file.content_type, 'image/gif')
self.failUnless(self._exists('file.gif'))
def testContentTypeFromIdExplicit(self):
# Passed-in content type trumps detection by id
self.addExtFile(id='file.gif', file=notImage, content_type='image/jpeg')
self.file._finish()
self.assertEqual(self.file.content_type, 'image/jpeg')
self.failUnless(self._exists('file.jpg'))
def testContentTypeFromHeaders(self):
# Detect GIF content type from file upload headers
self.addExtFile(id='file', file=makeFileUpload(notImage, 'image/gif'))
self.file._finish()
self.assertEqual(self.file.content_type, 'image/gif')
self.failUnless(self._exists('file.gif'))
def testContentTypeFromHeadersExplicit(self):
# Passed-in content type trumps detection by headers
self.addExtFile(id='file', file=makeFileUpload(notImage, 'image/gif'), content_type='image/jpeg')
self.file._finish()
self.assertEqual(self.file.content_type, 'image/jpeg')
self.failUnless(self._exists('file.jpg'))
def testContentTypeFromHttpUpload(self):
# Detect content type from download headers
self.addExtFile(id='file', file=notImage)
self.file.manage_http_upload(url=self.app.TiffImage.absolute_url())
self.file._finish()
self.assertEqual(self.file.content_type, 'image/tiff')
# File is *not* renamed!
self.failUnless(self._exists('file.exe'))
def testContentTypeFromHttpUploadDefault(self):
# Detect content type from download headers
self.addExtFile(id='file', file=notImage)
self.file.manage_http_upload(url=self.app.NotImage.absolute_url())
self.file._finish()
self.assertEqual(self.file.content_type, 'application/octet-stream')
# File is *not* renamed!
self.failUnless(self._exists('file.exe'))
class TestExtImageContentType(ExtFileTestCase):
'''Test ExtImage content-type detection'''
def testDefaultContentType(self):
# Use default content type
self.addExtImage(id='image', file=notImage)
self.image._finish()
self.assertEqual(self.image.content_type, 'application/octet-stream')
self.failUnless(self._exists('image.exe'))
def testContentTypeExplicit(self):
# Use passed-in content type when we cannot detect from content
self.addExtImage(id='image', file=notImage, content_type='image/jpeg')
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
self.failUnless(self._exists('image.jpg'))
def testContentTypeFromId(self):
# Detect GIF content type from file id
self.addExtImage(id='image.gif', file=notImage)
self.image._finish()
self.assertEqual(self.image.content_type, 'image/gif')
self.failUnless(self._exists('image.gif'))
def testContentTypeFromIdExplicit(self):
# Passed-in content type trumps detection by id
self.addExtImage(id='image.gif', file=notImage, content_type='image/jpeg')
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
self.failUnless(self._exists('image.jpg'))
def testContentTypeFromHeaders(self):
# Detect GIF content type from file upload headers
self.addExtImage(id='image', file=makeFileUpload(notImage, 'image/gif'))
self.image._finish()
self.assertEqual(self.image.content_type, 'image/gif')
self.failUnless(self._exists('image.gif'))
def testContentTypeFromHeadersExplicit(self):
# Passed-in content type trumps detection by headers
self.addExtImage(id='image', file=makeFileUpload(notImage, 'image/gif'), content_type='image/jpeg')
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
self.failUnless(self._exists('image.jpg'))
def testContentTypeFromHttpUpload(self):
# Detect content type from download headers
self.addExtImage(id='image', file=notImage)
self.image.manage_http_upload(url=self.app.TiffImage.absolute_url())
self.image._finish()
self.assertEqual(self.image.content_type, 'image/tiff')
# File is *not* renamed!
self.failUnless(self._exists('image.exe'))
# Check TIFF dimension sniffing
self.assertEqual(self.image.width(), 200)
self.assertEqual(self.image.height(), 136)
def testContentTypeFromGifContent(self):
# Detect GIF content type from file contents
self.addExtImage(id='image', file=gifImage)
self.image._finish()
self.assertEqual(self.image.content_type, 'image/gif')
self.failUnless(self._exists('image.gif'))
def testContentTypeFromGifContentExplicit(self):
# Detect GIF content type even when passing a content type
self.addExtImage(id='image', file=gifImage, content_type='image/jpeg')
self.image._finish()
self.assertEqual(self.image.content_type, 'image/gif')
self.failUnless(self._exists('image.gif'))
def testContentTypeFromJpegContent(self):
# Detect JPEG content type from file contents
self.addExtImage(id='image', file=jpegImage)
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
self.failUnless(self._exists('image.jpg'))
def testContentTypeFromJpegContentExplicit(self):
# Detect JPEG content type even when passing a content type
self.addExtImage(id='image', file=jpegImage, content_type='image/tiff')
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
self.failUnless(self._exists('image.jpg'))
def testContentTypeFromGifString(self):
# Detect GIF content type from string buffer
self.addExtImage(id='image', file=notImage)
self.image.manage_upload(file=open(gifImage, 'rb').read())
self.image._finish()
self.assertEqual(self.image.content_type, 'image/gif')
# File is *not* renamed!
self.failUnless(self._exists('image.exe'))
def testContentTypeFromJpegPUT(self):
# Detect JPEG content type from PUT' image
self.addExtImage(id='image', file=open(notImage, 'rb'))
request = self.app.REQUEST
request['BODYFILE'] = open(jpegImage, 'rb')
self.image.PUT(request, request.RESPONSE)
self.image._finish()
self.assertEqual(self.image.content_type, 'image/jpeg')
# File is *not* renamed!
self.failUnless(self._exists('image.exe'))
# Check PUT works
self.assertEqual(self.image.get_size(), self._fsize(jpegImage))
class TestExtFileCopyPaste(ExtFileTestCase):
'''Tests cut/copy/paste/rename/clone'''
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.folder.manage_addFolder('subfolder')
self.subfolder = self.folder['subfolder']
self.setPermissions(copymove_perms)
self.addExtFile(id='image.gif', file=gifImage)
transaction.savepoint(1) # need a _p_jar
def testClone(self):
# Clone a file
self.subfolder.manage_clone(self.file, 'image.gif')
self.file._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
def testCopyPaste(self):
# Copy and paste a file
cb = self.folder.manage_copyObjects(['image.gif'])
self.subfolder.manage_pasteObjects(cb)
self.file._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testCutPaste(self):
# Cut and paste a file
cb = self.folder.manage_cutObjects(['image.gif'])
self.subfolder.manage_pasteObjects(cb)
self.file._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failIf(self._exists('image.1.gif'))
def testRename(self):
# Rename a file
self.folder.manage_renameObject('image.gif', 'image44.gif')
self.file._finish()
self.folder['image44.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failIf(self._exists('image.1.gif'))
def testCOPY(self):
# WebDAV copy a file
req = self.app.REQUEST
req.environ['HTTP_DEPTH'] = 'infinity'
req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
self.folder['image.gif'].COPY(req, req.RESPONSE)
self.file._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testMOVE(self):
# WebDAV move a file
req = self.app.REQUEST
req.environ['HTTP_DEPTH'] = 'infinity'
req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
self.folder['image.gif'].MOVE(req, req.RESPONSE)
self.file._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failIf(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.gif.undo'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testCopyOfProtection(self):
# Copy and paste a file into the same folder.
# The filenames should not begin with 'copy_of_'
cb = self.folder.manage_copyObjects(['image.gif'])
self.folder.manage_pasteObjects(cb)
self.file._finish()
self.folder['copy_of_image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failIf(self._exists('copy_of_image.gif'))
self.failUnless(self._exists('image.1.gif'))
self.assertEqual(self.folder['copy_of_image.gif'].get_size(), self._fsize(gifImage))
class TestExtImageCopyPaste(ExtFileTestCase):
'''Tests cut/copy/paste/rename/clone'''
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.folder.manage_addFolder('subfolder')
self.subfolder = self.folder['subfolder']
self.setPermissions(copymove_perms)
self.addExtImage(id='image.gif', file=gifImage)
# Add a preview image as well
self.folder['image.gif'].manage_file_upload(file=jpegImage, is_preview=1,
create_prev=UPLOAD_RESIZE,
maxx=100, maxy=100, ratio=1)
transaction.savepoint(1) # need a _p_jar
def testClone(self):
# Clone an image
self.subfolder.manage_clone(self.image, 'image.gif')
self.image._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failIf(self._exists('image.jpg.undo'))
self.failUnless(self._exists('image.1.gif'))
self.failUnless(self._exists('image.1.jpg'))
def testCopyPaste(self):
# Copy and paste an image
cb = self.folder.manage_copyObjects(['image.gif'])
self.subfolder.manage_pasteObjects(cb)
self.image._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failUnless(self._exists('image.1.jpg'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testCutPaste(self):
# Cut and paste an image
cb = self.folder.manage_cutObjects(['image.gif'])
self.subfolder.manage_pasteObjects(cb)
self.image._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failIf(self._exists('image.jpg.undo'))
self.failIf(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.jpg'))
def testRename(self):
# Rename an image
self.folder.manage_renameObject('image.gif', 'image44.gif')
self.image._finish()
self.folder['image44.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failIf(self._exists('image.jpg.undo'))
self.failIf(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.jpg'))
def testCOPY(self):
# WebDAV copy an image
req = self.app.REQUEST
req.environ['HTTP_DEPTH'] = 'infinity'
req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
self.folder['image.gif'].COPY(req, req.RESPONSE)
self.image._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failUnless(self._exists('image.1.jpg'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testMOVE(self):
# WebDAV move an image
req = self.app.REQUEST
req.environ['HTTP_DEPTH'] = 'infinity'
req.environ['HTTP_DESTINATION'] = 'http://dummy.org/%s/subfolder/image.gif' % ZopeTestCase.folder_name
self.folder['image.gif'].MOVE(req, req.RESPONSE)
self.image._finish()
self.subfolder['image.gif']._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.jpg'))
self.failIf(self._exists('image.jpg.undo'))
self.failIf(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.jpg'))
self.assertEqual(self.subfolder['image.gif'].get_size(), self._fsize(gifImage))
def testPUTRecreatesPreview(self):
# PUT an image; the preview should be regenerated.
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.failUnless(self._exists('image.jpg')) # preview
self.failIf(self._exists('image.gif.tmp'))
self.failIf(self._exists('image.jpg.tmp'))
req = self.app.REQUEST
req['BODYFILE'] = open(gifImage, 'rb')
self.image.PUT(req, req.RESPONSE)
self.failUnless(self._exists('image.gif'))
self.failUnless(self._exists('image.jpg')) # preview
self.failUnless(self._exists('image.gif.tmp')) # newly put image
self.failUnless(self._exists('image.jpg.tmp')) # regenerated preview
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.failUnless(self._exists('image.jpg')) # regenerated preview
self.failIf(self._exists('image.gif.tmp'))
self.failIf(self._exists('image.jpg.tmp'))
def testPUTRetainsPreviewBoundaries(self):
# PUT an image; the preview should retain maxx and maxy.
self.failUnless(self.image.has_preview)
self.assertEqual(self.image.prev_width(), 100)
self.assertEqual(self.image.prev_height(), 64)
req = self.app.REQUEST
req['BODYFILE'] = open(tiffImage, 'rb')
self.image.PUT(req, req.RESPONSE)
self.assertEqual(self.image.prev_width(), 100)
self.assertEqual(self.image.prev_height(), 68)
def testManageHTTPUploadDoesNotAffectPreview(self):
# HTTP upload an image; the preview should not change.
self.failUnless(self.image.has_preview)
self.assertEqual(self.image.prev_width(), 100)
self.assertEqual(self.image.prev_height(), 64)
self.image.manage_http_upload(url=self.app.TiffImage.absolute_url())
self.assertEqual(self.image.prev_width(), 100)
self.assertEqual(self.image.prev_height(), 64)
class TestRepository(ExtFileTestCase):
'''Test repository directories'''
def afterClear(self):
ExtFileTestCase.afterClear(self)
ExtFile.REPOSITORY = Config.FLAT
ExtFile.NORMALIZE_CASE = Config.KEEP
ExtFile.CUSTOM_METHOD = 'getExtFilePath'
def testRepositoryFlat(self):
ExtFile.REPOSITORY = Config.FLAT
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, [])
def testRepositorySyncZodb(self):
ExtFile.REPOSITORY = Config.SYNC_ZODB
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, [ZopeTestCase.folder_name])
def testRepositorySliced(self):
ExtFile.REPOSITORY = Config.SLICED
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['i', 'm'])
def testRepositorySlicedReverse(self):
ExtFile.REPOSITORY = Config.SLICED_REVERSE
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['e', 'g'])
def testRepositorySlicedHash(self):
ExtFile.REPOSITORY = Config.SLICED_HASH
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['F', 'E'])
def testRepositorySlicedHashDifferentFolder(self):
# Because the path is part of the hash, the results
# are different from the above test.
ExtFile.REPOSITORY = Config.SLICED_HASH
self.folder.manage_addFolder('subfolder')
self.subfolder = self.folder['subfolder']
self.addExtImage(id='image', file=gifImage, folder=self.subfolder)
path = self.image.filename[:-1]
self.assertEqual(path, ['L', 'd'])
def testRepositoryCustom(self):
def getExtFilePath(path, id):
return ['custom', 'path']
setattr(self.folder, 'getExtFilePath', getExtFilePath)
ExtFile.REPOSITORY = Config.CUSTOM
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryNormalizeCase(self):
def getExtFilePath(path, id):
return ['Custom', 'Path']
setattr(self.folder, 'getExtFilePath', getExtFilePath)
ExtFile.REPOSITORY = Config.CUSTOM
ExtFile.NORMALIZE_CASE = Config.NORMALIZE
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryCustomScript(self):
factory = self.folder.manage_addProduct['PythonScripts']
factory.manage_addPythonScript('getExtFilePath')
ps = self.folder.getExtFilePath
ps.ZPythonScript_edit(params='path, id', body="return ['custom', 'path']")
ExtFile.REPOSITORY = Config.CUSTOM
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryCustomContainer(self):
from OFS.Folder import Folder
class CustomContainer(Folder):
def __init__(self, id):
self.id = id
def getExtFilePath(self, path, id):
return ['custom', 'path']
self.folder._setObject('subfolder', CustomContainer('subfolder'))
self.folder = self.folder.subfolder
ExtFile.REPOSITORY = Config.CUSTOM
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryCustomContainerContainer(self):
from OFS.Folder import Folder
class CustomContainer(Folder):
def __init__(self, id):
self.id = id
def getExtFilePath(self, path, id):
return ['custom', 'path']
self.folder._setObject('subfolder', CustomContainer('subfolder'))
self.folder = self.folder.subfolder
self.folder._setObject('subsubfolder', Folder('subsubfolder'))
self.folder = self.folder.subsubfolder
ExtFile.REPOSITORY = Config.CUSTOM
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryCustomSubclass(self):
class CustomImage(ExtImage.ExtImage):
def getExtFilePath(self, path, id):
return ['custom', 'path']
ExtFile.REPOSITORY = Config.CUSTOM
self.folder._setObject('image', CustomImage('image'))
self.folder.image.manage_file_upload(gifImage)
path = self.folder.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
def testRepositoryCustomPrivateMethod(self):
def _getExtFilePath(path, id):
return ['custom', 'path']
setattr(self.folder, '_getExtFilePath', _getExtFilePath)
ExtFile.REPOSITORY = Config.CUSTOM
ExtFile.CUSTOM_METHOD = '_getExtFilePath'
self.addExtImage(id='image', file=gifImage)
path = self.image.filename[:-1]
self.assertEqual(path, ['custom', 'path'])
class TestRepositoryFiles(ExtFileTestCase):
'''Test repository files'''
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.folder.manage_addFolder('subfolder')
self.subfolder = self.folder['subfolder']
def testUniqueFileName(self):
# Create a unique file name
self.addExtImage(id='image', file=gifImage)
self.image._finish()
self.addExtImage(id='image', file=gifImage, folder=self.subfolder)
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
self.failIf(self._exists('image.1.gif.undo'))
def testUniquePreviewName(self):
# Create a unique preview name
self.addExtImage(id='image', file=jpegImage)
self.image.manage_create_prev(100, 100, ratio=1)
self.image._finish()
self.failUnless(self._exists('image.jpg'))
self.failIf(self._exists('image.jpg.undo'))
self.failUnless(self._exists('image.1.jpg')) # Generated previews are always jpeg
self.failIf(self._exists('image.1.jpg.undo'))
def testUndoNameOnDelete(self):
# Create a .undo file on delete
self.addExtImage(id='image', file=gifImage)
self.folder.manage_delObjects(['image'])
self.failIf(self._exists('image.gif'))
self.failUnless(self._exists('image.gif.undo'))
def testUndoNameOnDeletePreview(self):
# Create a .undo file for the preview image on delete
self.addExtImage(id='image', file=gifImage)
self.image.manage_create_prev(100, 100, ratio=1)
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.failUnless(self._exists('image.jpg')) # Generated previews are always jpeg
self.folder.manage_delObjects(['image'])
self.failIf(self._exists('image.gif'))
self.failUnless(self._exists('image.gif.undo'))
self.failIf(self._exists('image.jpg'))
self.failUnless(self._exists('image.jpg.undo'))
def testUndoNameOnUpload(self):
# Do not create a .undo file on upload
self.addExtImage(id='image', file=gifImage)
self.image.manage_file_upload(file=gifImage)
self.image._finish()
self.failUnless(self._exists('image.gif'))
self.failIf(self._exists('image.gif.undo'))
self.failIf(self._exists('image.1.gif'))
def testUndoNameIsNotReused(self):
# If an .undo file exists the name is not reused
self.addExtImage(id='image', file=gifImage)
self.folder.manage_delObjects(['image'])
self.addExtImage(id='image', file=gifImage)
self.image._finish()
self.failIf(self._exists('image.gif'))
self.failUnless(self._exists('image.gif.undo'))
self.failUnless(self._exists('image.1.gif'))
class TestRepositoryExtensions(ExtFileTestCase):
'''Test repository file extensions'''
def afterClear(self):
ExtFileTestCase.afterClear(self)
ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_REPLACE
def testDefaultContentType(self):
# Use default content type
self.addExtImage(id='image', file=notImage)
self.image._finish()
self.failUnless(self._exists('image.exe'))
def testDefaultContentTypeKeepsExistingExtension(self):
# Retain existing file extension if content type is octet-stream
self.addExtImage(id='image.foo', file=notImage)
self.image._finish()
self.failUnless(self._exists('image.foo'))
def testDefaultContentTypeMimetypeAppend(self):
# Use default content type
ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_APPEND
self.testDefaultContentType()
def testDefaultContentTypeKeepsExistingExtensionMimetypeAppend(self):
# Retain existing file extension if content type is octet-stream
ExtFile.REPOSITORY_EXTENSIONS = Config.MIMETYPE_APPEND
self.testDefaultContentTypeKeepsExistingExtension()
class TestDownloadPermission(ExtFileTestCase):
'''Tests the DownloadPermission'''
def testPermissionExists(self):
# DownloadPermission should exist
perms = self.app.permissionsOfRole('Manager')
perms = [x['name'] for x in perms if x['selected']]
self.failUnless(ExtFile.DownloadPermission in perms)
def testDownloadPermissionCheck(self):
# The use_download_permission_check property
# should control whether we can see the full image.
self.addExtImage(id='image', file=gifImage)
self.failUnless(self.image._access_permitted())
self.image.use_download_permission_check = 1
self.failIf(self.image._access_permitted())
def testShowPreviewIfNoDownloadPermission(self):
# If we don't have the permission we should only
# see the preview.
self.addExtImage(id='image', file=gifImage)
self.image.use_download_permission_check = 1
self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
dummy, dummy, dummy, preview = self.image._get_file_to_serve()
self.failUnless(preview)
def testShowIconIfNoDownloadPermission(self):
# If we don't have the permission, and there is no preview,
# we should only see the icon.
self.addExtImage(id='image', file=gifImage)
self.image.use_download_permission_check = 1
dummy, dummy, icon, dummy = self.image._get_file_to_serve()
self.failUnless(icon)
def testPreviewTagIfNoDownloadPermission(self):
# If we don't have the permission we should only
# see the preview.
self.addExtImage(id='image', file=gifImage)
self.image.use_download_permission_check = 1
self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
tag = self.image.tag()
# Permission is not checked in static mode
if self.image.static_mode():
self.failUnless(tag.find('/static/image.jpg')>=0)
else:
self.failUnless(tag.find('/image?preview=1')>=0)
def testIconTagIfNoDownloadPermission(self):
# If we don't have the permission, and there is no preview,
# we should only see the icon.
self.addExtImage(id='image', file=gifImage)
self.image.use_download_permission_check = 1
tag = self.image.tag()
self.failUnless(tag.find('/image?icon=1')>=0)
def testPreviewTagIfNotWebviewable(self):
# If the image is not webviewable we should only
# see the preview.
self.addExtImage(id='image', file=tiffImage)
self.image.manage_create_prev(maxx=10, maxy=10, ratio=1)
tag = self.image.tag()
# Permission is not checked in static mode
if self.image.static_mode():
self.failUnless(tag.find('/static/image.jpg')>=0)
else:
self.failUnless(tag.find('/image?preview=1')>=0)
class TestGetOwner(ExtFileTestCase):
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.addExtFile(id='file.zip', file=gifImage)
self.addExtImage(id='image.gif', file=gifImage)
def testFileOwner(self):
self.assertEqual(self.file.getOwner().getId(), ZopeTestCase.user_name)
self.assertEqual(self.file.getOwnerTuple(),
([ZopeTestCase.folder_name, 'acl_users'], ZopeTestCase.user_name))
def testImageOwner(self):
self.assertEqual(self.image.getOwner().getId(), ZopeTestCase.user_name)
self.assertEqual(self.image.getOwnerTuple(),
([ZopeTestCase.folder_name, 'acl_users'], ZopeTestCase.user_name))
class TestFTPget(ExtFileTestCase):
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.addExtFile(id='file.zip', file=gifImage)
self.addExtImage(id='image.gif', file=gifImage)
def testFTPgetFile(self):
from StringIO import StringIO
response = self.app.REQUEST.RESPONSE
response.stdout = StringIO() # Shut up
result = self.file.manage_FTPget()
#self.assertEqual(result, '')
self.assertEqual(response.headers.get('content-type'), 'application/zip')
self.assertEqual(response.headers.get('content-length'), '%s' % self._fsize(gifImage))
def testFTPgetImage(self):
from StringIO import StringIO
response = self.app.REQUEST.RESPONSE
response.stdout = StringIO() # Shut up
result = self.image.manage_FTPget()
#self.assertEqual(result, '')
self.assertEqual(response.headers.get('content-type'), 'image/gif')
self.assertEqual(response.headers.get('content-length'), '%s' % self._fsize(gifImage))
class TestPublish(ZopeTestCase.Functional, ExtFileTestCase):
def afterSetUp(self):
ExtFileTestCase.afterSetUp(self)
self.addExtFile(id='file.zip', file=gifImage)
self.addExtImage(id='image.gif', file=gifImage)
def testPublishFile(self):
folder_path = self.folder.absolute_url(1)
response = self.publish(folder_path+'/file.zip')
self.assertEqual(response.getStatus(), 200)
self.failUnless(response.getHeader('Content-Type').startswith('application/zip'))
def testPublishImage(self):
folder_path = self.folder.absolute_url(1)
response = self.publish(folder_path+'/image.gif')
self.assertEqual(response.getStatus(), 200)
self.failUnless(response.getHeader('Content-Type').startswith('image/gif'))
def test_suite():
from unittest import TestSuite, makeSuite
suite = TestSuite()
suite.addTest(makeSuite(TestExtFileAdd))
suite.addTest(makeSuite(TestExtImageAdd))
suite.addTest(makeSuite(TestExtFileUpload))
suite.addTest(makeSuite(TestExtImageUpload))
suite.addTest(makeSuite(TestExtFileContentType))
suite.addTest(makeSuite(TestExtImageContentType))
suite.addTest(makeSuite(TestExtFileCopyPaste))
suite.addTest(makeSuite(TestExtImageCopyPaste))
suite.addTest(makeSuite(TestRepository))
suite.addTest(makeSuite(TestRepositoryFiles))
suite.addTest(makeSuite(TestRepositoryExtensions))
suite.addTest(makeSuite(TestDownloadPermission))
suite.addTest(makeSuite(TestGetOwner))
suite.addTest(makeSuite(TestFTPget))
suite.addTest(makeSuite(TestPublish))
return suite
if __name__ == '__main__':
framework()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>