Dodanie aplikacji sorl.thumbnail i filebrowser.
[redakcja.git] / apps / sorl / thumbnail / tests / classes.py
diff --git a/apps/sorl/thumbnail/tests/classes.py b/apps/sorl/thumbnail/tests/classes.py
new file mode 100644 (file)
index 0000000..d15dd19
--- /dev/null
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+from StringIO import StringIO
+
+from PIL import Image
+from django.conf import settings
+
+from sorl.thumbnail.base import Thumbnail
+from sorl.thumbnail.main import DjangoThumbnail, get_thumbnail_setting
+from sorl.thumbnail.processors import dynamic_import, get_valid_options
+from sorl.thumbnail.tests.base import BaseTest, RELATIVE_PIC_NAME, PIC_NAME,\
+    THUMB_NAME, PIC_SIZE
+
+
+class ThumbnailTest(BaseTest):
+    def testThumbnails(self):
+        # Thumbnail
+        thumb = Thumbnail(source=PIC_NAME, dest=THUMB_NAME % 1,
+                          requested_size=(240, 240))
+        self.verify_thumbnail((240, 180), thumb)
+
+        # Cropped thumbnail
+        thumb = Thumbnail(source=PIC_NAME, dest=THUMB_NAME % 2,
+                          requested_size=(240, 240), opts=['crop'])
+        self.verify_thumbnail((240, 240), thumb)
+
+        # Thumbnail with altered JPEG quality
+        thumb = Thumbnail(source=PIC_NAME, dest=THUMB_NAME % 3,
+                          requested_size=(240, 240), quality=95)
+        self.verify_thumbnail((240, 180), thumb)
+
+    def testRegeneration(self):
+        # Create thumbnail
+        thumb_name = THUMB_NAME % 4
+        thumb_size = (240, 240)
+        Thumbnail(source=PIC_NAME, dest=thumb_name, requested_size=thumb_size)
+        self.images_to_delete.add(thumb_name)
+        thumb_mtime = os.path.getmtime(thumb_name)
+        time.sleep(1)
+
+        # Create another instance, shouldn't generate a new thumb
+        Thumbnail(source=PIC_NAME, dest=thumb_name, requested_size=thumb_size)
+        self.assertEqual(os.path.getmtime(thumb_name), thumb_mtime)
+
+        # Recreate the source image, then see if a new thumb is generated
+        Image.new('RGB', PIC_SIZE).save(PIC_NAME, 'JPEG')
+        Thumbnail(source=PIC_NAME, dest=thumb_name, requested_size=thumb_size)
+        self.assertNotEqual(os.path.getmtime(thumb_name), thumb_mtime)
+
+    def testFilelikeDest(self):
+        # Thumbnail
+        filelike_dest = StringIO()
+        thumb = Thumbnail(source=PIC_NAME, dest=filelike_dest,
+                          requested_size=(240, 240))
+        self.verify_thumbnail((240, 180), thumb)
+
+    def testRGBA(self):
+        # RGBA image
+        rgba_pic_name = os.path.join(settings.MEDIA_ROOT,
+                                     'sorl-thumbnail-test_rgba_source.png')
+        Image.new('RGBA', PIC_SIZE).save(rgba_pic_name)
+        self.images_to_delete.add(rgba_pic_name)
+        # Create thumb and verify it's still RGBA
+        rgba_thumb_name = os.path.join(settings.MEDIA_ROOT,
+                                       'sorl-thumbnail-test_rgba_dest.png')
+        thumb = Thumbnail(source=rgba_pic_name, dest=rgba_thumb_name,
+                          requested_size=(240, 240))
+        self.verify_thumbnail((240, 180), thumb, expected_mode='RGBA')
+
+
+class DjangoThumbnailTest(BaseTest):
+    def setUp(self):
+        super(DjangoThumbnailTest, self).setUp()
+        # Add another source image in a sub-directory for testing subdir and
+        # basedir.
+        self.sub_dir = os.path.join(settings.MEDIA_ROOT, 'test_thumbnail')
+        try:
+            os.mkdir(self.sub_dir)
+        except OSError:
+            pass
+        self.pic_subdir = os.path.join(self.sub_dir, RELATIVE_PIC_NAME)
+        Image.new('RGB', PIC_SIZE).save(self.pic_subdir, 'JPEG')
+        self.images_to_delete.add(self.pic_subdir)
+
+    def testFilenameGeneration(self):
+        basename = RELATIVE_PIC_NAME.replace('.', '_')
+        # Basic filename
+        thumb = DjangoThumbnail(relative_source=RELATIVE_PIC_NAME,
+                                requested_size=(240, 120))
+        expected = os.path.join(settings.MEDIA_ROOT, basename)
+        expected += '_240x120_q85.jpg'
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+
+        # Changed quality and cropped
+        thumb = DjangoThumbnail(relative_source=RELATIVE_PIC_NAME,
+                                requested_size=(240, 120), opts=['crop'],
+                                quality=95)
+        expected = os.path.join(settings.MEDIA_ROOT, basename)
+        expected += '_240x120_crop_q95.jpg'
+        self.verify_thumbnail((240, 120), thumb, expected_filename=expected)
+
+        # All options on
+        processors = dynamic_import(get_thumbnail_setting('PROCESSORS'))
+        valid_options = get_valid_options(processors)
+
+        thumb = DjangoThumbnail(relative_source=RELATIVE_PIC_NAME,
+                                requested_size=(240, 120), opts=valid_options)
+        expected = (os.path.join(settings.MEDIA_ROOT, basename) + '_240x120_'
+                    'autocrop_bw_crop_detail_max_sharpen_upscale_q85.jpg')
+        self.verify_thumbnail((240, 120), thumb, expected_filename=expected)
+
+        # Different basedir
+        basedir = 'sorl-thumbnail-test-basedir'
+        self.change_settings.change({'BASEDIR': basedir})
+        thumb = DjangoThumbnail(relative_source=self.pic_subdir,
+                                requested_size=(240, 120))
+        expected = os.path.join(basedir, self.sub_dir, basename)
+        expected += '_240x120_q85.jpg'
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+        # Different subdir
+        self.change_settings.change({'BASEDIR': '', 'SUBDIR': 'subdir'})
+        thumb = DjangoThumbnail(relative_source=self.pic_subdir,
+                                requested_size=(240, 120))
+        expected = os.path.join(settings.MEDIA_ROOT,
+                                os.path.basename(self.sub_dir), 'subdir',
+                                basename)
+        expected += '_240x120_q85.jpg'
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+        # Different prefix
+        self.change_settings.change({'SUBDIR': '', 'PREFIX': 'prefix-'})
+        thumb = DjangoThumbnail(relative_source=self.pic_subdir,
+                                requested_size=(240, 120))
+        expected = os.path.join(self.sub_dir, 'prefix-' + basename)
+        expected += '_240x120_q85.jpg'
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+
+    def testAlternateExtension(self):
+        basename = RELATIVE_PIC_NAME.replace('.', '_')
+        # Control JPG
+        thumb = DjangoThumbnail(relative_source=RELATIVE_PIC_NAME,
+                                requested_size=(240, 120))
+        expected = os.path.join(settings.MEDIA_ROOT, basename)
+        expected += '_240x120_q85.jpg'
+        expected_jpg = expected
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+        # Test PNG
+        thumb = DjangoThumbnail(relative_source=RELATIVE_PIC_NAME,
+                                requested_size=(240, 120), extension='png')
+        expected = os.path.join(settings.MEDIA_ROOT, basename)
+        expected += '_240x120_q85.png'
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+        # Compare the file size to make sure it's not just saving as a JPG with
+        # a different extension.
+        self.assertNotEqual(os.path.getsize(expected_jpg),
+                            os.path.getsize(expected))
+
+    def testUnicodeName(self):
+        unicode_name = 'sorl-thumbnail-ążśź_source.jpg'
+        unicode_path = os.path.join(settings.MEDIA_ROOT, unicode_name)
+        Image.new('RGB', PIC_SIZE).save(unicode_path)
+        self.images_to_delete.add(unicode_path)
+        thumb = DjangoThumbnail(relative_source=unicode_name,
+                                requested_size=(240, 120))
+        base_name = unicode_name.replace('.', '_')
+        expected = os.path.join(settings.MEDIA_ROOT,
+                                base_name + '_240x120_q85.jpg')
+        self.verify_thumbnail((160, 120), thumb, expected_filename=expected)
+
+    def tearDown(self):
+        super(DjangoThumbnailTest, self).tearDown()
+        subdir = os.path.join(self.sub_dir, 'subdir')
+        if os.path.exists(subdir):
+            os.rmdir(subdir)
+        os.rmdir(self.sub_dir)