示例#1
0
 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)
示例#2
0
 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)
示例#3
0
 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])
示例#4
0
 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')
示例#5
0
 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')
示例#6
0
 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.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')
示例#8
0
 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 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'))
示例#10
0
 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))
示例#11
0
 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 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))
示例#13
0
 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())
示例#14
0
 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')
示例#15
0
 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')
示例#16
0
 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 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()), '')
示例#18
0
 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']
示例#19
0
    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])
示例#20
0
 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()))
示例#21
0
    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])
示例#22
0
 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')
示例#23
0
 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')
示例#24
0
 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')
示例#25
0
 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']
示例#26
0
 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')
示例#27
0
 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")
示例#28
0
 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")
示例#29
0
 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')
 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')