def test_gm_options_crop_gravities(self, crop, expected): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, { 'size': ['100', '50'], 'crop': crop }) assert thumbnail.get_gm_options().get('gravity', None) == expected
def test_get_size(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) size = thumbnail.get_size() assert size.width == 25 assert size.height == 50
def test_gm_options_quality(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, { 'size': ['100', '50'], 'quality': 5 }) assert thumbnail.get_gm_options()['quality'] == 5
def test_get_name(self): thumbnail = Thumbnail('test.jpg', { 'size': ['100', '100'], 'viewport': 'ignored' }) assert thumbnail.get_name( ) == '821b6e68771352f0bc53acd8e8144972a56dd0ac/test.jpg'
class TestThumbnailView: def setup(self): self.image = ImageModelFactory.create() self.thumbnail = Thumbnail(self.image.file.path, {'size': [50, 50]}) def test_get(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = False response = client.get(self.thumbnail.url) assert response.status_code == 200 assert 'Last-Modified' in response assert 'Content-Length' in response assert 'Content-Disposition' not in response assert 'X-Accel-Redirect' not in response def test_get_invalid(self, client): response = client.get( reverse( 'thumbnail', kwargs={ 'name': 'testtesttesttesttesttesttesttesttesttest/foobar.jpg' }, )) assert response.status_code == 404 def test_get_x_accel_redirect(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True response = client.get(self.thumbnail.url) assert response.status_code == 200 assert response['X-Accel-Redirect'] == self.thumbnail.get_storage_url() def test_get_x_accel_redirect_with_domain(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True settings.ULTIMATETHUMB_DOMAIN = 'statichost' response = client.get(self.thumbnail.url) thumbnail_storage._setup() assert self.thumbnail.get_storage_url().startswith('//statichost') assert response.status_code == 200 assert response['X-Accel-Redirect'].startswith('/{0}'.format( self.thumbnail.get_name())) settings.ULTIMATETHUMB_DOMAIN = '' thumbnail_storage._setup() def test_get_last_modified(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True response = client.get(self.thumbnail.url) assert response.status_code == 200 response2 = client.get( self.thumbnail.url, HTTP_IF_MODIFIED_SINCE=response['Last-Modified']) assert response2.status_code == 304
def test_generate_pngquant_called(self, pngquant_mock): image = ImageModelFactory.create(file__filename='test.png') thumbnail = Thumbnail(image.file.path, { 'size': ['50', '50'], 'pngquant': '50' }) assert thumbnail.generate() is True assert pngquant_mock.called is True
def test_from_name(self): thumbnail = Thumbnail('test.jpg', { 'size': ['100', '100'], 'viewport': 'ignored' }) thumbnail2 = Thumbnail.from_name(thumbnail.get_name()) assert thumbnail.source == thumbnail2.source thumbnail.options.pop('viewport') assert thumbnail.options == thumbnail2.options
def test_base64_content(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['2', '2']}) assert thumbnail.get_base64_content() == ( '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAg' 'MDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8' 'XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQU' 'FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAACAAEDAREAAhEBAxEB/' '8QAFAABAAAAAAAAAAAAAAAAAAAAB//EABQQAQAAAAAAAAAAAAAAAAAAAAD/xAAVAQ' 'EBAAAAAAAAAAAAAAAAAAAICf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhE' 'DEQA/AHhPom3/2Q==')
class TestThumbnailView: def setup(self): self.image = ImageModelFactory.create() self.thumbnail = Thumbnail(self.image.file.path, {'size': [50, 50]}) def test_get(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = False response = client.get(self.thumbnail.url) assert response.status_code == 200 assert 'Last-Modified' in response assert 'Content-Length' in response assert 'Content-Disposition' not in response assert 'X-Accel-Redirect' not in response def test_get_invalid(self, client): response = client.get(reverse('thumbnail', kwargs={ 'name': 'testtesttesttesttesttesttesttesttesttest/foobar.jpg' })) assert response.status_code == 404 def test_get_x_accel_redirect(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True response = client.get(self.thumbnail.url) assert response.status_code == 200 assert response['X-Accel-Redirect'] == self.thumbnail.get_storage_url() def test_get_x_accel_redirect_with_domain(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True settings.ULTIMATETHUMB_DOMAIN = 'statichost' response = client.get(self.thumbnail.url) thumbnail_storage._setup() assert self.thumbnail.get_storage_url().startswith('//statichost') assert response.status_code == 200 assert response['X-Accel-Redirect'].startswith( '/{0}'.format(self.thumbnail.get_name())) settings.ULTIMATETHUMB_DOMAIN = '' thumbnail_storage._setup() def test_get_last_modified(self, client, settings): settings.ULTIMATETHUMB_USE_X_ACCEL_REDIRECT = True response = client.get(self.thumbnail.url) assert response.status_code == 200 response2 = client.get( self.thumbnail.url, HTTP_IF_MODIFIED_SINCE=response['Last-Modified'] ) assert response2.status_code == 304
def test_gm_options_crop(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['100', '50'], 'crop': False}) assert 'gravity' not in thumbnail.get_gm_options() assert 'crop' not in thumbnail.get_gm_options() thumbnail = Thumbnail(image.file.path, {'size': ['100', '50'], 'crop': True}) assert list(thumbnail.get_gm_options().items()) == [ ('+profile', '"*"'), ('resize', '50x25^'), ('gravity', 'Center'), ('crop', '50x25+0+0') ]
def test_estimated_size(self, input_size, thumb_size, upscale, crop, expected): image = ImageModelFactory.create( file__width=input_size[0], file__height=input_size[1]) instance = Thumbnail(image.file.path, { 'size': (str(thumb_size[0]), str(thumb_size[1])), 'upscale': upscale, 'crop': crop }) assert instance.get_estimated_size() == Size(*expected), ( '{0} -> {1} (upscale: {3} crop: {2})'.format( input_size, thumb_size, crop, upscale ))
def test_estimated_size(self, input_size, thumb_size, upscale, crop, expected): image = ImageModelFactory.create(file__width=input_size[0], file__height=input_size[1]) instance = Thumbnail( image.file.path, { 'size': (str(thumb_size[0]), str(thumb_size[1])), 'upscale': upscale, 'crop': crop, }, ) assert instance.get_estimated_size() == Size( *expected), '{0} -> {1} (upscale: {3} crop: {2})'.format( input_size, thumb_size, crop, upscale)
def test_repr(self): thumbnail = Thumbnail('test.jpg', { 'size': ['100', '100'], 'upscale': False }) assert repr(thumbnail) == ( "<Thumbnail: test.jpg crop=False factor2x=True pngquant=None" " quality=90 size=['100', '100'] upscale=False>")
def test_gm_options_sizes(self, input_size, thumb_size, upscale, crop, expected): image = ImageModelFactory.create( file__width=input_size[0], file__height=input_size[1]) instance = Thumbnail(image.file.path, { 'size': (str(thumb_size[0]), str(thumb_size[1])), 'upscale': upscale, 'crop': crop }) assert_error = '{0} -> {1} (upscale: {3} crop: {2})'.format( input_size, thumb_size, crop, upscale ) options = instance.get_gm_options() assert options.get('resize', None) == expected[0], assert_error assert options.get('crop', None) == expected[1], assert_error
def test_gm_options_sizes(self, input_size, thumb_size, upscale, crop, expected): image = ImageModelFactory.create(file__width=input_size[0], file__height=input_size[1]) instance = Thumbnail( image.file.path, { 'size': (str(thumb_size[0]), str(thumb_size[1])), 'upscale': upscale, 'crop': crop, }, ) assert_error = '{0} -> {1} (upscale: {3} crop: {2})'.format( input_size, thumb_size, crop, upscale) options = instance.get_gm_options() assert options.get('resize', None) == expected[0], assert_error assert options.get('crop', None) == expected[1], assert_error
def test_viewport(self, input_size, thumb_size, viewport, expected): image = ImageModelFactory.create(file__width=input_size[0], file__height=input_size[1]) instance = Thumbnail( image.file.path, { 'size': (str(thumb_size[0]), str(thumb_size[1])), 'viewport': (str(viewport[0]), str(viewport[1])) if viewport else None, }, ) assert_error = '{0} -> {1} / {2}'.format( input_size, thumb_size, viewport, ) viewport_size = instance.viewport assert viewport_size.width == expected[0], assert_error assert viewport_size.height == expected[1], assert_error
def test_gm_options_crop(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, { 'size': ['100', '50'], 'crop': False }) assert 'gravity' not in thumbnail.get_gm_options() assert 'crop' not in thumbnail.get_gm_options() thumbnail = Thumbnail(image.file.path, { 'size': ['100', '50'], 'crop': True }) assert list(thumbnail.get_gm_options().items()) == [ ('+profile', '"*"'), ('resize', '50x25^'), ('gravity', 'Center'), ('crop', '50x25+0+0'), ('quality', 90), ]
def test_storage_name_override_suffix(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '50']}) assert thumbnail.get_storage_name(suffix='foo') == ( '3cfbc9962355c42f448931e11442cb2c7341ec76/test.foo')
def test_storage_name_factored(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '50']}) assert thumbnail.get_storage_name(2) == os.path.join( '2x', thumbnail.get_name())
def test_storage_name(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '50']}) assert thumbnail.get_storage_name() == thumbnail.get_name()
def test_storage_name_factored(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '50']}) assert thumbnail.get_storage_name(2) == os.path.join('2x', thumbnail.get_name())
def setup(self): self.image = ImageModelFactory.create() self.thumbnail = Thumbnail(self.image.file.path, {'size': [50, 50]})
def test_mimetype(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '100']}) assert thumbnail.get_mimetype() == 'image/jpeg'
def test_get_name(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '100']}) assert thumbnail.get_name() == '48382ea502faf93772a5b07f7d8a590f01d0f15b/test.jpg'
def test_storage_path(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) assert thumbnail.get_storage_path() == os.path.join( thumbnail_storage.location, thumbnail.get_name())
def test_storage_url(self): thumbnail = Thumbnail('test.jpg', {'size': ['50', '50']}) assert thumbnail.get_storage_url() == os.path.join( thumbnail_storage.base_url, thumbnail.get_name())
def test_exists(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) assert thumbnail.exists() is False thumbnail.generate() assert thumbnail.exists() is True
def test_exists_dont_generate(self, generate_mock): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) assert thumbnail.exists() is False assert generate_mock.called is False
def test_gm_options_quality(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['100', '50'], 'quality': 5}) assert thumbnail.get_gm_options()['quality'] == 5
def test_invalid_opts(self): with pytest.raises(ValueError) as exc: Thumbnail('test.jpg', {}) assert '`size` is required' in str(exc.value)
def test_generate_pngquant_no_png(self, pngquant_mock): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50'], 'pngquant': '50'}) assert thumbnail.generate() is True assert pngquant_mock.called is False
def test_from_name(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '100']}) thumbnail2 = Thumbnail.from_name(thumbnail.get_name()) assert thumbnail.source == thumbnail2.source assert thumbnail.options == thumbnail2.options
def test_requested_size(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '50']}) assert thumbnail.requested_size.width == '100' assert thumbnail.requested_size.height == '50'
def test_base64_path(self): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) assert thumbnail.get_base64_path().endswith('.base64')
def test_mimetype_unknown(self): thumbnail = Thumbnail('test.foo', {'size': ['100', '100']}) assert thumbnail.get_mimetype() == 'application/octet-stream'
def test_generate_pngquant_disabled(self, pngquant_mock): image = ImageModelFactory.create() thumbnail = Thumbnail(image.file.path, {'size': ['50', '50']}) assert thumbnail.generate() is True assert pngquant_mock.called is False
def test_url_2x(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '100']}) assert thumbnail.url_2x == ( '/2x/821b6e68771352f0bc53acd8e8144972a56dd0ac/test.jpg')
def test_get_name(self): thumbnail = Thumbnail('test.jpg', {'size': ['100', '100']}) assert thumbnail.get_name() == '821b6e68771352f0bc53acd8e8144972a56dd0ac/test.jpg'