"""Tests for OWS Assets API Client.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from src.connectors import ows_assets @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.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_final_status_success(mock_client, mock_datetime): """Test post_asset_final_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 final_assets = [{'key': 'output/file.tif', 'bucket': 'bucket'}] message = {'status': 'success'} result = ows_assets.post_asset_final_status('file.ext', 'success', 'All good', final_assets, message) assert result is True mock_client.post.assert_called_once() call_kwargs = mock_client.post.call_args assert call_kwargs.kwargs['path'] == '/v2/asset/final' assert call_kwargs.kwargs['json']['filename'] == 'file.ext' assert call_kwargs.kwargs['json']['final_assets'] == final_assets @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') @pytest.mark.parametrize('status_code', [404, 409]) def test_post_asset_final_status_404_and_409_ignored( mock_client, mock_datetime, status_code): """Test post_asset_final_status silently ignores 404 and 409 responses.""" mock_datetime.now.return_value.strftime.return_value = '2026-03-04T12:00:00.000000Z' mock_response = MagicMock() mock_response.status_code = status_code mock_client.post.return_value = mock_response result = ows_assets.post_asset_final_status( 'file.ext', 'success', 'desc', [{'key': 'result.ext'}], {'key': 'value'}) assert result is True mock_client.post.assert_called_once() @patch('src.connectors.ows_assets.datetime') @patch('src.connectors.ows_assets.client') def test_post_asset_final_status_non_200_raises_exception(mock_client, mock_datetime): """Test post_asset_final_status raises Exception on non-200/non-404/non-409 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_final_status( 'file.ext', 'error', 'desc', [{'key': 'result.ext'}], {'key': 'value'}) mock_client.post.assert_called_once()