"""Unit tests for Fivetran sync Lambda function.""" from unittest.mock import MagicMock, patch import pytest from pyfivetran.shed import ApiError from src.app import handler @pytest.fixture def mock_secrets(): """Mock AWS Secrets Manager credentials retrieval.""" with patch("src.app.get_fivetran_credentials") as mock_creds: mock_creds.return_value = { "secret_id": "test_key", "secret_key": "test_secret", } yield mock_creds @pytest.fixture def mock_fivetran_client(): """Mock FivetranClient and connector sync method.""" with patch("src.app.FivetranClient") as mock_client_class: mock_client = MagicMock() mock_client_class.return_value = mock_client mock_conn = MagicMock() mock_conn.sync.return_value = {"code": "Success"} mock_conn.resync.return_value = {"code": "Success"} mock_client.connector_endpoint.get_connector.return_value = mock_conn yield mock_client def test_lambda_handler_success(mock_secrets, mock_fivetran_client): """Test successful sync triggering for valid connector ID.""" event = {"connector_id": "aimed_aloha"} response = handler(event, None) assert "message" in response assert "Sync triggered for connector" in response["message"] assert "fivetran_response" in response assert response["fivetran_response"]["code"] == "Success" def test_lambda_handler_historical_sync_success( mock_secrets, mock_fivetran_client ): """Test successful historical sync triggering for valid connector ID.""" event = {"connector_id": "aimed_aloha", "historical_sync": "true"} response = handler(event, None) assert "message" in response assert "Historical re-sync triggered" in response["message"] assert "fivetran_response" in response assert response["fivetran_response"]["code"] == "Success" def test_lambda_handler_invalid_id(mock_secrets, mock_fivetran_client): """Test handler raises ApiError when connector ID is invalid.""" mock_fivetran_client.connector_endpoint.get_connector.side_effect = ApiError( '{"code":"NotFound_Connector","message":"Connector not found."}' ) event = {"connector_id": "invalid_connector"} with pytest.raises(ApiError, match="NotFound_Connector"): handler(event, None)