def testScaleInvalidation(self): data = getData('image.gif') folder = self.folder image = folder[folder.invokeFactory('Image', id='foo', image=data)] # first view the thumbnail of the original image traverse = folder.REQUEST.traverseName thumb1 = traverse(image, 'image_thumb') # now upload a new one and make sure the thumbnail has changed image.update(image=getData('image.jpg')) traverse = folder.REQUEST.traverseName thumb2 = traverse(image, 'image_thumb') self.failIf(thumb1.data == thumb2.data, 'thumb not updated?')
def testEditTranslatedBlobelFish(self): guide = getData('plone.pdf') fish = self.folder[self.folder.invokeFactory('BlobelFish', 'flobby')] fish.update(title='Me fish.', guide=guide, language='en') # add a translation and then upload a new file... fisch = fish.addTranslation('de', title='Ich Fisch.') blob = fish.getGuide().getBlob() test = getData('test.pdf') fish.update(guide=makeFileUpload(test, 'test.pdf')) self.assertNotEqual(fish.getGuide().getBlob(), blob) self.assertEqual(fish.getGuide().getBlob(), fisch.getGuide().getBlob()) self.assertEqual(str(fish.getGuide()), test) self.assertEqual(str(fisch.getGuide()), test)
def testGSContentCompatible(self): foo = self.folder[self.folder.invokeFactory('File', 'foo', title='foo', file=getData('plone.pdf'))] self.assertTrue(IFilesystemExporter(foo)) self.assertTrue(IFilesystemImporter(foo))
def testSearchableText(self): foo = self.folder[self.folder.invokeFactory('File', 'foo', title='foo', file=getData('plone.pdf'))] data = foo.SearchableText() self.assertTrue('foo' in data) self.assertTrue('Plone' in data, 'pdftohtml not installed?') self.assertFalse('PDF' in data)
def testCustomSizes(self): data = getData('image.gif') folder = self.folder image = folder[folder.invokeFactory('Image', id='foo', image=data)] # set custom image sizes iprops = self.portal.portal_properties.imaging_properties iprops.manage_changeProperties(allowed_sizes=['foo 23:23', 'bar 6:8']) # make sure traversing works with the new sizes traverse = folder.REQUEST.traverseName foo = traverse(image, 'image_foo') self.assertEqual(foo.getContentType(), 'image/png') self.assertEqual(foo.data[:4], '\x89PNG') self.assertEqual(foo.width, 23) self.assertEqual(foo.height, 23) # also check the generated tag url = image.absolute_url() + '/image_foo' tag = '<img src="%s" alt="foo" title="foo" height="23" width="23" />' self.assertEqual(foo.tag(), tag % url) # and the other specified size bar = traverse(image, 'image_bar') self.assertEqual(bar.getContentType(), 'image/png') self.assertEqual(bar.data[:4], '\x89PNG') self.assertEqual(bar.width, 6) self.assertEqual(bar.height, 6) # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 2)
def testBlobPath(self): foo = self.folder[self.folder.invokeFactory('File', 'foo', title='foo', file=getData('plone.pdf'))] field = foo.getField('file') blobfile = field.get(foo).blob._p_blob_committed tempdir = self.app._p_jar._storage.temporaryDirectory() self.assertTrue(blobfile.endswith(SAVEPOINT_SUFFIX)) self.assertTrue(blobfile.startswith(tempdir))
def testSearchableText(self): blob = self.folder[self.folder.invokeFactory('Blob', 'blob', title='foo', file=getData('plone.pdf'))] data = blob.SearchableText() self.failUnless('blob' in data) self.failUnless('foo' in data) self.failUnless('Plone' in data, 'pdftohtml not installed?') self.failIf('PDF' in data)
def afterSetUp(self): data = getData('image.gif') folder = self.folder self.image = folder[folder.invokeFactory('Image', id='foo', image=data)] self.field = self.image.getField('image') self.handler = BlobImageScaleHandler(self.field) iprops = self.portal.portal_properties.imaging_properties iprops.manage_changeProperties(allowed_sizes=['foo 60:60'])
def testIndexAccessor(self): foo = self.folder[self.folder.invokeFactory('File', 'foo', title='foo', file=getData('plone.pdf'))] field = foo.getField('file') accessor = field.getIndexAccessor(foo) self.assertEqual(field.index_method, accessor.func_name) data = accessor() self.assertTrue('Plone' in data, 'pdftohtml not installed?') self.assertFalse('PDF' in data)
def testIndexAccessor(self): blob = self.folder[self.folder.invokeFactory('Blob', 'blob', title='foo', file=getData('plone.pdf'))] field = blob.getField('file') accessor = field.getIndexAccessor(blob) self.assertEqual(field.index_method, accessor.func_name) data = accessor() self.failUnless('Plone' in data, 'pdftohtml not installed?') self.failIf('PDF' in data)
def testScaleInvalidation(self): image = self.folder['foo-image'] # first view the thumbnail of the original image traverse = self.layer['request'].traverseName thumb1 = traverse(image, 'image_thumb') # now upload a new one and make sure the thumbnail has changed image.update(image=getData('image.jpg')) thumb2 = traverse(image, 'image_thumb') self.assertFalse(thumb1.data == thumb2.data, 'thumb not updated?')
def testSearchableText(self): blob = self.folder['blob'] blob.setTitle('foo') blob.setFile(getData('plone.pdf')) data = blob.SearchableText() self.assertTrue('blob' in data) self.assertTrue('foo' in data) self.assertTrue('Plone' in data, 'pdftohtml not installed?') self.assertFalse('PDF' in data)
def testIndexAccessor(self): blob = self.folder['blob'] blob.setTitle('foo') blob.setFile(getData('plone.pdf')) field = blob.getField('file') accessor = field.getIndexAccessor(blob) self.assertEqual(field.index_method, accessor.func_name) data = accessor() self.assertTrue('Plone' in data, 'pdftohtml not installed?') self.assertFalse('PDF' in data)
def testCreateBlobelFish(self): guide = getData('plone.pdf') foo = self.folder[self.folder.invokeFactory('BlobelFish', 'flobby')] foo.update(title='Me fish.', guide=guide, language='en') # check content item self.assertEqual(foo.Title(), 'Me fish.') self.assertEqual(foo.Language(), 'en') self.assertEqual(foo.getPortalTypeName(), 'BlobelFish') self.assertEqual(foo.getContentType(), 'application/pdf') self.assertEqual(str(foo.getGuide()), guide)
def testScalingViaBlobAdapter(self): # make sure `getScale` of the blob-specific scale handler is called self.counter = 0 data = getData('image.gif') # make sure traversing works as expected base = '/'.join(self.folder.getPhysicalPath()) credentials = self.getCredentials() response = self.publish(base + '/foo-image/image', basic=credentials) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), data) self.assertEqual(self.counter, 1)
def testGSContentCompatible(self): foo = self.folder[ self.folder.invokeFactory( 'File', 'foo', title='foo', file=getData('plone.pdf') ) ] self.assertTrue(IFilesystemExporter(foo)) self.assertTrue(IFilesystemImporter(foo))
def testCreateAndRemoveTranslatedBlobelFish(self): guide = getData('plone.pdf') fish = self.folder[self.folder.invokeFactory('BlobelFish', 'flobby')] fish.update(title='Me fish.', guide=guide, language='en') # add a translation, after which both should use the same blob... fisch = fish.addTranslation('de', title='Ich Fisch.') self.assertEqual(fish.getGuide().getBlob(), fisch.getGuide().getBlob()) self.assertEqual(getattr(self.folder, 'flobby-de'), fisch) # now let's remove it again and make sure the blob's still okay... fish.removeTranslation('de') self.assertRaises(AttributeError, getattr, self.folder, 'flobby-de') self.assertEqual(str(fish.getGuide()), guide)
def testOutsideRange(self): # ranges outside the file size also have to work blob = self.folder['blob'] blob.setTitle('foo') blob.setFile(getData('plone.pdf')) data = blob.getFile().getBlob().open('r').read() l = len(data) request = self.folder.REQUEST request.environ['HTTP_RANGE'] = 'bytes={}-{}'.format(l * 2, l * 3) iterator = blob.download(request) self.assertEqual(data, ''.join(iterator)) request.environ['HTTP_RANGE'] = 'bytes={}-'.format(l * 2) iterator = blob.download(request) self.assertEqual(data, ''.join(iterator))
def testCreateTranslatedBlobelFish(self): guide = getData('plone.pdf') fish = self.folder[self.folder.invokeFactory('BlobelFish', 'flobby')] fish.update(title='Me fish.', guide=guide, language='en') # add a translation and check it fisch = fish.addTranslation('de', title='Ich Fisch.') self.assertEqual(fisch.Title(), 'Ich Fisch.') self.assertEqual(fisch.Language(), 'de') self.assertEqual(fisch.getPortalTypeName(), 'BlobelFish') self.assertEqual(fisch.getContentType(), 'application/pdf') self.assertEqual(str(fisch.getGuide()), guide) # as the field is language-independent both translations should # be using the same blob... self.assertEqual(fish.getGuide().getBlob(), fisch.getGuide().getBlob())
def setUpPloneSite(self, portal): for name in ['file', 'image']: self.applyProfile(portal, 'plone.app.blob:%s-replacement' % name) # allow creating the replaced types types = getToolByName(portal, 'portal_types') assert types.getTypeInfo('Blob').product == 'plone.app.blob' types.getTypeInfo('ATFile').global_allow = True types.getTypeInfo('ATImage').global_allow = True testing.setRoles(portal, testing.TEST_USER_ID, ['Manager']) folder = portal.portal_membership.getHomeFolder(testing.TEST_USER_ID) image = StringIO(getData('image.gif')) image.filename = 'original.gif' folder.invokeFactory('Image', id='foo-image', title='an image', image=image)
def testPublishCustomSize(self): data = getData('image.gif') self.folder.invokeFactory('Image', id='foo', image=data) # set custom image sizes iprops = self.portal.portal_properties.imaging_properties iprops.manage_changeProperties(allowed_sizes=['foo 23:23']) # make sure traversing works as expected base = '/'.join(self.folder.getPhysicalPath()) credentials = self.getCredentials() response = self.publish(base + '/foo/image_foo', basic=credentials) self.assertEqual(response.getStatus(), 200) foo = open(StringIO(response.getBody())) self.assertEqual(foo.format, 'PNG') self.assertEqual(foo.size, (23, 23)) # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 3)
def testBlobCreation(self): data = getData('image.gif') folder = self.folder image = folder[folder.invokeFactory('Image', id='foo', image=data)] # make sure the scaled version is actually stored in a blob; we # also count invocations of `createScale`, which should be 0 still self.assertEqual(self.counter, 0) traverse = folder.REQUEST.traverseName thumb = traverse(image, 'image_thumb') blob = getattr(image, blobScalesAttr)['image']['thumb']['blob'] self.failUnless(isinstance(blob, Blob), 'no blob?') self.assertEqual(blob.open('r').read(), thumb.data) self.assertEqual(self.counter, 1) # the scale was created, now let's access it a few more times thumb = traverse(image, 'image_thumb') thumb = traverse(image, 'image_thumb') self.assertEqual(self.counter, 1)
def testScalingViaBlobAdapter(self): # make sure `getScale` of the blob-specific scale handler is called self.counter = 0 original = BlobImageScaleHandler.getScale def getScale(adapter, instance, scale): self.counter += 1 return original(adapter, instance, scale) BlobImageScaleHandler.getScale = getScale data = getData('image.gif') self.folder.invokeFactory('Image', id='foo', image=data) # make sure traversing works as expected base = '/'.join(self.folder.getPhysicalPath()) credentials = self.getCredentials() response = self.publish(base + '/foo/image', basic=credentials) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), data) # undo the evil monkey patching... BlobImageScaleHandler.getScale = original # and make sure the traversal adapter was call in fact self.assertEqual(self.counter, 1)
def testRangeSupport(self): blob = self.folder[self.folder.invokeFactory('Blob', 'blob', title='foo', file=getData('plone.pdf'))] data = blob.getFile().getBlob().open('r').read() request = self.folder.REQUEST request.environ['HTTP_RANGE'] = 'bytes=2-10' iterator = blob.download(request) self.assertEqual(data[2:10+1], iterator.next()) # ranges should also work with multiple chunks read from the blob request.environ['HTTP_RANGE'] = 'bytes=2-10' iterator = blob.download(request) iterator.streamsize = 5 self.assertEqual(data[2:2+5], iterator.next()) self.assertEqual(data[2+5:10+1], iterator.next()) # open and suffix ranges also have to work request.environ['HTTP_RANGE'] = 'bytes=2-' iterator = blob.download(request) self.assertEqual(data[2:], ''.join(iterator)) request.environ['HTTP_RANGE'] = 'bytes=-20' iterator = blob.download(request) self.assertEqual(data[-20:], ''.join(iterator))
def testImageThumb(self): data = getData('image.gif') image = self.folder['foo-image'] # make sure traversing works as is and with scaling traverse = self.layer['request'].traverseName self.assertEqual(traverse(image, 'image').data, data) sizes = image.getField('image').getAvailableSizes(image) self.assertTrue('thumb' in sizes.keys()) thumb = traverse(image, 'image_thumb') self.assertEqual(thumb.getContentType(), 'image/gif') self.assertEqual(thumb.data[:6], 'GIF87a') width, height = sizes['thumb'] self.assertEqual(thumb.width, width) self.assertEqual(thumb.height, height) # also check the generated tag url = image.absolute_url() + '/image_thumb' tag = '<img src="%s" alt="an image" title="an image" height="%d" width="%d" />' self.assertEqual(thumb.tag(), tag % (url, height, width)) # calling str(...) on the scale should return the tag self.assertEqual(str(thumb), thumb.tag()) # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 2)
def testRangeSupport(self): blob = self.folder['blob'] blob.setTitle('foo') blob.setFile(getData('plone.pdf')) data = blob.getFile().getBlob().open('r').read() request = self.folder.REQUEST request.environ['HTTP_RANGE'] = 'bytes=2-10' iterator = blob.download(request) self.assertEqual(data[2:10 + 1], iterator.next()) # ranges should also work with multiple chunks read from the blob request.environ['HTTP_RANGE'] = 'bytes=2-10' iterator = blob.download(request) iterator.streamsize = 5 self.assertEqual(data[2:2 + 5], iterator.next()) self.assertEqual(data[2 + 5:10 + 1], iterator.next()) # open and suffix ranges also have to work request.environ['HTTP_RANGE'] = 'bytes=2-' iterator = blob.download(request) self.assertEqual(data[2:], ''.join(iterator)) request.environ['HTTP_RANGE'] = 'bytes=-20' iterator = blob.download(request) self.assertEqual(data[-20:], ''.join(iterator))
def testPublishThumb(self): data = getData('image.gif') # make sure traversing works as is and with scaling base = '/'.join(self.folder.getPhysicalPath()) credentials = self.getCredentials() # first the image itself... response = self.publish(base + '/foo-image', basic=credentials) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), data) self.assertEqual(response.getHeader('Content-Type'), 'image/gif') # then the field without a scale name response = self.publish(base + '/foo-image/image', basic=credentials) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody(), data) self.assertEqual(response.getHeader('Content-Type'), 'image/gif') # and last a scaled version response = self.publish(base + '/foo-image/image_thumb', basic=credentials) self.assertEqual(response.getStatus(), 200) self.assertEqual(response.getBody()[:6], 'GIF87a') self.assertEqual(response.getHeader('Content-Type'), 'image/gif') # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 9)
def testCustomSizeChange(self): data = getData('image.gif') folder = self.folder image = folder[folder.invokeFactory('Image', id='foo', image=data)] # set custom image sizes & view a scale iprops = self.portal.portal_properties.imaging_properties iprops.manage_changeProperties(allowed_sizes=['foo 23:23']) traverse = folder.REQUEST.traverseName foo = traverse(image, 'image_foo') self.assertEqual(foo.width, 23) self.assertEqual(foo.height, 23) # now let's update the scale dimensions, after which the scale # should still be the same... iprops.manage_changeProperties(allowed_sizes=['foo 42:42']) foo = traverse(image, 'image_foo') self.assertEqual(foo.width, 23) self.assertEqual(foo.height, 23) # we first need to trigger recreation of all scales... self.portal.portal_atct.recreateImageScales() foo = traverse(image, 'image_foo') self.assertEqual(foo.width, 42) self.assertEqual(foo.height, 42)
def testImageThumb(self): data = getData('image.gif') image = self.folder['foo-image'] # make sure traversing works as is and with scaling traverse = self.layer['request'].traverseName self.assertEqual(traverse(image, 'image').data, data) sizes = image.getField('image').getAvailableSizes(image) self.assertTrue('thumb' in sizes.keys()) thumb = traverse(image, 'image_thumb') self.assertEqual(thumb.getContentType(), 'image/gif') self.assertEqual(thumb.data[:6], 'GIF87a') width, height = sizes['thumb'] self.assertEqual(thumb.width, width) self.assertEqual(thumb.height, height) # also check the generated tag url = image.absolute_url() + '/image_thumb' tag = '<img src="{0}" alt="an image" title="an image" height="{1}" width="{2}" />' # noqa self.assertEqual(thumb.tag(), tag.format(url, height, width)) # calling str(...) on the scale should return the tag self.assertEqual(str(thumb), thumb.tag()) # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 2)
def testImageThumb(self): data = getData('image.gif') folder = self.folder image = folder[folder.invokeFactory('Image', id='foo', image=data)] # make sure traversing works as is and with scaling traverse = folder.REQUEST.traverseName self.assertEqual(traverse(image, 'image').data, data) sizes = image.getField('image').getAvailableSizes(image) self.failUnless('thumb' in sizes.keys()) thumb = traverse(image, 'image_thumb') self.assertEqual(thumb.getContentType(), 'image/png') self.assertEqual(thumb.data[:4], '\x89PNG') width, height = sizes['thumb'] self.assertEqual(thumb.width, width) self.assertEqual(thumb.height, height) # also check the generated tag url = image.absolute_url() + '/image_thumb' tag = '<img src="%s" alt="foo" title="foo" height="%d" width="%d" />' self.assertEqual(thumb.tag(), tag % (url, height, width)) # calling str(...) on the scale should return the tag self.assertEqual(str(thumb), thumb.tag()) # make sure the traversal adapter was call in fact self.assertEqual(self.counter, 2)