"""Test create streamable preview thumbnails and mezzanines.""" from datetime import datetime from unittest.mock import call import pytest from video.connectors import mediaconvert as mediaconvert_connector from video.constants import assets from video.constants import job_io_fields from video.constants import job_statuses from video.logic.activities import mediaconvert from video.models import ows_video def test_create_mediaconvert_job(mocker): """Test test_create_mediaconvert_job.""" mocker.patch.object( mediaconvert_connector, 'get_mediaconvert_client', autospec=True) (mediaconvert_connector .get_mediaconvert_client .return_value .create_job .return_value) = ({ 'Job': { 'Id': 'applesauce-bananas' } }) test_inputs = { job_io_fields.WORKFLOW_JOB_ID: 35, job_io_fields.INPUT_VIDEO_S3_BUCKET: 'test-bucket', job_io_fields.INPUT_VIDEO_S3_KEY: 'test-key', job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1088, job_io_fields.AUDIO_VOLUME_ADJUSTMENT_DB: -1.7, job_io_fields.INPUT_CLIP_START_TIMECODE: '00:00:00:04', job_io_fields.INPUT_CLIP_END_TIMECODE: '00:04:08:18', job_io_fields.VIDEO_INNER_TOP_LEFT_CORNER_X_PIXELS: 0, job_io_fields.VIDEO_INNER_TOP_LEFT_CORNER_Y_PIXELS: 164, job_io_fields.VIDEO_INNER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_INNER_HEIGHT_PIXELS: 752, job_io_fields.VIDEO_STREAM_DURATION_SECONDS: 255.3, job_io_fields.AUDIO_STREAM_DURATION_SECONDS: 250.1, job_io_fields.VIDEO_STREAM_FRAME_RATE_FRAMES_PER_SECOND: 50, job_io_fields.VIDEO_OUTPUT_INNER_WIDTH_PIXELS: 500, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1088, job_io_fields.PRODUCT_ID: 4422, } outputs = mediaconvert.create_mediaconvert_job( test_inputs, [ 'h264_preview', 'thumbnails_full_size', 'thumbnails_small', 'h264_mezzanine', 'prores_mezzanine', ], job_type=mediaconvert.create_mezzanines.__name__, ) (mediaconvert_connector .get_mediaconvert_client .return_value .create_job .assert_called_once_with( Queue='test-mediaconvert-queue', UserMetadata={'applesauce': 'bananas'}, Role='test-mediaconvert-role', Settings={ 'AdAvailOffset': 0, 'Inputs': [ { 'FilterEnable': 'AUTO', 'PsiControl': 'USE_PSI', 'FilterStrength': 0, 'DeblockFilter': 'DISABLED', 'DenoiseFilter': 'DISABLED', 'TimecodeSource': 'ZEROBASED', 'VideoSelector': { 'ColorSpace': 'FOLLOW' }, 'AudioSelectors': { 'Audio Selector 1': { 'Offset': 0, 'DefaultSelection': 'DEFAULT', 'ProgramSelection': 1 } }, 'FileInput': 's3://test-orcd-video-assets/blank/10-blank-frames-25-fps-8192x4320.mov' # noqa }, { 'FilterEnable': 'AUTO', 'PsiControl': 'USE_PSI', 'FilterStrength': 0, 'DeblockFilter': 'DISABLED', 'DenoiseFilter': 'DISABLED', 'TimecodeSource': 'ZEROBASED', 'VideoSelector': { 'ColorSpace': 'FOLLOW' }, 'AudioSelectors': { 'Audio Selector 1': { 'Offset': 0, 'DefaultSelection': 'DEFAULT', 'ProgramSelection': 1 } }, 'FileInput': 's3://test-bucket/test-key', 'InputClippings': [ { 'StartTimecode': '00:00:00:04', 'EndTimecode': '00:04:08:18' } ] }, { 'FilterEnable': 'AUTO', 'PsiControl': 'USE_PSI', 'FilterStrength': 0, 'DeblockFilter': 'DISABLED', 'DenoiseFilter': 'DISABLED', 'TimecodeSource': 'ZEROBASED', 'VideoSelector': { 'ColorSpace': 'FOLLOW' }, 'AudioSelectors': { 'Audio Selector 1': { 'Offset': 0, 'DefaultSelection': 'DEFAULT', 'ProgramSelection': 1 } }, 'FileInput': 's3://test-orcd-video-assets/blank/10-blank-frames-25-fps-8192x4320.mov' # noqa } ], 'OutputGroups': [ { 'Name': 'H.264 Preview', 'OutputGroupSettings': { 'Type': 'FILE_GROUP_SETTINGS', 'FileGroupSettings': { 'Destination': 's3://test-orcd-video-assets/streamable-preview/35/4422' # noqa } }, 'Outputs': [ { 'ContainerSettings': { 'Container': 'MP4', 'Mp4Settings': { 'CslgAtom': 'INCLUDE', 'FreeSpaceBox': 'EXCLUDE', 'MoovPlacement': 'PROGRESSIVE_DOWNLOAD' } }, 'Extension': 'mp4', 'VideoDescription': { 'TimecodeInsertion': 'DISABLED', 'AntiAlias': 'ENABLED', 'Sharpness': 50, 'VideoPreprocessors': { 'ColorCorrector': { 'ColorSpaceConversion': 'FORCE_709' } }, 'CodecSettings': { 'Codec': 'H_264', 'H264Settings': { 'InterlaceMode': 'PROGRESSIVE', 'NumberReferenceFrames': 3, 'Syntax': 'DEFAULT', 'Softness': 0, 'GopClosedCadence': 1, 'GopSize': 60, 'Slices': 1, 'GopBReference': 'DISABLED', 'MaxBitrate': 15000000, 'SlowPal': 'DISABLED', 'SpatialAdaptiveQuantization': 'ENABLED', # noqa 'TemporalAdaptiveQuantization': 'ENABLED', # noqa 'FlickerAdaptiveQuantization': 'ENABLED', # noqa 'EntropyEncoding': 'CABAC', 'RateControlMode': 'QVBR', 'QvbrSettings': { 'QvbrQualityLevel': 8 }, 'CodecProfile': 'HIGH', 'Telecine': 'NONE', 'MinIInterval': 0, 'AdaptiveQuantization': 'HIGH', 'CodecLevel': 'AUTO', 'FieldEncoding': 'PAFF', 'SceneChangeDetect': 'ENABLED', 'QualityTuningLevel': 'MULTI_PASS_HQ', # noqa 'UnregisteredSeiTimecode': 'DISABLED', # noqa 'GopSizeUnits': 'FRAMES', 'NumberBFramesBetweenReferenceFrames': 2, # noqa 'RepeatPps': 'DISABLED', 'DynamicSubGop': 'STATIC', 'ParControl': 'SPECIFIED', 'ParNumerator': 1, 'ParDenominator': 1, 'FramerateControl': 'SPECIFIED', 'FramerateConversionAlgorithm': 'DUPLICATE_DROP', # noqa 'FramerateNumerator': 25, 'FramerateDenominator': 1 } }, 'AfdSignaling': 'NONE', 'DropFrameTimecode': 'ENABLED', 'RespondToAfd': 'NONE', 'ColorMetadata': 'INSERT', 'ScalingBehavior': 'DEFAULT', 'Width': 1270, 'Height': 720, 'Crop': { 'X': 0, 'Y': 164, 'Width': 1920, 'Height': 752 }, 'Position': { 'X': 470, 'Y': 0, 'Width': 330, 'Height': 720 } }, 'AudioDescriptions': [ { 'AudioTypeControl': 'FOLLOW_INPUT', 'AudioSourceName': 'Audio Selector 1', 'CodecSettings': { 'Codec': 'AAC', 'AacSettings': { 'AudioDescriptionBroadcasterMix': 'NORMAL', # noqa 'VbrQuality': 'HIGH', 'RateControlMode': 'VBR', 'CodecProfile': 'LC', 'CodingMode': 'CODING_MODE_2_0', # noqa 'RawFormat': 'NONE', 'SampleRate': 48000, 'Specification': 'MPEG4' } }, 'RemixSettings': { 'ChannelMapping': { 'OutputChannels': [ { 'InputChannelsFineTune': [ # noqa -1.7, -60 ] }, { 'InputChannelsFineTune': [ # noqa -60, -1.7 ] } ] }, 'ChannelsIn': 2, 'ChannelsOut': 2 }, 'LanguageCodeControl': 'FOLLOW_INPUT' } ] } ] }, { 'Name': 'Full Size Thumbnails', 'OutputGroupSettings': { 'Type': 'FILE_GROUP_SETTINGS', 'FileGroupSettings': { 'Destination': 's3://test-orcd-video-assets/thumbnails/original-size/35/4422' # noqa } }, 'Outputs': [ { 'VideoDescription': { 'TimecodeInsertion': 'DISABLED', 'AntiAlias': 'ENABLED', 'Sharpness': 50, 'VideoPreprocessors': { 'ColorCorrector': { 'ColorSpaceConversion': 'FORCE_709' } }, 'CodecSettings': { 'Codec': 'FRAME_CAPTURE', 'FrameCaptureSettings': { 'FramerateNumerator': 1, 'FramerateDenominator': 1, 'MaxCaptures': 255, 'Quality': 100 } }, 'AfdSignaling': 'NONE', 'DropFrameTimecode': 'ENABLED', 'RespondToAfd': 'NONE', 'ColorMetadata': 'INSERT', 'ScalingBehavior': 'DEFAULT', 'Width': 1920, 'Height': 1088, 'Crop': { 'X': 0, 'Y': 164, 'Width': 1920, 'Height': 752 }, 'Position': { 'X': 710, 'Y': 0, 'Width': 500, 'Height': 1088 } }, 'ContainerSettings': { 'Container': 'RAW' }, 'Extension': 'jpg' } ] }, { 'Name': 'Small Thumbnails', 'OutputGroupSettings': { 'Type': 'FILE_GROUP_SETTINGS', 'FileGroupSettings': { 'Destination': 's3://test-orcd-video-assets/thumbnails/small/35/4422' # noqa } }, 'Outputs': [ { 'VideoDescription': { 'TimecodeInsertion': 'DISABLED', 'AntiAlias': 'ENABLED', 'Sharpness': 50, 'VideoPreprocessors': { 'ColorCorrector': { 'ColorSpaceConversion': 'FORCE_709' } }, 'CodecSettings': { 'Codec': 'FRAME_CAPTURE', 'FrameCaptureSettings': { 'FramerateNumerator': 1, 'FramerateDenominator': 1, 'MaxCaptures': 255, 'Quality': 100 } }, 'AfdSignaling': 'NONE', 'DropFrameTimecode': 'ENABLED', 'RespondToAfd': 'NONE', 'ColorMetadata': 'INSERT', 'ScalingBehavior': 'DEFAULT', 'Width': 508, 'Height': 288, 'Crop': { 'X': 0, 'Y': 164, 'Width': 1920, 'Height': 752 }, 'Position': { 'X': 188, 'Y': 0, 'Width': 132, 'Height': 288 } }, 'ContainerSettings': { 'Container': 'RAW' }, 'Extension': 'jpg' } ] }, { 'Name': 'H.264 Mezzanine', 'OutputGroupSettings': { 'Type': 'FILE_GROUP_SETTINGS', 'FileGroupSettings': { 'Destination': 's3://test-orcd-video-assets/mezzanine/h.264/35/4422' # noqa } }, 'Outputs': [ { 'VideoDescription': { 'TimecodeInsertion': 'DISABLED', 'AntiAlias': 'ENABLED', 'Sharpness': 50, 'VideoPreprocessors': { 'ColorCorrector': { 'ColorSpaceConversion': 'FORCE_709' } }, 'CodecSettings': { 'Codec': 'H_264', 'H264Settings': { 'InterlaceMode': 'PROGRESSIVE', 'NumberReferenceFrames': 3, 'Syntax': 'DEFAULT', 'Softness': 0, 'GopClosedCadence': 1, 'GopSize': 90, 'Slices': 1, 'GopBReference': 'DISABLED', 'MaxBitrate': 56000000, 'SlowPal': 'DISABLED', 'SpatialAdaptiveQuantization': 'ENABLED', # noqa 'TemporalAdaptiveQuantization': 'ENABLED', # noqa 'FlickerAdaptiveQuantization': 'ENABLED', # noqa 'EntropyEncoding': 'CABAC', 'RateControlMode': 'QVBR', 'QvbrSettings': { 'QvbrQualityLevel': 10, 'MaxAverageBitrate': 44000000 }, 'CodecProfile': 'HIGH', 'Telecine': 'NONE', 'MinIInterval': 0, 'AdaptiveQuantization': 'HIGH', 'CodecLevel': 'AUTO', 'FieldEncoding': 'PAFF', 'SceneChangeDetect': 'ENABLED', 'QualityTuningLevel': 'MULTI_PASS_HQ', # noqa 'UnregisteredSeiTimecode': 'DISABLED', # noqa 'GopSizeUnits': 'FRAMES', 'NumberBFramesBetweenReferenceFrames': 2, # noqa 'RepeatPps': 'DISABLED', 'DynamicSubGop': 'STATIC', 'ParControl': 'SPECIFIED', 'ParNumerator': 1, 'ParDenominator': 1, 'FramerateControl': 'SPECIFIED', 'FramerateConversionAlgorithm': 'DUPLICATE_DROP', # noqa 'FramerateNumerator': 25, 'FramerateDenominator': 1 } }, 'AfdSignaling': 'NONE', 'DropFrameTimecode': 'ENABLED', 'RespondToAfd': 'NONE', 'ColorMetadata': 'INSERT', 'ScalingBehavior': 'DEFAULT', 'Width': 1920, 'Height': 1088, 'Crop': { 'X': 0, 'Y': 164, 'Width': 1920, 'Height': 752 }, 'Position': { 'X': 710, 'Y': 0, 'Width': 500, 'Height': 1088 } }, 'AudioDescriptions': [ { 'AudioTypeControl': 'FOLLOW_INPUT', 'CodecSettings': { 'Codec': 'AAC', 'AacSettings': { 'AudioDescriptionBroadcasterMix': 'NORMAL', # noqa 'RateControlMode': 'VBR', 'CodecProfile': 'LC', 'CodingMode': 'CODING_MODE_2_0', # noqa 'RawFormat': 'NONE', 'SampleRate': 48000, 'Specification': 'MPEG4', 'VbrQuality': 'HIGH' } }, 'LanguageCodeControl': 'FOLLOW_INPUT', 'AudioSourceName': 'Audio Selector 1', 'RemixSettings': { 'ChannelMapping': { 'OutputChannels': [ { 'InputChannelsFineTune': [ # noqa -1.7, -60 ] }, { 'InputChannelsFineTune': [ # noqa -60, -1.7 ] } ] }, 'ChannelsIn': 2, 'ChannelsOut': 2 } } ], 'ContainerSettings': { 'Container': 'MP4', 'Mp4Settings': { 'CslgAtom': 'INCLUDE', 'FreeSpaceBox': 'EXCLUDE', 'MoovPlacement': 'PROGRESSIVE_DOWNLOAD' } }, 'Extension': 'mp4' } ] }, { 'Name': 'ProRes Mezzanine', 'OutputGroupSettings': { 'Type': 'FILE_GROUP_SETTINGS', 'FileGroupSettings': { 'Destination': 's3://test-orcd-video-assets/mezzanine/prores/35/4422' # noqa } }, 'Outputs': [ { 'VideoDescription': { 'TimecodeInsertion': 'DISABLED', 'AntiAlias': 'ENABLED', 'Sharpness': 50, 'VideoPreprocessors': { 'ColorCorrector': { 'ColorSpaceConversion': 'FORCE_709' } }, 'CodecSettings': { 'Codec': 'PRORES', 'ProresSettings': { 'InterlaceMode': 'PROGRESSIVE', 'CodecProfile': 'APPLE_PRORES_422_HQ', # noqa 'SlowPal': 'DISABLED', 'Telecine': 'NONE', 'ParControl': 'SPECIFIED', 'ParNumerator': 1, 'ParDenominator': 1, 'FramerateControl': 'SPECIFIED', 'FramerateConversionAlgorithm': 'DUPLICATE_DROP', # noqa 'FramerateNumerator': 25, 'FramerateDenominator': 1 } }, 'AfdSignaling': 'NONE', 'DropFrameTimecode': 'ENABLED', 'RespondToAfd': 'NONE', 'ColorMetadata': 'INSERT', 'ScalingBehavior': 'DEFAULT', 'Width': 1920, 'Height': 1088, 'Crop': { 'X': 0, 'Y': 164, 'Width': 1920, 'Height': 752 }, 'Position': { 'X': 710, 'Y': 0, 'Width': 500, 'Height': 1088 } }, 'AudioDescriptions': [ { 'AudioTypeControl': 'FOLLOW_INPUT', 'CodecSettings': { 'Codec': 'WAV', 'WavSettings': { 'BitDepth': 24, 'Channels': 2, 'SampleRate': 48000, 'Format': 'RIFF', } }, 'LanguageCodeControl': 'FOLLOW_INPUT', 'AudioSourceName': 'Audio Selector 1', 'RemixSettings': { 'ChannelMapping': { 'OutputChannels': [ { 'InputChannelsFineTune': [ # noqa -1.7, -60 ] }, { 'InputChannelsFineTune': [ # noqa -60, -1.7 ] } ] }, 'ChannelsIn': 2, 'ChannelsOut': 2 } } ], 'ContainerSettings': { 'Container': 'MOV', 'MovSettings': { 'ClapAtom': 'EXCLUDE', 'CslgAtom': 'INCLUDE', 'PaddingControl': 'NONE', 'Reference': 'SELF_CONTAINED', 'Mpeg2FourCCControl': 'MPEG' } }, 'Extension': 'mov' } ] } ], 'TimecodeConfig': { 'Source': 'ZEROBASED' } } )) expected_prores_mezzanine_output_s3_key = ( assets.MEZZANINE_S3_KEY_TEMPLATE.format( video_codec='prores', workflow_job_id=test_inputs[job_io_fields.WORKFLOW_JOB_ID], file_name=test_inputs[job_io_fields.PRODUCT_ID])) expected_h264_mezzanine_output_s3_key = ( assets.MEZZANINE_S3_KEY_TEMPLATE.format( video_codec='h.264', workflow_job_id=test_inputs[job_io_fields.WORKFLOW_JOB_ID], file_name=test_inputs[job_io_fields.PRODUCT_ID])) expected_small_thumbnails_output_s3_key = ( assets.THUMBNAILS_S3_KEY_TEMPLATE.format( size='small', workflow_job_id=test_inputs[job_io_fields.WORKFLOW_JOB_ID], file_name=test_inputs[job_io_fields.PRODUCT_ID])) assert { job_io_fields.CREATE_MEZZANINES_MEDIACONVERT_JOB_ID: 'applesauce-bananas', job_io_fields.PRORES_MEZZANINE_OUTPUT_S3_KEY: '{}.{}'.format(expected_prores_mezzanine_output_s3_key, 'mov'), job_io_fields.H264_MEZZANINE_OUTPUT_S3_KEY: '{}.{}'.format(expected_h264_mezzanine_output_s3_key, 'mp4'), job_io_fields.SMALL_THUMBNAILS_OUTPUT_S3_KEY: expected_small_thumbnails_output_s3_key } == outputs @pytest.mark.parametrize( ( 'test_description', 'job_status', 'expected_doneness', 'expected_change_job_status_calls', 'job_id', 'mediaconvert_job_id', ), [ ( 'test file found', 'COMPLETE', True, [call(33, job_statuses.COMPLETE)], 33, 'applesauce-bananas', ), ( 'test file not found', 'PROGRESSING', False, [], 33, 'applesauce-bananas', ), ( 'test error', 'ERROR', None, [], 33, 'applesauce-bananas', ), ]) def test_is_mediaconvert_job_done( mocker, test_description, job_status, expected_doneness, expected_change_job_status_calls, job_id, mediaconvert_job_id): """Test is_mediaconvert_job_done.""" mocker.patch.object( mediaconvert_connector, 'get_mediaconvert_client', autospec=True) mediaconvert_connector.get_mediaconvert_client.return_value.get_job.return_value = { # noqa 'Job': { 'Status': job_status, 'ErrorCode': 123, 'ErrorMessage': 'oopsie', 'Id': 654, 'CreatedAt': datetime(2015, 1, 1) } } mocker.patch.object(ows_video, 'change_job_status', autospec=True) outputs = ( mediaconvert .is_mediaconvert_job_done( { job_io_fields.CREATE_MEZZANINES_JOB_ID: job_id, job_io_fields.CREATE_MEZZANINES_MEDIACONVERT_JOB_ID: mediaconvert_job_id, }, mediaconvert.create_mezzanines.__name__, ) ) ows_video.change_job_status.assert_has_calls( expected_change_job_status_calls) assert expected_doneness == outputs.get( job_io_fields.IS_CREATE_MEZZANINES_DONE) def test_create_streamable_preview_and_thumbnails(mocker): """Test create_streamable_preview_and_thumbnails.""" test_inputs = {job_io_fields.WORKFLOW_JOB_ID: 789} mocker.patch.object( mediaconvert, 'create_mediaconvert_job', autospec=True) mediaconvert.create_streamable_preview_and_thumbnails( { **test_inputs, job_io_fields.CREATE_STREAMABLE_PREVIEW_AND_THUMBNAILS_JOB_ID: 123, }, ) mediaconvert.create_mediaconvert_job.assert_called_once_with( test_inputs, [ 'h264_preview', 'thumbnails_full_size', 'thumbnails_small', ], (mediaconvert .create_streamable_preview_and_thumbnails.__name__), ) def test_is_create_streamable_preview_and_thumbnails_done(mocker): """Test is_create_streamable_preview_and_thumbnails_done.""" test_inputs = { job_io_fields.CREATE_STREAMABLE_PREVIEW_AND_THUMBNAILS_MEDIACONVERT_JOB_ID: 789, # noqa job_io_fields.CREATE_STREAMABLE_PREVIEW_AND_THUMBNAILS_JOB_ID: 123, } mocker.patch.object( mediaconvert, 'is_mediaconvert_job_done', autospec=True, return_value={'abc': 'def'}) outputs = mediaconvert.is_create_streamable_preview_and_thumbnails_done( test_inputs) (mediaconvert .is_mediaconvert_job_done .assert_called_once_with( test_inputs, mediaconvert.create_streamable_preview_and_thumbnails.__name__, )) assert mediaconvert.is_mediaconvert_job_done.return_value == outputs def test_get_create_mezzanines_inputs(mocker): """Test get_create_mezzanines_inputs.""" mocker.patch.object( ows_video, 'get_jobs', return_value={ 'items': [ {'type': 'nope'}, { 'type': (mediaconvert.create_streamable_preview_and_thumbnails .__name__), 'inputs': { 'workflow_job_id': 321, 'test': 'inputs', 'video_output_width_pixels': 1920, 'video_output_height_pixels': 1080, } }, {'type': 'noooope'} ]}, autospec=True) outputs = mediaconvert.get_create_mezzanines_inputs( { job_io_fields.WORKFLOW_INGEST_JOB_ID: 123, job_io_fields.GET_CREATE_MEZZANINES_INPUTS_JOB_ID: 789, }) ows_video.get_jobs.assert_called_once_with({ 'job_parent_id': 123}) assert { 'test': 'inputs', job_io_fields.VIDEO_OUTPUT_OUTER_WIDTH_PIXELS: 1920, job_io_fields.VIDEO_OUTPUT_INNER_HEIGHT_PIXELS: 1080, job_io_fields.VIDEO_OUTPUT_OUTER_HEIGHT_PIXELS: 1080, } == outputs def test_create_mezzanines(mocker): """Test create_mezzanines.""" test_inputs = {job_io_fields.WORKFLOW_JOB_ID: 789} mocker.patch.object(mediaconvert, 'create_mediaconvert_job', autospec=True) mediaconvert.create_mezzanines({ **test_inputs, job_io_fields.CREATE_MEZZANINES_JOB_ID: 123, }) mediaconvert.create_mediaconvert_job.assert_called_once_with( test_inputs, [ 'h264_mezzanine', 'prores_mezzanine', ], mediaconvert.create_mezzanines.__name__, ) def test_is_create_mezzanines_done(mocker): """Test is_create_mezzanines_done.""" test_inputs = { job_io_fields.CREATE_MEZZANINES_MEDIACONVERT_JOB_ID: 789, job_io_fields.CREATE_MEZZANINES_JOB_ID: 123, } mocker.patch.object( mediaconvert, 'is_mediaconvert_job_done', autospec=True, return_value={'abc': 'def'}) outputs = mediaconvert.is_create_mezzanines_done(test_inputs) (mediaconvert .is_mediaconvert_job_done .assert_called_once_with( test_inputs, mediaconvert.create_mezzanines.__name__, )) assert mediaconvert.is_mediaconvert_job_done.return_value == outputs