"""Unit tests for step_function logic.""" import json from unittest.mock import Mock from unittest.mock import patch from botocore.exceptions import ClientError import pytest from src.logic import step_function @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_success(mock_get_client, mock_time): """Test successful step function execution.""" mock_time.return_value = 1739232000.0 # Fixed timestamp mock_sfn_client = Mock() mock_response = { 'executionArn': 'arn:aws:states:us-east-1:123456789012:execution:test', 'startDate': '2026-02-09T12:00:00.000Z' } mock_sfn_client.start_execution.return_value = mock_response mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': '12345', 'review_queue_id': '67890', 'some': 'data' } } result = step_function.invoke_auto_approval_sfn(execution_input) assert result == 'arn:aws:states:us-east-1:123456789012:execution:test' mock_sfn_client.start_execution.assert_called_once() call_kwargs = mock_sfn_client.start_execution.call_args.kwargs assert call_kwargs['stateMachineArn'] == step_function.config.AUTO_APPROVE_STEP_FUNC_ARN assert call_kwargs['input'] == json.dumps(execution_input) assert call_kwargs['name'] == 'auto-approve-1739232000-review-queue-67890' @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_name_formatting(mock_get_client, mock_time): """Test execution name is formatted correctly.""" mock_time.return_value = 1739232100.5 # Fixed timestamp mock_sfn_client = Mock() mock_sfn_client.start_execution.return_value = {'executionArn': 'test'} mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': 'ABC123', 'review_queue_id': 'XYZ789' } } step_function.invoke_auto_approval_sfn(execution_input) call_kwargs = mock_sfn_client.start_execution.call_args.kwargs assert call_kwargs['name'] == 'auto-approve-1739232100-review-queue-XYZ789' @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_input_serialization(mock_get_client, mock_time): """Test execution input is properly serialized to JSON.""" mock_time.return_value = 1739232200.0 mock_sfn_client = Mock() mock_sfn_client.start_execution.return_value = {'executionArn': 'test'} mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': '12345', 'review_queue_id': '67890', 'nested': {'object': 'value'}, 'list': [1, 2, 3], 'boolean': True } } step_function.invoke_auto_approval_sfn(execution_input) call_kwargs = mock_sfn_client.start_execution.call_args.kwargs parsed_input = json.loads(call_kwargs['input']) assert parsed_input == execution_input @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_exception(mock_get_client, mock_time): """Test exception is raised when step function execution fails.""" mock_time.return_value = 1739232300.0 mock_sfn_client = Mock() mock_sfn_client.start_execution.side_effect = Exception('AWS error') mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': '12345', 'review_queue_id': '67890' } } with pytest.raises(Exception) as exc_info: step_function.invoke_auto_approval_sfn(execution_input) assert 'Failed to start step function: AWS error' in str(exc_info.value) @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_client_error(mock_get_client, mock_time): """Test handling of boto3 ClientError.""" mock_time.return_value = 1739232400.0 mock_sfn_client = Mock() error_response = {'Error': {'Code': 'ValidationException', 'Message': 'Invalid input'}} mock_sfn_client.start_execution.side_effect = ClientError(error_response, 'StartExecution') mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': '12345', 'review_queue_id': '67890' } } with pytest.raises(Exception) as exc_info: step_function.invoke_auto_approval_sfn(execution_input) assert 'Failed to start step function:' in str(exc_info.value) @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_missing_product_id(mock_get_client, mock_time): """Test behavior when product_id is missing.""" mock_time.return_value = 1739232500.0 mock_sfn_client = Mock() mock_sfn_client.start_execution.return_value = {'executionArn': 'test'} mock_get_client.return_value = mock_sfn_client execution_input = { 'data': {'review_queue_id': '67890'} } step_function.invoke_auto_approval_sfn(execution_input) call_kwargs = mock_sfn_client.start_execution.call_args.kwargs assert call_kwargs['name'] == 'auto-approve-1739232500-review-queue-67890' @patch('src.logic.step_function.time.time') @patch('src.logic.step_function.get_sfn_client') def test_invoke_auto_approval_sfn_missing_review_queue_id(mock_get_client, mock_time): """Test behavior when review_queue_id is missing.""" mock_time.return_value = 1739232600.0 mock_sfn_client = Mock() mock_sfn_client.start_execution.return_value = {'executionArn': 'test'} mock_get_client.return_value = mock_sfn_client execution_input = { 'data': { 'product_id': '12345' } } step_function.invoke_auto_approval_sfn(execution_input) call_kwargs = mock_sfn_client.start_execution.call_args.kwargs assert call_kwargs['name'] == 'auto-approve-1739232600-review-queue-None' @patch('src.logic.step_function.boto3.client') def test_get_sfn_client_returns_stepfunctions_client(mock_boto_client): """Test that get_sfn_client returns a Step Functions client.""" step_function.get_sfn_client.cache_clear() mock_client = Mock() mock_boto_client.return_value = mock_client result = step_function.get_sfn_client() assert result == mock_client mock_boto_client.assert_called_once_with('stepfunctions', step_function.config.AWS_REGION)