"""Unit tests for subscription_info Snowflake integration.""" from types import SimpleNamespace import pytest from src.logic import subscription_info class MockSnowflakeConfig: """Mock SnowflakeConfig that mimics Pydantic model's dict() method.""" def __init__(self, config_dict: dict): """Initialize with a dictionary of config values.""" self._config_dict = config_dict def dict(self) -> dict: """Return the stored configuration dictionary.""" return self._config_dict @pytest.fixture def mock_snowflake_config(mocker): """Patch config.settings.snowflake_config to return deterministic connection details.""" connection_details = { 'account': 'orchard', 'user': 'svc_user', 'db': 'CRM', 'schema': 'PUBLIC', 'warehouse': 'DEV_WH', 'role': 'ETL', } mocker.patch.object( subscription_info.config, 'settings', SimpleNamespace(snowflake_config=MockSnowflakeConfig(connection_details)) ) return connection_details def test_get_subscriptions_executes_expected_query(mocker, mock_snowflake_config): """Ensure the Snowflake executor is invoked with the correct SQL and params.""" captured = {} expected_rows = [{'FAN_SUBSCRIPTION_ID': '123'}] class DummyExecutor: def __init__(self, connection_dict): captured['connection_dict'] = connection_dict def __enter__(self): captured['enter_called'] = True return self def __exit__(self, exc_type, exc_val, exc_tb): captured['exit_called'] = True def fetchall(self, query, params, dict_cursor): captured['query'] = query captured['params'] = params captured['dict_cursor'] = dict_cursor return expected_rows mocker.patch.object(subscription_info, 'SnowflakeSQLExecutor', DummyExecutor) subscription_ids = ['sub-1', 'sub-2'] result = subscription_info.get_subscriptions(subscription_ids) assert result == expected_rows assert captured['connection_dict'] == mock_snowflake_config assert captured['query'] == subscription_info.subscription_info_query assert captured['params'] == {'subscription_ids': subscription_ids} assert captured['dict_cursor'] is True assert captured['enter_called'] is True assert captured['exit_called'] is True