"""Tests for OWS Assets API Client.""" from unittest.mock import MagicMock from unittest.mock import Mock from unittest.mock import patch import pytest from src.connectors import ows_assets from src import lambda_exceptions @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_status_success(mock_client, mock_datetime): """Test post_asset_status with a successful response.""" mock_datetime.now.return_value.strftime.return_value = '2026-03-04T12:00:00.000000Z' mock_response = MagicMock() mock_response.status_code = 200 mock_client.post.return_value = mock_response ows_assets.post_asset_status('file.ext', 'success', 'All good', {'key': 'value'}) mock_client.post.assert_called_once() call_kwargs = mock_client.post.call_args assert call_kwargs.kwargs['json']['filename'] == 'file.ext' assert call_kwargs.kwargs['json']['status'] == 'success' assert call_kwargs.kwargs['json']['description'] == 'All good' assert call_kwargs.kwargs['json']['message'] == {'key': 'value'} assert call_kwargs.kwargs['json']['timestamp'] == '2026-03-04T12:00:00.000000Z' @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_status_404_ignored(mock_client, mock_datetime): """Test post_asset_status silently ignores 404 responses.""" mock_datetime.now.return_value.strftime.return_value = '2026-03-04T12:00:00.000000Z' mock_response = MagicMock() mock_response.status_code = 404 mock_client.post.return_value = mock_response # Should not raise ows_assets.post_asset_status('file.ext', 'success', 'desc', {'key': 'value'}) mock_client.post.assert_called_once() @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_status_non_200_raises_exception(mock_client, mock_datetime): """Test post_asset_status raises Exception on non-200/non-404 status.""" mock_datetime.now.return_value.strftime.return_value = '2026-03-04T12:00:00.000000Z' mock_response = MagicMock() mock_response.status_code = 500 mock_response.text = 'Internal Server Error' mock_client.post.return_value = mock_response with pytest.raises(Exception, match='Failed to post to ows-assets'): ows_assets.post_asset_status('file.ext', 'error', 'desc', {'key': 'value'}) mock_client.post.assert_called_once() @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_status_client_exception(mock_client, mock_datetime): """Test post_asset_status raises when client.post throws an exception.""" mock_datetime.now.return_value.strftime.return_value = '2026-03-04T12:00:00.000000Z' mock_client.post.side_effect = ConnectionError('Connection refused') with pytest.raises(ConnectionError, match='Connection refused'): ows_assets.post_asset_status('file.ext', 'error', 'desc', {'key': 'value'}) mock_client.post.assert_called_once() @patch('src.connectors.ows_assets.client') def test_get_asset_upload_type_not_found(client): """Test get_asset_upload_type raises AssetNotFoundException on 404.""" mock_response = Mock(status_code=404, text='Not Found') client.get.return_value = mock_response with pytest.raises( lambda_exceptions.AssetNotFoundException, match='Asset not found in ows-assets in encoding_route. Status: 404; text: Not Found' ): ows_assets.get_asset_upload_type('some_filename') client.get.assert_called_once_with( headers={'Orchard-User-Id': 'oa:179'}, path='/v2/asset', service_name='ows-assets', params={'filename': 'some_filename', 'state': 'raw'} ) @patch('src.connectors.ows_assets.client') def test_get_asset_upload_type_error(client): """Test get_asset_upload_type raises AssetUploadTypeRetrievalException on non-200.""" mock_response = Mock(status_code=500, text='Internal Server Error') client.get.return_value = mock_response with pytest.raises( lambda_exceptions.AssetUploadTypeRetrievalException, match='Failed to get asset upload type from ows-assets in encoding_route. Status: 500; text: Internal Server Error' ): ows_assets.get_asset_upload_type('some_filename') client.get.assert_called_once_with( headers={'Orchard-User-Id': 'oa:179'}, path='/v2/asset', service_name='ows-assets', params={'filename': 'some_filename', 'state': 'raw'} ) @patch('src.connectors.ows_assets.client') def test_get_asset_upload_type(client): """Test get_asset_upload_type success.""" mock_response = Mock(status_code=200) mock_response.json.return_value = {'asset_upload_type': 'stereo'} client.get.return_value = mock_response asset_upload_type = ows_assets.get_asset_upload_type('some_filename') assert asset_upload_type == 'stereo' client.get.assert_called_once_with( headers={'Orchard-User-Id': 'oa:179'}, path='/v2/asset', service_name='ows-assets', params={'filename': 'some_filename', 'state': 'raw'} )