"""Tests for image_validator module.""" from io import BytesIO from PIL import Image import pytest from src import image_validator def build_test_image(size, mode, fmt, convert=None): """Utils returns an image.""" file = BytesIO() image = Image.new(mode, size=size, color=(155, 0, 0)) if convert: image = image.convert(convert) image.save(file, fmt) file.name = 'test.{}'.format(fmt) file.seek(0) return file @pytest.mark.parametrize('test_image', [ build_test_image((3000, 3000), 'RGB', 'jpeg'), build_test_image((4000, 4000), 'RGBA', 'tiff'), build_test_image((6000, 6000), 'RGB', 'jpeg', 'L') ]) def test_validate_image_success(test_image): """Test for a successful return when all validations pass.""" result = image_validator.validate_image(test_image) assert result is True @pytest.mark.parametrize('test_image,expected_error_code', [ (build_test_image((2000, 2000), 'RGB', 'jpeg'), 'image_too_small_dimensions_error'), (build_test_image((6100, 6100), 'RGB', 'jpeg'), 'image_too_large_dimensions_error'), (build_test_image((3000, 4000), 'RGB', 'jpeg'), 'image_wrong_aspect_ratio_error') ]) def test_validate_image_invalid_dimensions(test_image, expected_error_code): """Test that validation fails if the dimensions are wrong.""" with pytest.raises(image_validator.InvalidImageDimensions) as err: image_validator.validate_image(test_image) assert err.value.error_code == expected_error_code @pytest.mark.parametrize('test_image,color_mode', [ (build_test_image((3000, 3000), 'CMYK', 'jpeg'), 'CMYK'), (build_test_image((3000, 3000), 'RGB', 'tiff', 'P'), 'P') ]) def test_validate_image_invalid_color(test_image, color_mode): """Test that validation fails for invalid color.""" with pytest.raises(image_validator.InvalidImageColor) as err: image_validator.validate_image(test_image) assert str(err.value) == 'Image has invalid color mode: {}'.format(color_mode) def test_validate_image_invalid_file(): """Test validation handles invalid files.""" with pytest.raises(image_validator.InvalidImageError) as err: image_validator.validate_image(BytesIO()) assert err.value.error_code == 'image_invalid_file' assert str(err.value) == 'Image is an invalid file: it can not be identified by PIL.'