import pytest from calculate.utils.images import ImageMagick, ImageMagickError import os from calculate.utils.files import Process @pytest.mark.images_utils def test_imagemagick_initialization(): im = ImageMagick() assert im.available assert not im.chroot im = ImageMagick(prefix='/mnt/somepath') assert not im.available assert im.chroot @pytest.mark.images_utils @pytest.mark.parametrize('case', [ { "name": "simple path", "chroot": "/mnt/install", "source": "/mnt/install/usr/share/pixmap/image.jpg", "result": "/usr/share/pixmap/image.jpg", }, { "name": "relative", "chroot": "/mnt/install", "source": "/mnt/install/usr/share/../pixmap/image.jpg", "result": "/usr/pixmap/image.jpg", }, { "name": "first level", "chroot": "/mnt/install", "source": "/mnt/install/image.jpg", "result": "/image.jpg", }, { "name": "Wrong", "chroot": "/mnt/install", "source": "/mnt/image.jpg", "result": None, }, ], ids=lambda x:x["name"]) def test_imagemagick_trim_prefix_path(case): im = ImageMagick(case['chroot']) assert im.trim_prefix_path(case["source"]) == case["result"] @pytest.mark.images_utils @pytest.mark.parametrize('case', [ { "name": "PNG file", "image": "tests/utils/testfiles/file.png", "result": (48,48), }, { "name": "JPEG file", "image": "tests/utils/testfiles/file.jpg", "result": (320,180), }, { "name": "No file", "image": "tests/utils/testfiles/file2.jpg", "result": None, }, { "name": "Wrong file", "image": "tests/utils/testfiles/wrong.jpg", "result": None, }, ], ids=lambda x:x["name"]) def test_imagemagick_get_resolutions(case): im = ImageMagick() assert im.get_image_resolution(case["image"]) == case["result"] @pytest.fixture def chroot_test(): chrootpath = "/mnt/testchroot" assert os.getuid() == 0, "Need superuser privileges" if os.path.exists(chrootpath): os.unlink(chrootpath) os.symlink("/", chrootpath) try: yield chrootpath finally: os.unlink(chrootpath) @pytest.mark.chroot @pytest.mark.images_utils def test_chroot_imagemagick_get_resolution(chroot_test): im = ImageMagick(chroot_test) curpath = os.getcwd() image_path = os.path.join(curpath, "tests/utils/testfiles/file.png") assert im.get_image_resolution(image_path) == (48,48) def get_histogram(image, remap_image): p = Process("/usr/bin/convert", image, "-remap", remap_image, "-format", "%c", "histogram:info:-") return p.read() def get_verbose_image_info(image): p = Process("/usr/bin/identify", "-verbose", image) return p.read() @pytest.mark.images_utils @pytest.mark.parametrize('case', [ { # проверка, пропорционального уменьшения "name": "Origin test", "resize": (16,32), "result": """192: (0,0,0) #000000 black 64: (0,255,0) #00FF00 lime 256: (255,255,255) #FFFFFF white""" }, { # проверка, что при изменении размера только по горизонтали # удаляются только части изображения справа и слева # в исходном изображении на этих частях находится белый фон "name": "Shrink horizontal", "resize": (16,16), "result": """192: (0,0,0) #000000 black 64: (0,255,0) #00FF00 lime""" }, { # проверка, что при уменьшении изображения первоначально оно сдавливается # по вертикали а затем обрезаются части слева и справа "name": "Shrink all", "resize": (8,8), "result": """48: (0,0,0) #000000 black 16: (0,255,0) #00FF00 lime""" }, { # проверка, пропорционального уменьшения "name": "Shrink proportionately", "resize": (8,16), "result": """48: (0,0,0) #000000 black 16: (0,255,0) #00FF00 lime 64: (255,255,255) #FFFFFF white""" }, { # проверка, пропорционального увеличения "name": "Increase size proportionately", "resize": (32,64), "result": """768: (0,0,0) #000000 black 256: (0,255,0) #00FF00 lime 1024: (255,255,255) #FFFFFF white""" }, { # проверка увеличения и обрезки по горизонтали "name": "Increase size and cut", "resize": (32,32), "result": """768: (0,0,0) #000000 black 256: (0,255,0) #00FF00 lime""" }, { # проверка увеличения по горизонтали # в этом случае будет отрезан верх и низ # поэтому на выходе нет зелёного цвета "name": "Increase horizontal size", "resize": (16,48), "result": """384: (0,0,0) #000000 gray(0) 384: (255,255,255) #FFFFFF gray(255)""" }, ], ids=lambda x:x["name"]) def test_imagemagick_convert(case): image_path = "tests/utils/testfiles/origin.png" output_file = "tests/utils/testfiles/test_output5.png" if os.path.exists(output_file): os.unlink(output_file) im = ImageMagick() im.default_opts = ["-filter","box"] assert im.convert_resize_crop_center(image_path, output_file, *case["resize"]) histogram = get_histogram(output_file, image_path) discard_space = lambda x: x.replace(" ","").replace("\n","") assert discard_space(histogram) == discard_space(case["result"]) @pytest.mark.chroot @pytest.mark.images_utils def test_chroot_imagemagick_convert_center(chroot_test): curpath = os.getcwd() image_path = "tests/utils/testfiles/origin.png" output_file = "tests/utils/testfiles/test_output.png" image_path = os.path.join(curpath, image_path) output_file = os.path.join(curpath, output_file) result = """48: (0,0,0) #000000 black 16: (0,255,0) #00FF00 lime""" if os.path.exists(output_file): os.unlink(output_file) im = ImageMagick(chroot_test) im.default_opts = ["-filter","box"] assert im.convert_resize_crop_center(image_path, output_file, 8, 8) histogram = get_histogram(output_file, image_path) discard_space = lambda x: x.replace(" ","").replace("\n","") assert discard_space(histogram) == discard_space(result) @pytest.mark.images_utils def test_imagemagick_convert_gfxboot(): output_file = "tests/utils/testfiles/test_output.jpg" image_path = "tests/utils/testfiles/origin.png" im = ImageMagick() im.convert_resize_gfxboot(image_path, output_file, 32, 32) assert "sampling-factor: 2x2" in get_verbose_image_info(output_file) @pytest.mark.images_utils def test_clear_imagemagick_convert(): for output_file in ( "tests/utils/testfiles/test_output.png", "tests/utils/testfiles/test_output.jpg" ): if os.path.exists(output_file): os.unlink(output_file)