import json from unittest.mock import MagicMock, call, patch import pytest from httpx import Response from src import app def test_handler_exception() -> None: """Test the main handler.""" with pytest.raises(TypeError) as exc: app.handler(None, None) assert str(exc.value) == "'NoneType' object is not subscriptable" @patch("src.app.get_tracks_for_product") @patch("src.app.get_music_assets_for_products") @patch("src.app.get_video_assets_for_products") @patch("src.app.upload_to_s3") @patch("src.app.ows_client") def test_handler_no_assets( mock_ows_client: MagicMock, mock_s3_upload: MagicMock, mock_get_video_assets: MagicMock, mock_get_music_assets: MagicMock, mock_get_tracks: MagicMock, ows_track_response_mock: Response, ) -> None: """Test the main handler.""" mock_get_tracks.return_value = ows_track_response_mock mock_get_music_assets.return_value = Response(status_code=404) mock_get_video_assets.return_value = Response(status_code=404) result = app.handler( { "execution_name": "test_execution", "export_id": "test_export", "product_ids": ["123", "456", "789"], "part_index": 1, "asset_types": ["WAV", "TIF", "VIDEO_MASTER"], }, None, ) assert result == { "execution_name": "test_execution", "export_id": "test_export", "part_index": 1, } assert mock_get_music_assets.call_count == 1 assert mock_get_music_assets.call_args_list == [ call(mock_ows_client, {123, 456, 789}, {"WAV", "TIF"}), ] assert mock_get_video_assets.call_count == 1 assert mock_get_video_assets.call_args_list == [ call(mock_ows_client, {789}, {"VIDEO_MASTER"}), ] assert mock_s3_upload.call_count == 1 assert mock_s3_upload.call_args_list == [ call( "test_export/test_execution/asset_locations_1.json", json.dumps({"execution_name": "test_execution", "asset_locations": []}), ) ] @patch("src.app.get_tracks_for_product") @patch("src.app.get_music_assets_for_products") @patch("src.app.get_video_assets_for_products") @patch("src.app.upload_to_s3") @patch("src.app.ows_client") def test_handler_got_assets( mock_ows_client: MagicMock, mock_s3_upload: MagicMock, mock_get_video_assets: MagicMock, mock_get_music_assets: MagicMock, mock_get_tracks: MagicMock, ows_track_response_mock: Response, ) -> None: """Test the main handler.""" mock_get_tracks.return_value = ows_track_response_mock mock_get_music_assets.return_value = Response( status_code=200, content=""" [ { "s3_key": "test1.wav", "s3_bucket": "music_bucket", "asset_type": "WAV", "product_id": 123, "tuid": 1 }, { "s3_key": "test2.wav", "s3_bucket": "music_bucket", "asset_type": "WAV", "product_id": 123, "tuid": 2 }, { "s3_key": "test.tif", "s3_bucket": "music_bucket", "asset_type": "TIF", "product_id": 123, "tuid": 0 } ] """, ) mock_get_video_assets.return_value = Response( status_code=200, content=""" [ { "s3_key": "test.mov", "s3_bucket": "video_bucket", "asset_type": "VIDEO_MASTER", "product_id": 789, "tuid": 5 } ] """, ) result = app.handler( { "execution_name": "test_execution", "export_id": "test_export", "product_ids": ["123", "456", "789"], "part_index": 1, "asset_types": ["WAV", "TIF", "VIDEO_MASTER"], }, None, ) assert result == { "execution_name": "test_execution", "export_id": "test_export", "part_index": 1, } assert mock_get_music_assets.call_count == 1 assert mock_get_music_assets.call_args_list == [ call(mock_ows_client, {123, 456, 789}, {"WAV", "TIF"}), ] assert mock_get_video_assets.call_count == 1 assert mock_get_video_assets.call_args_list == [ call(mock_ows_client, {789}, {"VIDEO_MASTER"}), ] assert mock_s3_upload.call_count == 1 assert mock_s3_upload.call_args_list == [ call( "test_export/test_execution/asset_locations_1.json", json.dumps( { "execution_name": "test_execution", "asset_locations": [ { "source": "music_bucket/test1.wav", "destination": "3452345234523/3452345234523_1_1.wav", }, { "source": "music_bucket/test2.wav", "destination": "3452345234523/3452345234523_1_2.wav", }, { "source": "music_bucket/test.tif", "destination": "3452345234523/3452345234523.tif", }, { "source": "video_bucket/test.mov", "destination": "95673456433456/95673456433456_1_2.mov", }, ], } ), ), ] @patch("src.app.get_music_assets_for_products") def test_get_music_assets_with_blank_asset_types( mock_get_music_assets: MagicMock, ) -> None: """Test get_music_assets method.""" product_ids = {1, 2, 3} asset_types: set[str] = set() result = app.get_music_assets(product_ids, asset_types) assert result is None assert mock_get_music_assets.call_count == 0 @patch("src.app.get_video_assets_for_products") def test_get_video_assets_with_blank_asset_types( mock_get_video_assets: MagicMock, ) -> None: """Test get_video_assets method.""" product_ids = {1, 2, 3} asset_types: set[str] = set() result = app.get_video_assets(product_ids, asset_types) assert result is None assert mock_get_video_assets.call_count == 0