"""Tests for Asset Status logic tier.""" import datetime import os from unittest.mock import MagicMock from oto import status import pytest from asset_transcoder import config from asset_transcoder.logic import asset_status from asset_transcoder.models import asset_upload as asset_upload_model from asset_transcoder.utils import exceptions as exc from asset_transcoder.utils import signed_urls from tests.unit import conftest def test_asset_status_create_success(empty_db_fixture, asset_status_fixture): """Test that asset_status is created successfully.""" clean_filename, ext = os.path.splitext(asset_status_fixture['filename']) upload_payload = dict( user_id='alw:1', asset_type=ext, filename=clean_filename ) asset_upload = asset_upload_model.create_asset_upload(upload_payload) assert asset_upload asset_upload_id = asset_upload['id'] result = asset_status.create_status(**asset_status_fixture) assert result['asset_upload_id'] == asset_upload_id assert result['errors'] is None def test_asset_status_create_with_error(empty_db_fixture, asset_status_with_errors_fixture): """Test that asset_status is created successfully.""" clean_filename, ext = os.path.splitext(asset_status_with_errors_fixture['filename']) upload_payload = dict( user_id='alw:1', asset_type=ext, filename=clean_filename ) asset_upload = asset_upload_model.create_asset_upload(upload_payload) assert asset_upload asset_upload_id = asset_upload['id'] result = asset_status.create_status(**asset_status_with_errors_fixture) assert result['asset_upload_id'] == asset_upload_id assert result['errors'] == 'image_invalid_mode|image_too_small_dimensions_error' def test_asset_status_create_fail_no_upload(db_fixture, asset_status_fixture): """Test that asset_status fails if no status_upload is found.""" error_message = 'Asset upload not found' with pytest.raises(Exception) as err: asset_status.create_status(**asset_status_fixture) assert err.value.status == status.NOT_FOUND assert err.value.message == error_message def test_get_status(db_fixture): """Test that get_status works.""" os.environ['OUTPUT_PODCAST_CDN'] = 'app.cdn.com' result = asset_status.get_status('bucket_filename_3.dang', 'unsigned_url', None) assert result == { 'asset_upload_id': 3, 'created_date': datetime.datetime(2019, 1, 1), 'id': 3, 'errors': None, 'status': 'encoding_completed', 'status_time': None, 'assets': [ { 'id': 3, 'asset_type': 'JPG', 'asset_subtype': 'large_cover', 'filename': 'test_bucket_filename_3', 'duration': 0, 'url': 'https://app.cdn.com/test_bucket_filename_3' }, { 'id': 6, 'asset_type': 'JPG', 'asset_subtype': 'xlarge_cover', 'filename': 'test_bucket_filename_6', 'duration': 0, 'url': 'https://app.cdn.com/test_bucket_filename_6' } ] } def test_get_status_with_signed_urls(db_fixture, monkeypatch): """Test that get_status works.""" os.environ['OUTPUT_PODCAST_CDN'] = 'app.cdn.com' monkeypatch.setattr(config, 'CLOUDFRONT_PRIVATE_KEY', 'cdn-private-key') monkeypatch.setattr(config, 'CLOUDFRONT_KEY_PAIR_ID', 'cdn-key-id') monkeypatch.setattr(signed_urls, 'sign_urls', MagicMock(side_effect=signed_urls.sign_urls)) monkeypatch.setattr(signed_urls, '_sign_url', MagicMock(side_effect=conftest.sign_url_mock)) result = asset_status.get_status('bucket_filename_3.dang', 'signed_url', 10) assert result == { 'asset_upload_id': 3, 'created_date': datetime.datetime(2019, 1, 1), 'id': 3, 'errors': None, 'status': 'encoding_completed', 'status_time': None, 'assets': [ { 'id': 3, 'asset_type': 'JPG', 'asset_subtype': 'large_cover', 'filename': 'test_bucket_filename_3', 'duration': 0, 'url': 'https://app.cdn.com/test_bucket_filename_3?' 'Policy=policy&Signature=signature&Key-Pair-Id=key-pair' }, { 'id': 6, 'asset_type': 'JPG', 'asset_subtype': 'xlarge_cover', 'filename': 'test_bucket_filename_6', 'duration': 0, 'url': 'https://app.cdn.com/test_bucket_filename_6?' 'Policy=policy&Signature=signature&Key-Pair-Id=key-pair' } ] } signed_urls.sign_urls.assert_called_once def test_get_status_can_fail_if_no_asset(empty_db_fixture, asset_status_fixture): """Test that get_status works fails with no asset is present.""" with pytest.raises(exc.OwsError) as err: asset_status.get_status('hot-dog-hot-dance-hot-tamale', 'unsigned_url', None) assert err.value.status == status.NOT_FOUND def test_get_status_not_started(db_fixture): """Test that get_status return not_started status for just uploaded assets.""" result = asset_status.get_status('bucket_filename_1', 'unsigned_url', None) assert result == { 'status': 'not_started', 'description': '', 'assets': [] }