"""Test validate_metadata.""" import pytest from video.constants import job_io_fields from video.constants import mediaconvert as mediaconvert_constants from video.logic.activities import validate_metadata @pytest.mark.parametrize(('test_description', 'inputs', 'expected_outputs'), [ ( 'Stream count validation.', { job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.NUM_AUDIO_STREAMS: 2, job_io_fields.NUM_VIDEO_STREAMS: 0, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001 }, { job_io_fields.ERROR_MUST_CONTAIN_EXACTLY_1_AUDIO_STREAM: ( 'Must contain exactly 1 audio stream.'), job_io_fields.ERROR_MUST_CONTAIN_EXACTLY_1_VIDEO_STREAM: ( 'Must contain exactly 1 video stream.'), }, ), ( 'Video duration validation.', { job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 9, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 9 }, { job_io_fields.ERROR_VIDEO_DURATION_TOO_SHORT: ( 'Video duration must be at least 10 seconds.' ) }, ), ( 'Validation of fields that do not depend on other fields.', { job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.AUDIO_STREAM_CHANNEL_COUNT: 3, job_io_fields.AUDIO_STREAM_CHANNEL_LAYOUT: 'ghi', job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 12321, job_io_fields.VIDEO_STREAM_WIDTH_PIXELS: 33, job_io_fields.VIDEO_STREAM_HEIGHT_PIXELS: 44, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_CODEC: 'applesauce', job_io_fields.VIDEO_STREAM_CODEC_PROFILE: 'bananas', }, { job_io_fields.ERROR_AUDIO_MUST_BE_STEREO: 'Audio must be stereo.', job_io_fields.ERROR_UNSUPPORTED_FRAME_RATE: 'Unsupported frame rate.', job_io_fields.ERROR_WIDTH_TOO_SMALL: 'Video width must be at least 640 pixels.', job_io_fields.ERROR_HEIGHT_TOO_SMALL: 'Video height must be at least 404 pixels.', }, ), ( 'MediaConvert at limit validation.', { job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.AUDIO_STREAM_CHANNEL_COUNT: 2, job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.VIDEO_STREAM_WIDTH_PIXELS: mediaconvert_constants.MAX_WIDTH_SUPPORTED_BY_MEDIACONVERT, job_io_fields.VIDEO_STREAM_HEIGHT_PIXELS: mediaconvert_constants.MAX_HEIGHT_SUPPORTED_BY_MEDIACONVERT, job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 25, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_CODEC: 'applesauce', job_io_fields.VIDEO_STREAM_CODEC_PROFILE: 'bananas', }, {}, ), ( 'MediaConvert over limit validation.', { job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.AUDIO_STREAM_CHANNEL_COUNT: 2, job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.VIDEO_STREAM_WIDTH_PIXELS: mediaconvert_constants.MAX_WIDTH_SUPPORTED_BY_MEDIACONVERT + 1, job_io_fields.VIDEO_STREAM_HEIGHT_PIXELS: (mediaconvert_constants.MAX_HEIGHT_SUPPORTED_BY_MEDIACONVERT + 1), job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 25, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_CODEC: 'applesauce', job_io_fields.VIDEO_STREAM_CODEC_PROFILE: 'bananas', }, { job_io_fields.ERROR_WIDTH_TOO_LARGE: 'Video width must be at most 8192 pixels.', job_io_fields.ERROR_HEIGHT_TOO_LARGE: 'Video height must be at most 4320 pixels.', }, ), ( 'Non square pixels.', { job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.AUDIO_STREAM_CHANNEL_COUNT: 1, job_io_fields.AUDIO_STREAM_CHANNEL_LAYOUT: 'ghi', job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 12321, job_io_fields.VIDEO_STREAM_WIDTH_PIXELS: 640, job_io_fields.VIDEO_STREAM_HEIGHT_PIXELS: 480, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 0.889, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_CODEC: 'applesauce', job_io_fields.VIDEO_STREAM_CODEC_PROFILE: 'bananas', }, { job_io_fields.ERROR_AUDIO_MUST_BE_STEREO: 'Audio must be stereo.', job_io_fields.ERROR_UNSUPPORTED_FRAME_RATE: 'Unsupported frame rate.', job_io_fields.ERROR_WIDTH_TOO_SMALL: 'Video width must be at least 640 pixels.', }, ), ( 'Unsupported DNxHR codec.', { job_io_fields.VALIDATE_METADATA_JOB_ID: 123, job_io_fields.NUM_AUDIO_STREAMS: 1, job_io_fields.NUM_VIDEO_STREAMS: 1, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 1001, job_io_fields.AUDIO_STREAM_CHANNEL_COUNT: 2, job_io_fields.AUDIO_STREAM_CHANNEL_LAYOUT: 'ghi', job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 30, job_io_fields.VIDEO_STREAM_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_STREAM_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_STREAM_PIXEL_ASPECT_RATIO: 1, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 1001, job_io_fields.VIDEO_STREAM_CODEC: 'vc-3', job_io_fields.VIDEO_STREAM_CODEC_PROFILE: 'ri@hq', }, { job_io_fields.ERROR_UNSUPPORTED_VIDEO_CODEC: 'The DNxHR codec is not currently supported. ' 'Please use ProRes.', }, ), ]) def test_validate_metadata(mocker, test_description, inputs, expected_outputs): """Test validate_metadata.""" outputs = validate_metadata.validate_metadata(inputs) assert expected_outputs == outputs