diff --git a/.travis.yml b/.travis.yml index d62bfc3..2417b3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ install: - pip install $FLASK - pip install pillow - pip install codecov + - pip install mock branches: only: diff --git a/flask_thumbnails/__init__.py b/flask_thumbnails/__init__.py index f7a623c..8f9f3e5 100644 --- a/flask_thumbnails/__init__.py +++ b/flask_thumbnails/__init__.py @@ -159,7 +159,7 @@ def _get_format(self, image, **options): return self.app.config['THUMBNAIL_DEFAUL_FORMAT'] - def _create_thumbnail(self, image, size, crop, background=None): + def _create_thumbnail(self, image, size, crop='fit', background=None): if crop == 'fit': image = ImageOps.fit(image, size, Image.ANTIALIAS) else: diff --git a/tests/core_tests.py b/tests/core_tests.py new file mode 100644 index 0000000..cc8f4ad --- /dev/null +++ b/tests/core_tests.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import os +import unittest +import tempfile +import mock +from io import BytesIO + +from PIL import Image + +from flask_thumbnails import Thumbnail +from flask import Flask + +from flask_thumbnails.storage_backends import FilesystemStorageBackend + + +class CoreTestCase(unittest.TestCase): + def setUp(self): + self.app = Flask(__name__) + self.thumbnail = Thumbnail(app=self.app) + self.client = self.app.test_client() + + self.image = Image.new('RGB', (100, 100), 'black') + + def test_root_directory(self): + self.app.config['THUMBNAIL_MEDIA_ROOT'] = 'media' + self.assertEqual( + self.thumbnail.root_directory, + os.path.join(self.app.root_path, self.app.config['THUMBNAIL_MEDIA_ROOT']) + ) + + self.app.config['THUMBNAIL_MEDIA_ROOT'] = '/tmp/media' + self.assertEqual(self.thumbnail.root_directory, self.app.config['THUMBNAIL_MEDIA_ROOT']) + + def test_thumbnail_directory(self): + self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_ROOT'] = 'media' + self.assertEqual( + self.thumbnail.thumbnail_directory, + os.path.join(self.app.root_path, self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_ROOT']) + ) + + self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_ROOT'] = '/tmp/media' + self.assertEqual( + self.thumbnail.thumbnail_directory, + self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_ROOT'] + ) + + def test_root_url(self): + self.app.config['THUMBNAIL_MEDIA_URL'] = '/media' + self.assertEqual(self.thumbnail.root_url, self.app.config['THUMBNAIL_MEDIA_URL']) + + def test_thumbnail_url(self): + self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_URL'] = '/media' + self.assertEqual(self.thumbnail.thumbnail_url, self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_URL']) + + def test_storage_backend(self): + self.assertEqual(self.thumbnail.storage_backend, self.app.config['THUMBNAIL_STORAGE_BACKEND']) + + def test_get_storage_backend(self): + self.assertIsInstance(self.thumbnail.get_storage_backend(), FilesystemStorageBackend) + + def test_colormode(self): + image = Image.new('L', (10, 10)) + new_image = self.thumbnail.colormode(image) + + self.assertEqual(new_image.mode, 'RGB') + + image = Image.new('LA', (10, 10)) + new_image = self.thumbnail.colormode(image) + + self.assertEqual(new_image.mode, 'RGBA') + + image = Image.new('RGBA', (10, 10)) + new_image = self.thumbnail.colormode(image) + + self.assertEqual(new_image.mode, 'RGBA') + + image = Image.new('RGB', (10, 10)) + new_image = self.thumbnail.colormode(image) + + self.assertEqual(new_image.mode, 'RGB') + + def test_get_format(self): + image = Image.new('RGB', (10, 10)) + new_image = self.thumbnail.colormode(image) + + self.assertEqual(new_image.mode, 'RGB') + + options = {'format': 'PNG'} + self.assertEqual(self.thumbnail._get_format(image, **options), 'PNG') + + options = {} + self.assertEqual(self.thumbnail._get_format(image, **options), self.app.config['THUMBNAIL_DEFAUL_FORMAT']) + + def test_get_raw_data(self): + image = Image.new('L', (10, 10)) + + options = {'format': 'JPEG'} + data = self.thumbnail.get_raw_data(image, **options) + + new_image = Image.open(BytesIO(data)) + self.assertEqual(image.mode, new_image.mode) + self.assertEqual(image.size, new_image.size) + self.assertEqual(new_image.format, 'JPEG') + + def test_create_thumbnail(self): + image = Image.new('L', (100, 100)) + + new_image = self.thumbnail._create_thumbnail(image, size=(50, 50)) + + self.assertEqual(new_image.size, (50, 50)) + + new_image = self.thumbnail._create_thumbnail(image, size=(50, 50), crop=None) + + self.assertEqual(new_image.size, (50, 50)) + + @mock.patch('flask_thumbnails.utils.generate_filename') + def test_get_thumbnail(self, mock_thumb_name): + with tempfile.NamedTemporaryFile(suffix='.jpg') as original: + with tempfile.NamedTemporaryFile(suffix='.jpg') as thumb: + mock_thumb_name.return_value = os.path.basename(thumb.name) + self.app.config['THUMBNAIL_MEDIA_ROOT'] = os.path.dirname(original.name) + self.app.config['THUMBNAIL_MEDIA_THUMBNAIL_ROOT'] = os.path.dirname(thumb.name) + + image = Image.new('RGB', (100, 100), 'black') + image.save(original.name) + + thumb_url = self.thumbnail.get_thumbnail(os.path.basename(original.name), '50x50') + + self.assertTrue(thumb_url) diff --git a/tests/storage_backends_tests.py b/tests/storage_backends_tests.py index e120fd6..7b04845 100644 --- a/tests/storage_backends_tests.py +++ b/tests/storage_backends_tests.py @@ -37,7 +37,3 @@ def test_save(self): def tearDown(self): self.tmp_file.close() - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/utils_tests.py b/tests/utils_tests.py index 3e1b5e5..703df89 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -19,7 +19,3 @@ def test_import_from_string_none(self): def test_generate_filename(self): name = generate_filename('test.jpg', '200x200', 'fit', '100') self.assertEqual(name, 'test_200x200_fit_100.jpg') - - -if __name__ == '__main__': - unittest.main()