"""Unit tests for Apple Music Streams Snowflake SQL executor.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from snowflake import connector from feed_ingestion.flows.itunes import snowflake_executor from tests.conftest import SubstringMatcher @pytest.fixture def mock_sql_loader(): """Return sql_loader mock.""" sql_loader_path = ( 'feed_ingestion.flows.itunes.snowflake_executor.sql_loader') with patch(sql_loader_path) as sql_loader: yield sql_loader @pytest.fixture def mock_executor(sf_config_mock, monkeypatch): """Yield executor context.""" connect_mock = MagicMock() monkeypatch.setattr(connector, 'connect', connect_mock) executor = snowflake_executor.ITunes(sf_config_mock) with patch.object(executor, 'execute', wraps=executor.execute) as \ executor.ex_mock: executor.fetchall = MagicMock() yield executor @patch.object(snowflake_executor, 'boto3') def test_load_temp_staging_raw_table( boto3_mock, mock_executor, aws_config_mock): """Test load_temp_staging_raw_table method.""" mock_executor.load_temp_staging_raw_table( temp_staging_raw_table='load_temp_staging_raw_table', aws=aws_config_mock, key_dir='s3://somepath', error_limit=1, query_name='load_temp_table') assert mock_executor.fetchall.call_count == 1 aws_creds_mock = (boto3_mock.Session.return_value. get_credentials.return_value) mock_executor.fetchall.assert_any_call( SubstringMatcher( containing=['COPY INTO', 'test_db.test_schema', 'AWS_TOKEN=']), params={ 'aws_key_id': aws_creds_mock.access_key, 'aws_secret_key': aws_creds_mock.secret_key, 'aws_token': aws_creds_mock.token, 's3_path': 's3://somepath'})