annotate photologue/tests.py @ 157:25a9d67f4d1c

Fix floating images stomping on next story or footer.
author Brian Neal <bgneal@gmail.com>
date Mon, 29 Dec 2014 18:17:32 -0600
parents e2868ad47a1e
children
rev   line source
bgneal@1 1 import os
bgneal@1 2 import unittest
bgneal@1 3 from django.conf import settings
bgneal@1 4 from django.core.files.base import ContentFile
bgneal@1 5 from django.test import TestCase
bgneal@1 6
bgneal@1 7 from models import *
bgneal@1 8
bgneal@1 9 # Path to sample image
bgneal@1 10 RES_DIR = os.path.join(os.path.dirname(__file__), 'res')
bgneal@1 11 LANDSCAPE_IMAGE_PATH = os.path.join(RES_DIR, 'test_landscape.jpg')
bgneal@1 12 PORTRAIT_IMAGE_PATH = os.path.join(RES_DIR, 'test_portrait.jpg')
bgneal@1 13 SQUARE_IMAGE_PATH = os.path.join(RES_DIR, 'test_square.jpg')
bgneal@1 14
bgneal@1 15
bgneal@1 16 class TestPhoto(ImageModel):
bgneal@1 17 """ Minimal ImageModel class for testing """
bgneal@1 18 name = models.CharField(max_length=30)
bgneal@1 19
bgneal@1 20
bgneal@1 21 class PLTest(TestCase):
bgneal@1 22 """ Base TestCase class """
bgneal@1 23 def setUp(self):
bgneal@1 24 self.s = PhotoSize(name='test', width=100, height=100)
bgneal@1 25 self.s.save()
bgneal@1 26 self.pl = TestPhoto(name='landscape')
bgneal@1 27 self.pl.image.save(os.path.basename(LANDSCAPE_IMAGE_PATH),
bgneal@1 28 ContentFile(open(LANDSCAPE_IMAGE_PATH, 'rb').read()))
bgneal@1 29 self.pl.save()
bgneal@1 30
bgneal@1 31 def tearDown(self):
bgneal@1 32 path = self.pl.image.path
bgneal@1 33 self.pl.delete()
bgneal@1 34 self.failIf(os.path.isfile(path))
bgneal@1 35 self.s.delete()
bgneal@1 36
bgneal@1 37
bgneal@1 38 class PhotoTest(PLTest):
bgneal@1 39 def test_new_photo(self):
bgneal@1 40 self.assertEqual(TestPhoto.objects.count(), 1)
bgneal@1 41 self.failUnless(os.path.isfile(self.pl.image.path))
bgneal@1 42 self.assertEqual(os.path.getsize(self.pl.image.path),
bgneal@1 43 os.path.getsize(LANDSCAPE_IMAGE_PATH))
bgneal@1 44
bgneal@1 45 def test_exif(self):
bgneal@1 46 self.assert_(len(self.pl.EXIF.keys()) > 0)
bgneal@1 47
bgneal@1 48 def test_paths(self):
bgneal@1 49 self.assertEqual(os.path.normpath(str(self.pl.cache_path())).lower(),
bgneal@1 50 os.path.normpath(os.path.join(settings.MEDIA_ROOT,
bgneal@1 51 PHOTOLOGUE_DIR,
bgneal@1 52 'photos',
bgneal@1 53 'cache')).lower())
bgneal@1 54 self.assertEqual(self.pl.cache_url(),
bgneal@1 55 settings.MEDIA_URL + PHOTOLOGUE_DIR + '/photos/cache')
bgneal@1 56
bgneal@1 57 def test_count(self):
bgneal@1 58 for i in range(5):
bgneal@1 59 self.pl.get_test_url()
bgneal@1 60 self.assertEquals(self.pl.view_count, 0)
bgneal@1 61 self.s.increment_count = True
bgneal@1 62 self.s.save()
bgneal@1 63 for i in range(5):
bgneal@1 64 self.pl.get_test_url()
bgneal@1 65 self.assertEquals(self.pl.view_count, 5)
bgneal@1 66
bgneal@1 67 def test_precache(self):
bgneal@1 68 # set the thumbnail photo size to pre-cache
bgneal@1 69 self.s.pre_cache = True
bgneal@1 70 self.s.save()
bgneal@1 71 # make sure it created the file
bgneal@1 72 self.failUnless(os.path.isfile(self.pl.get_test_filename()))
bgneal@1 73 self.s.pre_cache = False
bgneal@1 74 self.s.save()
bgneal@1 75 # clear the cache and make sure the file's deleted
bgneal@1 76 self.pl.clear_cache()
bgneal@1 77 self.failIf(os.path.isfile(self.pl.get_test_filename()))
bgneal@1 78
bgneal@1 79 def test_accessor_methods(self):
bgneal@1 80 self.assertEquals(self.pl.get_test_photosize(), self.s)
bgneal@1 81 self.assertEquals(self.pl.get_test_size(),
bgneal@1 82 Image.open(self.pl.get_test_filename()).size)
bgneal@1 83 self.assertEquals(self.pl.get_test_url(),
bgneal@1 84 self.pl.cache_url() + '/' + \
bgneal@1 85 self.pl._get_filename_for_size(self.s))
bgneal@1 86 self.assertEquals(self.pl.get_test_filename(),
bgneal@1 87 os.path.join(self.pl.cache_path(),
bgneal@1 88 self.pl._get_filename_for_size(self.s)))
bgneal@1 89
bgneal@1 90
bgneal@1 91 class ImageResizeTest(PLTest):
bgneal@1 92 def setUp(self):
bgneal@1 93 super(ImageResizeTest, self).setUp()
bgneal@1 94 self.pp = TestPhoto(name='portrait')
bgneal@1 95 self.pp.image.save(os.path.basename(PORTRAIT_IMAGE_PATH),
bgneal@1 96 ContentFile(open(PORTRAIT_IMAGE_PATH, 'rb').read()))
bgneal@1 97 self.pp.save()
bgneal@1 98 self.ps = TestPhoto(name='square')
bgneal@1 99 self.ps.image.save(os.path.basename(SQUARE_IMAGE_PATH),
bgneal@1 100 ContentFile(open(SQUARE_IMAGE_PATH, 'rb').read()))
bgneal@1 101 self.ps.save()
bgneal@1 102
bgneal@1 103 def tearDown(self):
bgneal@1 104 super(ImageResizeTest, self).tearDown()
bgneal@1 105 self.pp.delete()
bgneal@1 106 self.ps.delete()
bgneal@1 107
bgneal@1 108 def test_resize_to_fit(self):
bgneal@1 109 self.assertEquals(self.pl.get_test_size(), (100, 75))
bgneal@1 110 self.assertEquals(self.pp.get_test_size(), (75, 100))
bgneal@1 111 self.assertEquals(self.ps.get_test_size(), (100, 100))
bgneal@1 112
bgneal@1 113 def test_resize_to_fit_width(self):
bgneal@1 114 self.s.size = (100, 0)
bgneal@1 115 self.s.save()
bgneal@1 116 self.assertEquals(self.pl.get_test_size(), (100, 75))
bgneal@1 117 self.assertEquals(self.pp.get_test_size(), (100, 133))
bgneal@1 118 self.assertEquals(self.ps.get_test_size(), (100, 100))
bgneal@1 119
bgneal@1 120 def test_resize_to_fit_width_enlarge(self):
bgneal@1 121 self.s.size = (2000, 0)
bgneal@1 122 self.s.upscale = True
bgneal@1 123 self.s.save()
bgneal@1 124 self.assertEquals(self.pl.get_test_size(), (2000, 1500))
bgneal@1 125 self.assertEquals(self.pp.get_test_size(), (2000, 2667))
bgneal@1 126 self.assertEquals(self.ps.get_test_size(), (2000, 2000))
bgneal@1 127
bgneal@1 128 def test_resize_to_fit_height(self):
bgneal@1 129 self.s.size = (0, 100)
bgneal@1 130 self.s.save()
bgneal@1 131 self.assertEquals(self.pl.get_test_size(), (133, 100))
bgneal@1 132 self.assertEquals(self.pp.get_test_size(), (75, 100))
bgneal@1 133 self.assertEquals(self.ps.get_test_size(), (100, 100))
bgneal@1 134
bgneal@1 135 def test_resize_to_fit_height_enlarge(self):
bgneal@1 136 self.s.size = (0, 2000)
bgneal@1 137 self.s.upscale = True
bgneal@1 138 self.s.save()
bgneal@1 139 self.assertEquals(self.pl.get_test_size(), (2667, 2000))
bgneal@1 140 self.assertEquals(self.pp.get_test_size(), (1500, 2000))
bgneal@1 141 self.assertEquals(self.ps.get_test_size(), (2000, 2000))
bgneal@1 142
bgneal@1 143 def test_resize_and_crop(self):
bgneal@1 144 self.s.crop = True
bgneal@1 145 self.s.save()
bgneal@1 146 self.assertEquals(self.pl.get_test_size(), self.s.size)
bgneal@1 147 self.assertEquals(self.pp.get_test_size(), self.s.size)
bgneal@1 148 self.assertEquals(self.ps.get_test_size(), self.s.size)
bgneal@1 149
bgneal@1 150 def test_resize_rounding_to_fit(self):
bgneal@1 151 self.s.size = (113, 113)
bgneal@1 152 self.s.save()
bgneal@1 153 self.assertEquals(self.pl.get_test_size(), (113, 85))
bgneal@1 154 self.assertEquals(self.pp.get_test_size(), (85, 113))
bgneal@1 155 self.assertEquals(self.ps.get_test_size(), (113, 113))
bgneal@1 156
bgneal@1 157 def test_resize_rounding_cropped(self):
bgneal@1 158 self.s.size = (113, 113)
bgneal@1 159 self.s.crop = True
bgneal@1 160 self.s.save()
bgneal@1 161 self.assertEquals(self.pl.get_test_size(), self.s.size)
bgneal@1 162 self.assertEquals(self.pp.get_test_size(), self.s.size)
bgneal@1 163 self.assertEquals(self.ps.get_test_size(), self.s.size)
bgneal@1 164
bgneal@1 165 def test_resize_one_dimension_width(self):
bgneal@1 166 self.s.size = (1500, 1200)
bgneal@1 167 self.s.save()
bgneal@1 168 self.assertEquals(self.pl.get_test_size(), (1500, 1125))
bgneal@1 169
bgneal@1 170 def test_resize_one_dimension_height(self):
bgneal@1 171 self.s.size = (1600, 1100)
bgneal@1 172 self.s.save()
bgneal@1 173 self.assertEquals(self.pl.get_test_size(), (1467, 1100))
bgneal@1 174
bgneal@1 175 def test_resize_no_upscale(self):
bgneal@1 176 self.s.size = (2000, 2000)
bgneal@1 177 self.s.save()
bgneal@1 178 self.assertEquals(self.pl.get_test_size(), (1600, 1200))
bgneal@1 179
bgneal@1 180 def test_resize_no_upscale_mixed_height(self):
bgneal@1 181 self.s.size = (3200, 600)
bgneal@1 182 self.s.save()
bgneal@1 183 self.assertEquals(self.pl.get_test_size(), (800, 600))
bgneal@1 184
bgneal@1 185 def test_resize_no_upscale_mixed_width(self):
bgneal@1 186 self.s.size = (800, 2400)
bgneal@1 187 self.s.save()
bgneal@1 188 self.assertEquals(self.pl.get_test_size(), (800, 600))
bgneal@1 189
bgneal@1 190 def test_resize_no_upscale_crop(self):
bgneal@1 191 self.s.size = (2000, 2000)
bgneal@1 192 self.s.crop = True
bgneal@1 193 self.s.save()
bgneal@1 194 self.assertEquals(self.pl.get_test_size(), (2000, 2000))
bgneal@1 195
bgneal@1 196 def test_resize_upscale(self):
bgneal@1 197 self.s.size = (2000, 2000)
bgneal@1 198 self.s.upscale = True
bgneal@1 199 self.s.save()
bgneal@1 200 self.assertEquals(self.pl.get_test_size(), (2000, 1500))
bgneal@1 201 self.assertEquals(self.pp.get_test_size(), (1500, 2000))
bgneal@1 202 self.assertEquals(self.ps.get_test_size(), (2000, 2000))
bgneal@1 203
bgneal@1 204
bgneal@1 205 class PhotoEffectTest(PLTest):
bgneal@1 206 def test(self):
bgneal@1 207 effect = PhotoEffect(name='test')
bgneal@1 208 im = Image.open(self.pl.image.path)
bgneal@1 209 self.assert_(isinstance(effect.pre_process(im), Image.Image))
bgneal@1 210 self.assert_(isinstance(effect.post_process(im), Image.Image))
bgneal@1 211 self.assert_(isinstance(effect.process(im), Image.Image))
bgneal@1 212
bgneal@1 213
bgneal@1 214 class PhotoSizeCacheTest(PLTest):
bgneal@1 215 def test(self):
bgneal@1 216 cache = PhotoSizeCache()
bgneal@1 217 self.assertEqual(cache.sizes['test'], self.s)
bgneal@1 218