# standard imports from functools import partial import os import shutil import tempfile import unittest # external imports import PIL.Image # bsie imports from bsie.utils import errors # objects to test from bsie.reader.preview._pg import PreviewGeneratorReader ## code ## class TestPreviewGeneratorReader(unittest.TestCase): def test_call(self): rdr = PreviewGeneratorReader() # inexistent file raises a ReaderError self.assertRaises(errors.ReaderError, rdr, os.path.join(os.path.dirname(__file__), 'missing.jpg')) # unsupported file type raises an UnsupportedFileFormatError self.assertRaises(errors.UnsupportedFileFormatError, rdr, os.path.join(os.path.dirname(__file__), 'invalid.foo')) # invalid file raises a ReaderError self.assertRaises(errors.ReaderError, rdr(os.path.join(os.path.dirname(__file__), 'invalid.jpg')), 100) # proper file produces a generator gen = rdr(os.path.join(os.path.dirname(__file__), 'testimage.jpg')) self.assertIsInstance(gen, partial) # generator produces an image img = gen(10) self.assertIsInstance(img, PIL.Image.Image) self.assertEqual(img.size, (10, 10)) self.assertEqual(sum(img.getdata()), 0) # cleanup img.close() # preview generator can also extract data from non-image files gen = rdr(os.path.join(os.path.dirname(__file__), 'testfile.pdf')) self.assertIsInstance(gen, partial) # generator produces an image img = gen(10) self.assertIsInstance(img, PIL.Image.Image) self.assertEqual(img.size, (8, 10)) self.assertEqual(sum(img.getdata()), 20258) # cleanup img.close() # can define a cache dir pg_dir = tempfile.mkdtemp(prefix='bsie-test') self.assertTrue(os.path.exists(pg_dir)) rdr = PreviewGeneratorReader(cache=pg_dir) gen = rdr(os.path.join(os.path.dirname(__file__), 'testimage.jpg')) img = gen(10) self.assertIsInstance(img, PIL.Image.Image) self.assertEqual(img.size, (10, 10)) self.assertEqual(sum(img.getdata()), 0) img.close() del rdr # cache dir still exists after instance deletion self.assertTrue(os.path.exists(pg_dir)) shutil.rmtree(pg_dir, ignore_errors=True) ## main ## if __name__ == '__main__': unittest.main() ## EOF ##