Skip to content
Next Next commit
fix: Use set() instead of [] for set-typed variables in SnowflakeRegi…
…stry._sync_feast_metadata_to_projects_table

Signed-off-by: Jia Le <5955220+jials@users.noreply.github.com>
  • Loading branch information
jials authored and ntkathole committed May 1, 2026
commit ca2c12c78297a7f760b834f0657fb248351f3fa7
4 changes: 2 additions & 2 deletions sdk/python/feast/infra/registry/snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ def __init__(
self.project = project

def _sync_feast_metadata_to_projects_table(self):
feast_metadata_projects: set = []
projects_set: set = []
feast_metadata_projects: set = set()
projects_set: set = set()

with GetSnowflakeConnection(self.registry_config) as conn:
query = (
Expand Down
85 changes: 85 additions & 0 deletions sdk/python/tests/unit/infra/registry/test_snowflake_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,88 @@ def simulated_snowflake(conn, query):
f"feast#6208: UPDATE WHERE clause references {project_a!r} — unintended cross-project write.\n"
f"Query: {update_query}"
)


class TestSyncFeastMetadataToProjectsTable:
def _make_registry(self):
"""Create a SnowflakeRegistry with mocked __init__."""
with patch.object(SnowflakeRegistry, "__init__", lambda self: None):
registry = SnowflakeRegistry()
registry.registry_config = MagicMock()
registry.registry_path = "test_db.test_schema"
registry.purge_feast_metadata = False
return registry

@patch(
"feast.infra.registry.snowflake.GetSnowflakeConnection",
)
@patch("feast.infra.registry.snowflake.execute_snowflake_statement")
def test_sync_with_feast_metadata_projects(self, mock_execute, mock_get_conn):
registry = self._make_registry()

metadata_df = pd.DataFrame({"PROJECT_ID": ["project_a", "project_b"]})
projects_df = pd.DataFrame({"PROJECT_ID": ["project_a"]})

mock_cursor = MagicMock()
mock_cursor.fetch_pandas_all.side_effect = [metadata_df, projects_df]
mock_execute.return_value = mock_cursor

mock_conn = MagicMock()
mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn)
mock_get_conn.return_value.__exit__ = MagicMock(return_value=False)

with patch.object(registry, "apply_project") as mock_apply:
registry._sync_feast_metadata_to_projects_table()

mock_apply.assert_called_once()
applied_project = mock_apply.call_args[0][0]
assert applied_project.name == "project_b"

@patch(
"feast.infra.registry.snowflake.GetSnowflakeConnection",
)
@patch("feast.infra.registry.snowflake.execute_snowflake_statement")
def test_sync_with_no_feast_metadata(self, mock_execute, mock_get_conn):
registry = self._make_registry()

empty_df = pd.DataFrame({"PROJECT_ID": []})
mock_cursor = MagicMock()
mock_cursor.fetch_pandas_all.return_value = empty_df
mock_execute.return_value = mock_cursor

mock_conn = MagicMock()
mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn)
mock_get_conn.return_value.__exit__ = MagicMock(return_value=False)

with patch.object(registry, "apply_project") as mock_apply:
registry._sync_feast_metadata_to_projects_table()

mock_apply.assert_not_called()

@patch(
"feast.infra.registry.snowflake.GetSnowflakeConnection",
)
@patch("feast.infra.registry.snowflake.execute_snowflake_statement")
def test_sync_deduplicates_project_ids(self, mock_execute, mock_get_conn):
"""Sets should deduplicate project IDs; lists would not."""
registry = self._make_registry()

metadata_df = pd.DataFrame(
{"PROJECT_ID": ["project_a", "project_a", "project_b"]}
)
projects_df = pd.DataFrame({"PROJECT_ID": []})

mock_cursor = MagicMock()
mock_cursor.fetch_pandas_all.side_effect = [metadata_df, projects_df]
mock_execute.return_value = mock_cursor

mock_conn = MagicMock()
mock_get_conn.return_value.__enter__ = MagicMock(return_value=mock_conn)
mock_get_conn.return_value.__exit__ = MagicMock(return_value=False)

with patch.object(registry, "apply_project") as mock_apply:
registry._sync_feast_metadata_to_projects_table()

assert mock_apply.call_count == 2
applied_names = {call[0][0].name for call in mock_apply.call_args_list}
assert applied_names == {"project_a", "project_b"}