"""Test cases for assets validators.""" from typing import Any from unittest.mock import MagicMock, patch import pytest from pytest_mock import MockerFixture from assets.constants import asset_types, asset_upload_types from assets.logic import validators from assets.models import asset_final, asset_upload_type, ows_track TRACKS_RESPONSE = { "items": [ {"tuid": 13333333}, {"tuid": 13333334}, ], "pagination": {"type": "none", "total_records": 2}, } def _make_final(track_unique_id: int, asset_type: str | None) -> dict[str, Any]: return { "product_id": 123, "track_unique_id": track_unique_id, "asset_type": asset_type, "s3_bucket": None, "s3_key": None, "updated_date": None, } @patch("assets.logic.validators.g", spec=["log"]) @pytest.mark.parametrize( ( "test_description", "wav_finals", "atmos_finals", "expected_errors", ), [ ( "Valid: 1 stereo per track, no atmos", [ _make_final(13333333, asset_types.TYPE_FILE_WAV), _make_final(13333334, asset_types.TYPE_FILE_WAV), ], [], [], ), ( "Valid: 1 stereo per track, 1 atmos per track", [ _make_final(13333333, asset_types.TYPE_FILE_WAV), _make_final(13333334, asset_types.TYPE_FILE_WAV), ], [ _make_final(13333333, asset_types.TYPE_FILE_ATMOS), _make_final(13333334, asset_types.TYPE_FILE_ATMOS), ], [], ), ( "Missing stereo for one track", [_make_final(13333334, asset_types.TYPE_FILE_WAV)], [], ["This product has missing audio assets, please contact the label user."], ), ( "Missing stereo for all tracks", [], [], ["This product has missing audio assets, please contact the label user."], ), ( "Stereo still processing for one track", [ _make_final(13333333, None), _make_final(13333334, asset_types.TYPE_FILE_WAV), ], [], [ "This product has in-progress audio asset updates, please contact the label user." ], ), ( "Atmos still processing for one track", [ _make_final(13333333, asset_types.TYPE_FILE_WAV), _make_final(13333334, asset_types.TYPE_FILE_WAV), ], [_make_final(13333333, None)], [ "This product has in-progress atmos asset updates, please contact the label user." ], ), ( "Multiple errors: missing stereo for one track, atmos still processing", [_make_final(13333334, asset_types.TYPE_FILE_WAV)], [_make_final(13333333, None)], [ "This product has missing audio assets, please contact the label user.", "This product has in-progress atmos asset updates, please contact the label user.", ], ), ( "Multiple errors: stereo still processing, atmos still processing", [ _make_final(13333333, None), _make_final(13333334, asset_types.TYPE_FILE_WAV), ], [_make_final(13333334, None)], [ "This product has in-progress audio asset updates, please contact the label user.", "This product has in-progress atmos asset updates, please contact the label user.", ], ), ( "Multiple errors: missing stereo, stereo still processing, atmos still processing", [ _make_final(13333333, None), ], [_make_final(13333333, None)], [ "This product has missing audio assets, please contact the label user.", "This product has in-progress audio asset updates, please contact the label user.", "This product has in-progress atmos asset updates, please contact the label user.", ], ), ], ) def test_validate_audio_assets( _mock_g: MagicMock, mocker: MockerFixture, test_description: str, wav_finals: list[dict[str, Any]], atmos_finals: list[dict[str, Any]], expected_errors: list[str], ) -> None: """Test for validators.validate_audio_assets.""" product_id = 123 mocker.patch.object( ows_track, "get_tracks_by_product_id", return_value=TRACKS_RESPONSE ) stereo_type_id = 1 atmos_type_id = 3 audio_finals = [ {**final, "asset_upload_type_id": stereo_type_id} for final in wav_finals ] + [{**final, "asset_upload_type_id": atmos_type_id} for final in atmos_finals] mocker.patch.object( asset_final, "get_product_asset_upload_and_final", return_value=audio_finals, ) mocker.patch.object( asset_upload_type, "resolve_asset_upload_type_id", side_effect=lambda upload_type: ( stereo_type_id if upload_type == asset_upload_types.STEREO else atmos_type_id ), ) result = validators.validate_audio_assets(product_id) assert result == expected_errors