def testImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('ATImage', id='foo', title='an image', image=gif, subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('Image') foo.reindexObject(idxs=('portal_type', )) # check to be migrated content self.assertTrue(isinstance(foo, ATImage), 'not an image?') self.assertEqual(foo.Title(), 'an image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) # migrate & check migrated content item self.assertEqual( migrateATBlobImages(self.portal), 'Migrating /plone/Members/test_user_1_/foo (Image -> Image)\n') foo = self.folder['foo'] self.assertTrue(isinstance(foo, ATBlob), 'not a blob?') self.assertTrue(isinstance(foo.getField('image'), BlobField), 'no blob?') self.assertEqual(foo.Title(), 'an image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), gif)
def testImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('ATImage', id='foo', title='an image', image=gif, subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('Image') foo.reindexObject(idxs=('portal_type', )) # check to be migrated content self.assertTrue(isinstance(foo, ATImage), 'not an image?') self.assertEqual(foo.Title(), 'an image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) # migrate & check migrated content item self.assertEqual(migrateATBlobImages(self.portal), 'Migrating /plone/Members/test_user_1_/foo (Image -> Image)\n') foo = self.folder['foo'] self.assertTrue(isinstance(foo, ATBlob), 'not a blob?') self.assertTrue(isinstance(foo.getField('image'), BlobField), 'no blob?') self.assertEqual(foo.Title(), 'an image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), gif)
def testCatalogAfterImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('ATImage', id='foo', title='an image', image=gif, subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('Image') foo.reindexObject(idxs=('portal_type',)) # remember the catalog data so it can be checked catalog = self.portal.portal_catalog rid = catalog(id='foo')[0].getRID() index_data = catalog.getIndexDataForRID(rid) meta_data = catalog.getMetadataForRID(rid) # migrate & check migrated content item self.assertEqual(migrateATBlobImages(self.portal), 'Migrating /plone/Members/test_user_1_/foo (Image -> Image)\n') foo = self.folder['foo'] brain = catalog(id='foo')[0] self.assertEqual(foo.UID(), brain.UID) self.assertEqual(foo.getObjSize(), brain.getObjSize) self.assertEqual(foo.getPortalTypeName(), brain.Type) # compare pre-migration and current catalog data... okay = ('meta_type', 'Type', 'object_provides', 'Language') for key, value in catalog.getIndexDataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(index_data[key], value, 'index: %s' % key) okay = ('meta_type', 'getIcon') for key, value in catalog.getMetadataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(meta_data[key], value, 'meta: %s' % key) # also make sure the `Type` index has been updated correctly brains = catalog(Type='Image') self.assertEqual([b.getObject() for b in brains], [foo])
def testCreateImageBlob(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('Image', 'foo')] foo.update(title="I'm blob", image=gif) # check content item self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(str(foo.getImage()), gif) # also make sure we're using blobs self.assertTrue(isinstance(foo, ATBlob), 'no atblob?') self.assertTrue(isinstance(foo.getField('image'), BlobField), 'no blob?') blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), gif) # let's also check the `getSize`, `tag` and `index_html` methods # as well as the size attributes self.assertEqual(foo.getSize(), (1, 1)) self.assertEqual(foo.width, 1) self.assertEqual(foo.height, 1) self.assertTrue('/foo/image"' in foo.tag()) # `index_html` should return a stream-iterator request = foo.REQUEST response = request.RESPONSE self.assertEqual(foo.index_html(request, response).next(), gif) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.headers['content-length'], '43') self.assertEqual(response.headers['content-type'], 'image/gif')
def testCreateImageBlob(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('Image', 'foo')] foo.update(title="I'm blob", image=gif) # check content item self.assertEqual(foo.getPortalTypeName(), 'Image') self.assertEqual(foo.getContentType(), 'image/gif') self.assertEqual(str(foo.getImage()), gif) # also make sure we're using blobs self.assertTrue(isinstance(foo, ATBlob), 'no atblob?') self.assertTrue(isinstance(foo.getField('image'), BlobField), 'no blob?') blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), gif) # let's also check the `getSize`, `tag` and `index_html` methods # as well as the size attributes self.assertEqual(foo.getSize(), (1, 1)) self.assertEqual(foo.width, 1) self.assertEqual(foo.height, 1) self.assertTrue('/foo/image"' in foo.tag()) # `index_html` should return a stream-iterator request = foo.REQUEST response = request.RESPONSE self.assertEqual(next(foo.index_html(request, response)), gif) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.headers['content-length'], '43') self.assertEqual(response.headers['content-type'], 'image/gif')
def testIcon(self): blob = self.folder.blob blob.update(file=getImage()) self.assertEqual(blob.getIcon(), 'plone/image.png') blob.update(file=pdf_data) self.assertEqual(blob.getIcon(), 'plone/pdf.png') blob.update(file='some text...') self.assertEqual(blob.getIcon(), 'plone/txt.png')
def testIcon(self): blob = self.folder.blob blob.update(file=getImage()) self.assertTrue(blob.getIcon().endswith('image.png')) blob.update(file=pdf_data) self.assertTrue(blob.getIcon().endswith('pdf.png')) blob.update(file='some text...') self.assertTrue(blob.getIcon().endswith('txt.png'))
def testSize(self): blob = self.folder['blob'] # test with a small file gif = getImage() blob.update(file=makeFileUpload(gif, 'test.gif')) self.assertEqual(blob.get_size(), len(gif)) # and a large one blob.update(file=makeFileUpload(largefile_data, 'test.txt')) self.assertEqual(blob.get_size(), len(largefile_data))
def testIcon(self): self.folder.invokeFactory('Blob', 'blob', title='foo') blob = self.folder.blob blob.update(file=getImage()) self.assertEqual(blob.getIcon(), 'plone/image.png') blob.update(file=pdf_data) self.assertEqual(blob.getIcon(), 'plone/pdf.png') blob.update(file='some text...') self.assertEqual(blob.getIcon(), 'plone/txt.png')
def testModificationTimeDuringInlineImageMigration(self): foo = self.folder[self.folder.invokeFactory('Image', id='foo')] foo.schema['image'] = ImageField('image', storage=AnnotationStorage()) foo.schema['image'].set(foo, getImage()) # record the modification date before migration mod = foo.modified() # migrate using inline migrator migrate(self.portal, portal_type='Image', meta_type='ATBlob') # the modification date isn't changed by migration self.assertEqual(mod, foo.modified())
def testBlobbableOFSImage(self): gif = getImage() obj = Image('foo', 'Foo', StringIO(gif)) obj.filename = 'foo.gif' blobbable = IBlobbable(obj) target = Blob() blobbable.feed(target) self.assertEqual(target.open('r').read(), gif) self.assertEqual(blobbable.filename(), 'foo.gif') self.assertEqual(blobbable.mimetype(), 'image/gif')
def testStringValue(self): blob = self.folder['blob'] value = getImage() blob.update(title="I'm blob", file=value) self.assertEqual(blob.getContentType(), 'image/gif') self.assertEqual(str(blob.getFile()), value) blob.update(title="I'm blob", file='plain text') self.assertEqual(blob.getContentType(), 'text/plain') self.assertEqual(str(blob.getFile()), 'plain text') blob.update(title="I'm blob", file='') self.assertEqual(blob.getContentType(), 'text/plain') self.assertEqual(str(blob.getFile()), '')
def testModificationTimeDuringInlineImageMigration(self): foo = self.folder[self.folder.invokeFactory('Image', id='foo')] foo.schema['image'] = ImageField('image', storage=AnnotationStorage()) foo.schema['image'].set(foo, getImage()) # record the modification date before migration mod = foo.modified() # migrate using inline migrator migrate(self.portal, portal_type='Image', meta_type='ATBlob') # the modification date isn't changed by migration self.assertEqual(mod, foo.modified()) # cleanup del foo.schema['image']
def testCatalogAfterImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('ATImage', id='foo', title='an image', image=gif, subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('Image') foo.reindexObject(idxs=('portal_type', )) # remember the catalog data so it can be checked catalog = self.portal.portal_catalog rid = catalog(id='foo')[0].getRID() index_data = catalog.getIndexDataForRID(rid) meta_data = catalog.getMetadataForRID(rid) # migrate self.assertEqual( migrateATBlobImages(self.portal), 'Migrating /plone/Members/test_user_1_/foo (Image -> Image)\n') foo = self.folder['foo'] # Re-index date based indexes. It seems they're not properly re-indexed # after the migration is executed. Without this the tests may fail # due to to timing issues. Remember DateTimeIndex have resolution of # 1 minute. foo.reindexObject(idxs=('Date', 'created', 'modified', 'effective')) # check migrated content item brain = catalog(id='foo')[0] self.assertEqual(foo.UID(), brain.UID) self.assertEqual(foo.getObjSize(), brain.getObjSize) self.assertEqual(foo.getPortalTypeName(), brain.Type) # compare pre-migration and current catalog data... okay = ('meta_type', 'Type', 'object_provides', 'Language') for key, value in catalog.getIndexDataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual( index_data[key], value, 'index: %s, old: %s, new: %s' % (key, index_data[key], value)) okay = ('meta_type', 'getIcon') for key, value in catalog.getMetadataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(meta_data[key], value, 'meta: %s' % key) # also make sure the `Type` index has been updated correctly brains = catalog(Type='Image') self.assertEqual([b.getObject() for b in brains], [foo])
def testOldScalesRemovedDuringInlineImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('Image', id='foo', title='an image', image=gif)] # fake an old ImageField in the class schema, # and store scales in AnnotationStorage foo.schema['image'] = ImageField('image', storage=AnnotationStorage()) foo.schema['image'].set(foo, gif) isimage = lambda i: isinstance(i, Image) self.failUnless(filter(isimage, IAnnotations(foo).values())) # migrate using inline migrator migrate(self.portal, portal_type='Image', meta_type='ATBlob') # make sure all scale annotations were removed self.failIf(filter(isimage, IAnnotations(foo).values()))
def testCatalogAfterImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('ATImage', id='foo', title='an image', image=gif, subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('Image') foo.reindexObject(idxs=('portal_type', )) # remember the catalog data so it can be checked catalog = self.portal.portal_catalog rid = catalog(id='foo')[0].getRID() index_data = catalog.getIndexDataForRID(rid) meta_data = catalog.getMetadataForRID(rid) # migrate self.assertEqual(migrateATBlobImages(self.portal), 'Migrating /plone/Members/test_user_1_/foo (Image -> Image)\n') foo = self.folder['foo'] # Re-index date based indexes. It seems they're not properly re-indexed # after the migration is executed. Without this the tests may fail # due to to timing issues. Remember DateTimeIndex have resolution of # 1 minute. foo.reindexObject(idxs=('Date', 'created', 'modified', 'effective')) # check migrated content item brain = catalog(id='foo')[0] self.assertEqual(foo.UID(), brain.UID) self.assertEqual(foo.getObjSize(), brain.getObjSize) self.assertEqual(foo.getPortalTypeName(), brain.Type) # compare pre-migration and current catalog data... okay = ('meta_type', 'Type', 'object_provides', 'Language') for key, value in catalog.getIndexDataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual( index_data[key], value, 'index: %s, old: %s, new: %s' % (key, index_data[key], value) ) okay = ('meta_type', 'getIcon') for key, value in catalog.getMetadataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(meta_data[key], value, 'meta: %s' % key) # also make sure the `Type` index has been updated correctly brains = catalog(Type='Image') self.assertEqual([b.getObject() for b in brains], [foo])
def testWebDavUpdate(self): image = StringIO(getImage()) image.filename = 'original.gif' base = '/'.join(self.folder.getPhysicalPath()) response = self.publish(base + '/foo-image', request_method='PUT', stdin=image, basic=self.getCredentials(), env={'CONTENT_TYPE': 'image/gif'}) self.assertEqual(response.getStatus(), 204) self.assertTrue('foo-image' in self.folder.objectIds()) fooimage = self.folder['foo-image'] self.assertEqual(fooimage.getId(), 'foo-image') self.assertEqual(fooimage.Title(), 'an image') # as opposed to during file upload, editing a file via webdav (e.g. # using the "external editor" feature) should not change the filename self.assertEqual(fooimage.getFilename(), 'original.gif')
def testWebDavUpload(self): image = StringIO(getImage()) image.filename = 'original.gif' base = '/'.join(self.folder.getPhysicalPath()) response = self.publish(base + '/image', request_method='PUT', stdin=image, basic=self.getCredentials(), env={'CONTENT_TYPE': 'image/gif'}) self.assertEqual(response.getStatus(), 201) self.assertTrue('image' in self.folder.objectIds()) obj = self.folder.image self.assertEqual(obj.getPortalTypeName(), 'Image') self.assertTrue(IATBlobImage.providedBy(obj), 'no blob?') self.assertEqual(str(obj.getField('image').get(obj)), image.getvalue()) # on initial (webdav) upload no filename is set by the client, # so it should end up being equal to the last path/url component... self.assertEqual(obj.getFilename(), 'image')
def testOldScalesRemovedDuringInlineImageMigration(self): gif = getImage() foo = self.folder[self.folder.invokeFactory('Image', id='foo', title='an image', image=gif)] # fake an old ImageField in the class schema, # and store scales in AnnotationStorage foo.schema['image'] = ImageField('image', storage=AnnotationStorage()) foo.schema['image'].set(foo, gif) isimage = lambda i: isinstance(i, Image) self.assertTrue(filter(isimage, IAnnotations(foo).values())) # migrate using inline migrator migrate(self.portal, portal_type='Image', meta_type='ATBlob') # make sure all scale annotations were removed self.assertFalse(filter(isimage, IAnnotations(foo).values())) # cleanup del foo.schema['image']
def testWebDavUpload(self): image = StringIO(getImage()) image.filename = 'original.gif' base = '/'.join(self.folder.getPhysicalPath()) response = self.publish(base + '/image', request_method='PUT', stdin=image, basic=self.getCredentials(), env={'CONTENT_TYPE': 'image/gif'}) self.assertEqual(response.getStatus(), 201) self.failUnless('image' in self.folder.objectIds()) obj = self.folder.image self.assertEqual(obj.getPortalTypeName(), 'Image') self.failUnless(IATBlobImage.providedBy(obj), 'no blob?') self.assertEqual(str(obj.getField('image').get(obj)), image.getvalue()) # on initial (webdav) upload no filename is set by the client, # so it should end up being equal to the last path/url component... self.assertEqual(obj.getFilename(), 'image')
def testWebDavUpdate(self): image = StringIO(getImage()) image.filename = "original.gif" base = "/".join(self.folder.getPhysicalPath()) response = self.publish( base + "/foo-image", request_method="PUT", stdin=image, basic=self.getCredentials(), env={"CONTENT_TYPE": "image/gif"}, ) self.assertEqual(response.getStatus(), 204) self.assertTrue("foo-image" in self.folder.objectIds()) fooimage = self.folder["foo-image"] self.assertEqual(fooimage.getId(), "foo-image") self.assertEqual(fooimage.Title(), "an image") # as opposed to during file upload, editing a file via webdav (e.g. # using the "external editor" feature) should not change the filename self.assertEqual(fooimage.getFilename(), "original.gif")
def testWebDavUpload(self): image = StringIO(getImage()) image.filename = "original.gif" base = "/".join(self.folder.getPhysicalPath()) response = self.publish( base + "/image", request_method="PUT", stdin=image, basic=self.getCredentials(), env={"CONTENT_TYPE": "image/gif"}, ) self.assertEqual(response.getStatus(), 201) self.assertTrue("image" in self.folder.objectIds()) obj = self.folder.image self.assertEqual(obj.getPortalTypeName(), "Image") self.assertTrue(IATBlobImage.providedBy(obj), "no blob?") self.assertEqual(str(obj.getField("image").get(obj)), image.getvalue()) # on initial (webdav) upload no filename is set by the client, # so it should end up being equal to the last path/url component... self.assertEqual(obj.getFilename(), "image")
def testMimetypeGuessing(self): gif = StringIO(getImage()) self.assertEqual(guessMimetype(gif), 'image/gif') self.assertEqual(guessMimetype(gif, 'image.jpg'), 'image/jpeg') self.assertEqual(guessMimetype(StringIO(), 'image.jpg'), 'image/jpeg') self.assertEqual(guessMimetype(StringIO('foo')), 'text/plain')