def test_schedule_retranscodes_error(mocker, mocked_celery): """ Test that schedule_retranscodes logs an error if it occurs """ mock_error_log = mocker.patch("cloudsync.tasks.log.exception") mocker.patch("cloudsync.tasks.retranscode_video.si", side_effect=ClientError) VideoFactory.create_batch(5, schedule_retranscode=True) schedule_retranscodes.delay() mock_error_log.assert_called_with("schedule_retranscodes threw an error")
def test_video_ordering(): """ Tests that videos are sorted by reverse creation date or forward custom order """ collection = CollectionFactory.create() VideoFactory.create_batch(10, collection=collection) # Should be sorted by reverse creation date videos = collection.videos.all() for (idx, video) in enumerate(videos): if idx > len(videos) - 1: assert video.created_at >= videos[idx + 1].created_at videos[idx].custom_order = len(videos) - idx - 1 videos[idx].save() # Should be sorted by custom_order resorted_videos = Collection.objects.get(id=collection.id).videos.all() for (idx, video) in enumerate(resorted_videos): assert video.custom_order == idx
def test_schedule_retranscodes(mocker, mock_transcode, mock_successful_encode_job, mocked_celery): """ Test that schedule_retranscodes triggers retranscode_video tasks for each scheduled video """ retranscode_video_mock = mocker.patch("cloudsync.tasks.retranscode_video", autospec=True) collection = CollectionFactory.create(schedule_retranscode=True) scheduled_videos = VideoFactory.create_batch(5, schedule_retranscode=True) VideoFactory.create_batch(3, schedule_retranscode=False) with pytest.raises(mocked_celery.replace_exception_class): schedule_retranscodes.delay() assert mocked_celery.group.call_count == 1 assert retranscode_video_mock.si.call_count == len(scheduled_videos) for video in scheduled_videos: retranscode_video_mock.si.assert_any_call(video.id) assert Collection.objects.get( id=collection.id).schedule_retranscode is False
def test_upload_youtube_videos_error(mocker): """ Test that the YoutubeVideo object is deleted if an error occurs during upload, and all videos are processed """ videos = VideoFactory.create_batch(3, is_public=True, status=VideoStatus.COMPLETE) mock_uploader = mocker.patch("cloudsync.tasks.YouTubeApi.upload_video", side_effect=OSError) upload_youtube_videos() assert mock_uploader.call_count == 3 for video in videos: assert YouTubeVideo.objects.filter(video=video).first() is None
def test_upload_youtube_videos(mocker, source, max_uploads): """ Test that the upload_youtube_videos task calls YouTubeApi.upload_video & creates a YoutubeVideo object for each public video, up to the max daily limit """ settings.YT_UPLOAD_LIMIT = max_uploads private_videos = VideoFactory.create_batch(2, is_public=False, status=VideoStatus.COMPLETE) VideoFactory.create_batch( 3, collection=CollectionFactory(stream_source=source), is_public=True, status=VideoStatus.COMPLETE, ) mock_uploader = mocker.patch( "cloudsync.tasks.YouTubeApi.upload_video", return_value={ "id": "".join([random.choice(string.ascii_lowercase) for n in range(8)]), "status": { "uploadStatus": "uploaded" }, }, ) upload_youtube_videos() assert mock_uploader.call_count == (min( 3, max_uploads) if source != StreamSource.CLOUDFRONT else 0) for video in Video.objects.filter( is_public=True).order_by("-created_at")[:settings.YT_UPLOAD_LIMIT]: if video.collection.stream_source != StreamSource.CLOUDFRONT: assert YouTubeVideo.objects.filter(video=video).first() is not None else: assert YouTubeVideo.objects.filter(video=video).first() is None for video in private_videos: assert YouTubeVideo.objects.filter(video=video).first() is None
def test_upload_youtube_quota_exceeded(mocker, msg): """ Test that the YoutubeVideo object is deleted if an error occurs during upload, and the loop is halted if the quota is exceeded. """ videos = VideoFactory.create_batch(3, is_public=True, status=VideoStatus.COMPLETE) mock_uploader = mocker.patch( "cloudsync.tasks.YouTubeApi.upload_video", side_effect=ResumableUploadError(MockHttpErrorResponse(403), str.encode(msg, "utf-8")), ) upload_youtube_videos() assert mock_uploader.call_count == (1 if msg == API_QUOTA_ERROR_MSG else 3) for video in videos: assert YouTubeVideo.objects.filter(video=video).first() is None