"""Unit tests for ECS task handlers.""" from unittest.mock import patch from botocore.exceptions import ClientError import pytest from moneyhub.handlers.ecs_task import trigger_dbt_refresh from moneyhub.schemas.ecs_task import DbtRefreshRequest @patch('moneyhub.handlers.ecs_task.trigger_dbt_refresh_task') def test_trigger_dbt_refresh_success(mock_trigger_task): """Test successful dbt refresh trigger via Step Functions.""" mock_response = { 'execution_arn': 'arn:aws:states:us-east-1:123456789:execution:test-dbt-sm:exec-id', 'start_date': '2025-11-28T12:00:00' } mock_trigger_task.return_value = mock_response request = DbtRefreshRequest( full_refresh=True, select_models='model1 model2' ) result = trigger_dbt_refresh(request) assert result.execution_arn == mock_response['execution_arn'] assert result.start_date == mock_response['start_date'] assert result.status == 'RUNNING' assert 'dbt refresh Step Function triggered successfully' in result.message assert 'Full Refresh: True' in result.message mock_trigger_task.assert_called_once_with(request) @patch('moneyhub.handlers.ecs_task.trigger_dbt_refresh_task') def test_trigger_dbt_refresh_exception_passthrough(mock_trigger_task): """Test that exceptions from logic layer are passed through.""" mock_trigger_task.side_effect = Exception('Task execution failed') request = DbtRefreshRequest() with pytest.raises(Exception) as exc_info: trigger_dbt_refresh(request) assert 'Task execution failed' in str(exc_info.value) @patch('moneyhub.handlers.ecs_task.trigger_dbt_refresh_task') def test_trigger_dbt_refresh_client_error_passthrough(mock_trigger_task): """Test that AWS client errors are passed through.""" mock_trigger_task.side_effect = ClientError( error_response={ 'Error': { 'Code': 'ServiceException', 'Message': 'Cluster not found' } }, operation_name='RunTask' ) request = DbtRefreshRequest() with pytest.raises(ClientError) as exc_info: trigger_dbt_refresh(request) assert exc_info.value.response['Error']['Code'] == 'ServiceException'