"""Test convert_thumbnails.""" from decimal import Decimal import io from unittest.mock import call from unittest.mock import NonCallableMagicMock import urllib from PIL import Image import pytest from video.connectors import s3 as s3_connector from video.constants import assets from video.constants import job_io_fields from video.logic.activities import convert_thumbnails @pytest.mark.parametrize(( 'custom_thumb_key', 'default_thumb_url', 'expected_result', 'exected_get_url_for_s3_object_calls' ), [ ( 'custom_thumb_key', 'default_thumb_url', 'test_custom_thumbnail_url', [call('test-orcd-video-assets', 'custom_thumb_key')] ), (None, 'default_thumb_url', 'default_thumb_url', []) ]) def test__get_custom_thumbnail_s3_url( mocker, custom_thumb_key, default_thumb_url, expected_result, exected_get_url_for_s3_object_calls): """Test _get_custom_thumbnail_s3_url.""" mocker.patch.object( s3_connector, 'get_url_for_s3_object', return_value='test_custom_thumbnail_url', autospec=True) assert convert_thumbnails._get_custom_thumbnail_s3_url( custom_thumb_key, default_thumb_url) == expected_result assert s3_connector.get_url_for_s3_object.call_args_list == ( exected_get_url_for_s3_object_calls) def test_convert_thumbnails(mocker): """Test convert_thumbnails.""" mocker.patch.object( s3_connector, 'get_url_for_s3_object', return_value='test_default_thumbnail_url', autospec=True) mocker.patch.object(s3_connector, 'get_s3_client', autospec=True) mocker.patch.object(urllib, 'request', autospec=True) mocker.patch.object( Image, 'open', return_value=NonCallableMagicMock(width=1920, height=768), autospec=True) mocker.patch.object( Image, 'new', return_value=NonCallableMagicMock(width=1920, height=768), autospec=True) mocker.patch.object(io, 'BytesIO', autospec=True) mocker.patch.object( convert_thumbnails, '_get_custom_thumbnail_s3_url', return_value='testing custom 234', autospec=True) outputs = convert_thumbnails.convert_default_thumbnail_to_tiff({ job_io_fields.CONVERT_DEFAULT_THUMBNAIL_TO_TIFF_JOB_ID: 123, job_io_fields.WORKFLOW_JOB_ID: 123456, job_io_fields.THUMBNAIL_S3_KEY: 'test_default_thumbnail_s3_key', }) s3_connector.get_url_for_s3_object.assert_called_once_with( assets.VIDEO_S3_BUCKET, 'test_default_thumbnail_s3_key') convert_thumbnails._get_custom_thumbnail_s3_url.assert_called_once_with( None, 'test_default_thumbnail_url') urllib.request.urlopen.call_args_list == [ call('test_default_thumbnail_url'), call('testing custom 234')] (s3_connector .get_s3_client .return_value .upload_fileobj .assert_has_calls([ call( io.BytesIO.return_value, assets.VIDEO_S3_BUCKET, 'mezzanine/tiff/123456/test_default_thumbnail_url_s2.tif', ), call( io.BytesIO.return_value, assets.VIDEO_S3_BUCKET, 'mezzanine/tiff/123456/test_default_thumbnail_url_s5.tif', ), call( io.BytesIO.return_value, assets.VIDEO_S3_BUCKET, 'mezzanine/tiff/123456/testing custom 234_s10.tif', ), call( io.BytesIO.return_value, assets.VIDEO_S3_BUCKET, 'mezzanine/tiff/123456/testing custom 234_s11.tif', ) ])) assert { job_io_fields.TIFF_THUMBNAIL_S3_KEY: 'mezzanine/tiff/123456/test_default_thumbnail_url' } == outputs @pytest.mark.parametrize( ('image_width', 'image_height', 'output_aspect_ratio', 'expected_return'), [ (1920, 1080, Decimal(16) / 9, (1920, 1080)), (1920, 768, Decimal(16) / 9, (1920, 1080)), (768, 1920, Decimal(16) / 9, (3414, 1920)), (960, 720, Decimal(16) / 9, (1280, 720)), (1920, 1080, Decimal(5) / 2, (2700, 1080)), (1920, 768, Decimal(5) / 2, (1920, 768)), (768, 1920, Decimal(5) / 2, (4800, 1920)), (960, 720, Decimal(5) / 2, (1800, 720)), ]) def test_get_frame_resolution( image_width, image_height, output_aspect_ratio, expected_return): """Test get_frame_resolution.""" assert expected_return == convert_thumbnails.get_frame_resolution( image_width, image_height, output_aspect_ratio) @pytest.mark.parametrize( ('image_width', 'image_height', 'frame_width', 'frame_height', 'expected_return'), [ (1920, 1080, 1920, 1080, (0, 0)), (1920, 768, 1920, 1080, (0, 156)), (768, 1920, 3414, 1920, (1324, 0)), (960, 720, 1280, 720, (160, 0)), (1920, 1080, 2700, 1080, (390, 0)), (1920, 768, 1920, 768, (0, 0)), (768, 1920, 4800, 1920, (2016, 0)), (960, 720, 1800, 720, (420, 0)), ]) def test_get_upper_left_corner_coordinates_for_centering( image_width, image_height, frame_width, frame_height, expected_return): """Test get_upper_left_corner_coordinates_for_centering.""" assert expected_return == ( convert_thumbnails.get_upper_left_corner_coordinates_for_centering( image_width, image_height, frame_width, frame_height))