ATFile/ATImage Replacement Types ================================ This test tries to make sure the new, blob-based replacement types for `ATFile` and `ATImage` can be properly created and edited. Files ----- Let's start with creating a "File" content item: >>> from StringIO import StringIO >>> from plone.testing.z2 import Browser >>> browser = Browser(layer['app']) >>> from plone.app.testing import TEST_USER_NAME, TEST_USER_PASSWORD >>> browser.addHeader('Authorization', ... 'Basic %s:%s' % (TEST_USER_NAME, TEST_USER_PASSWORD)) >>> from plone.app.testing import TEST_USER_ID >>> folder = layer['portal'].portal_membership.getHomeFolder(TEST_USER_ID) >>> browser.open(folder.absolute_url()) >>> browser.getLink(url='createObject?type_name=File').click() >>> browser.url 'http://nohost/plone/.../portal_factory/File/file.../edit...' >>> browser.getControl(name='title').value = 'Foo' >>> control = browser.getControl(name='file_file') >>> control.filename = 'foo.pdf' >>> control.value = StringIO('%PDF-1.4 fake pdf...' + 'foo' * 1000) >>> browser.getControl('Save').click() >>> browser.url 'http://nohost/plone/.../foo.../view' >>> browser.contents '...Info...Changes saved... ...Foo...foo.pdf...PDF document...' Now let's make sure we can also edit it: >>> browser.getLink('Edit').click() >>> browser.getControl(name='title').value = 'Foobar' >>> browser.getControl('Replace with new file').selected = True >>> control = browser.getControl(name='file_file') >>> control.filename = 'foobar.pdf' >>> control.value = StringIO('%PDF-1.4 fake pdf...' + 'foobar' * 1000) >>> browser.getControl('Save').click() >>> browser.url 'http://nohost/plone/.../foo.../view' >>> browser.contents '...Info...Changes saved... ...Foobar...foobar.pdf...PDF document...' It should also be possible to remove the file again. For this to work the field must not be required. That is not the default in Plone, however, so we need to tweak the schema first: >>> folder.foo.getPrimaryField().required = False >>> browser.getLink('Edit').click() >>> browser.getControl('Delete current').selected = True >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True >>> 'PDF document' in browser.contents False The file content should now be gone: >>> folder.foo.getFile().data '' Images ------ Next a similar test is conducted for an "Image" content item: >>> from plone.app.blob.tests.utils import getFile >>> browser.open(folder.absolute_url()) >>> browser.getLink(url='createObject?type_name=Image').click() >>> browser.url 'http://nohost/plone/.../portal_factory/Image/image.../edit...' >>> browser.getControl(name='title').value = 'Bar' >>> control = browser.getControl(name='image_file') >>> control.filename = 'bar.gif' >>> control.value = getFile('image.png') >>> browser.getControl('Save').click() >>> browser.url 'http://nohost/plone/.../bar.../view' >>> browser.contents '...Info...Changes saved... ...Bar... ...>> browser.open('image_preview') >>> original = browser.contents >>> browser.goBack() >>> browser.getLink('Edit').click() >>> browser.getControl(name='title').value = 'Foobar' >>> browser.getControl('Replace with new image').selected = True >>> control = browser.getControl(name='image_file') >>> control.filename = 'foobar.gif' >>> control.value = getFile('image.gif') >>> browser.getControl('Save').click() >>> browser.url 'http://nohost/plone/.../bar.../view' >>> browser.contents '...Info...Changes saved... ...Foobar... ...>> browser.open('image_preview') >>> current = browser.contents >>> original == current False >>> browser.goBack() Viewing an image should also work when browsing its URL directly, i.e. without the `/view` action part: >>> gif = getFile('image.gif').read() >>> url = browser.url.replace('/view', '') >>> browser.open(url) >>> browser.contents == gif True >>> browser.headers.getheader('status').upper() '200 OK' >>> browser.headers.getheader('content-type') 'image/gif' >>> browser.headers.getheader('content-disposition') 'inline; filename="foobar.gif"' Appending `/index_html` should be the same: >>> browser.open(url + '/index_html') >>> browser.contents == gif True >>> browser.headers.getheader('status').upper() '200 OK' >>> browser.headers.getheader('content-type') 'image/gif' >>> browser.headers.getheader('content-disposition') 'inline; filename="foobar.gif"' Let's also check the scaled versions included the un-scaled variant: >>> browser.open(url + '/image_thumb') >>> browser.contents 'GIF87a...' >>> browser.headers.getheader('status').upper() '200 OK' >>> browser.headers.getheader('content-type') 'image/gif' >>> browser.open(url + '/image') >>> browser.contents 'GIF89a...' >>> browser.headers.getheader('status').upper() '200 OK' >>> browser.headers.getheader('content-type') 'image/gif' It should also be possible to remove the image. Again, for this to work the field must not be required. That is not the default in Plone, however, so we need to tweak the schema first: >>> folder.bar.getPrimaryField().required = False >>> browser.open(url + '/view') >>> browser.getLink('Edit').click() >>> browser.getControl('Delete current').selected = True >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True >>> 'No image has been uploaded yet' in browser.contents True The image content should now be gone: >>> folder.foo.getImage().data ''