Dodanie sorl.thumbnail i generowanie miniaturek logo na potrzeby aplikacji sponsors.
[wolnelektury.git] / apps / sorl / thumbnail / tests / base.py
diff --git a/apps/sorl/thumbnail/tests/base.py b/apps/sorl/thumbnail/tests/base.py
new file mode 100644 (file)
index 0000000..44a2fa2
--- /dev/null
@@ -0,0 +1,105 @@
+import unittest
+import os
+from PIL import Image
+from django.conf import settings
+from sorl.thumbnail.base import Thumbnail
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+
+def get_default_settings():
+    from sorl.thumbnail import defaults
+    def_settings = {}
+    for key in dir(defaults):
+        if key == key.upper() and key not in ['WVPS', 'CONVERT']:
+            def_settings[key] = getattr(defaults, key)
+    return def_settings
+
+
+DEFAULT_THUMBNAIL_SETTINGS = get_default_settings()
+RELATIVE_PIC_NAME = "sorl-thumbnail-test_source.jpg"
+PIC_NAME = os.path.join(settings.MEDIA_ROOT, RELATIVE_PIC_NAME)
+THUMB_NAME = os.path.join(settings.MEDIA_ROOT, "sorl-thumbnail-test_%02d.jpg")
+PIC_SIZE = (800, 600)
+
+
+class ChangeSettings:
+    def __init__(self):
+        self.default_settings = DEFAULT_THUMBNAIL_SETTINGS.copy()
+
+    def change(self, override=None):
+        if override is not None:
+            self.default_settings.update(override)
+        for setting, default in self.default_settings.items():
+            settings_s = 'THUMBNAIL_%s' % setting
+            self_s = 'original_%s' % setting
+            if hasattr(settings, settings_s) and not hasattr(self, self_s):
+                setattr(self, self_s, getattr(settings, settings_s))
+            if hasattr(settings, settings_s) or \
+               default != DEFAULT_THUMBNAIL_SETTINGS[setting]:
+                setattr(settings, settings_s, default)
+
+    def revert(self):
+        for setting in self.default_settings:
+            settings_s = 'THUMBNAIL_%s' % setting
+            self_s = 'original_%s' % setting
+            if hasattr(self, self_s):
+                setattr(settings, settings_s, getattr(self, self_s))
+                delattr(self, self_s)
+
+
+class BaseTest(unittest.TestCase):
+    def setUp(self):
+        self.images_to_delete = set()
+        # Create the test image
+        Image.new('RGB', PIC_SIZE).save(PIC_NAME, 'JPEG')
+        self.images_to_delete.add(PIC_NAME)
+        # Change settings so we know they will be constant
+        self.change_settings = ChangeSettings()
+        self.change_settings.change()
+
+    def verify_thumbnail(self, expected_size, thumbnail=None,
+                         expected_filename=None, expected_mode=None):
+        assert thumbnail is not None or expected_filename is not None, \
+            'verify_thumbnail should be passed at least a thumbnail or an' \
+            'expected filename.'
+
+        if thumbnail is not None:
+            # Verify that the templatetag method returned a Thumbnail instance
+            self.assertTrue(isinstance(thumbnail, Thumbnail))
+            thumb_name = thumbnail.dest
+        else:
+            thumb_name = expected_filename
+
+        if isinstance(thumb_name, basestring):
+            # Verify that the thumbnail file exists
+            self.assert_(os.path.isfile(thumb_name),
+                         'Thumbnail file not found')
+
+            # Remember to delete the file
+            self.images_to_delete.add(thumb_name)
+
+            # If we got an expected_filename, check that it is right
+            if expected_filename is not None and thumbnail is not None:
+                self.assertEqual(thumbnail.dest, expected_filename)
+
+        image = Image.open(thumb_name)
+
+        # Verify the thumbnail has the expected dimensions
+        self.assertEqual(image.size, expected_size)
+
+        if expected_mode is not None:
+            self.assertEqual(image.mode, expected_mode)
+
+    def tearDown(self):
+        # Remove all the files that have been created
+        for image in self.images_to_delete:
+            try:
+                os.remove(image)
+            except:
+                pass
+        # Change settings back to original
+        self.change_settings.revert()