# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """Tests for generic_loader.py UUID threading functionality.""" from unittest.mock import MagicMock, patch @patch("superset.examples.generic_loader.get_example_database") @patch("superset.examples.generic_loader.db") def test_load_parquet_table_sets_uuid_on_new_table(mock_db, mock_get_db): """Test that load_parquet_table sets UUID on newly created SqlaTable.""" from superset.examples.generic_loader import load_parquet_table mock_database = MagicMock() mock_database.id = 1 mock_database.has_table.return_value = True mock_get_db.return_value = mock_database mock_engine = MagicMock() mock_inspector = MagicMock() mock_inspector.default_schema_name = "public" mock_database.get_sqla_engine.return_value.__enter__ = MagicMock( return_value=mock_engine ) mock_database.get_sqla_engine.return_value.__exit__ = MagicMock(return_value=False) # Simulate table not found in metadata mock_db.session.query.return_value.filter_by.return_value.first.return_value = None test_uuid = "12345678-1234-1234-1234-123456789012" with patch("superset.examples.generic_loader.inspect") as mock_inspect: mock_inspect.return_value = mock_inspector tbl = load_parquet_table( parquet_file="test_data", table_name="test_table", database=mock_database, only_metadata=True, uuid=test_uuid, ) assert tbl.uuid == test_uuid @patch("superset.examples.generic_loader.get_example_database") @patch("superset.examples.generic_loader.db") def test_load_parquet_table_early_return_does_not_modify_existing_uuid( mock_db, mock_get_db ): """Test early return path when table exists - UUID is not modified. When the physical table exists and force=False, the function returns early without going through the full load path. The existing table's UUID is preserved as-is (not modified even if different from the provided uuid). """ from superset.examples.generic_loader import load_parquet_table mock_database = MagicMock() mock_database.id = 1 mock_database.has_table.return_value = True # Triggers early return mock_get_db.return_value = mock_database mock_engine = MagicMock() mock_inspector = MagicMock() mock_inspector.default_schema_name = "public" mock_database.get_sqla_engine.return_value.__enter__ = MagicMock( return_value=mock_engine ) mock_database.get_sqla_engine.return_value.__exit__ = MagicMock(return_value=False) # Simulate existing table without UUID existing_table = MagicMock() existing_table.uuid = None mock_db.session.query.return_value.filter_by.return_value.first.return_value = ( existing_table ) test_uuid = "12345678-1234-1234-1234-123456789012" with patch("superset.examples.generic_loader.inspect") as mock_inspect: mock_inspect.return_value = mock_inspector tbl = load_parquet_table( parquet_file="test_data", table_name="test_table", database=mock_database, only_metadata=True, uuid=test_uuid, ) # Early return path returns existing table as-is assert tbl is existing_table # UUID was not modified (still None) assert tbl.uuid is None @patch("superset.examples.generic_loader.get_example_database") @patch("superset.examples.generic_loader.db") def test_load_parquet_table_preserves_existing_uuid(mock_db, mock_get_db): """Test that load_parquet_table does not overwrite existing UUID.""" from superset.examples.generic_loader import load_parquet_table mock_database = MagicMock() mock_database.id = 1 mock_database.has_table.return_value = True mock_get_db.return_value = mock_database mock_engine = MagicMock() mock_inspector = MagicMock() mock_inspector.default_schema_name = "public" mock_database.get_sqla_engine.return_value.__enter__ = MagicMock( return_value=mock_engine ) mock_database.get_sqla_engine.return_value.__exit__ = MagicMock(return_value=False) # Simulate existing table with different UUID existing_uuid = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" existing_table = MagicMock() existing_table.uuid = existing_uuid mock_db.session.query.return_value.filter_by.return_value.first.return_value = ( existing_table ) new_uuid = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb" with patch("superset.examples.generic_loader.inspect") as mock_inspect: mock_inspect.return_value = mock_inspector tbl = load_parquet_table( parquet_file="test_data", table_name="test_table", database=mock_database, only_metadata=True, uuid=new_uuid, ) # Should preserve original UUID assert tbl.uuid == existing_uuid @patch("superset.examples.generic_loader.get_example_database") @patch("superset.examples.generic_loader.db") def test_load_parquet_table_works_without_uuid(mock_db, mock_get_db): """Test that load_parquet_table works correctly when no UUID is provided.""" from superset.examples.generic_loader import load_parquet_table mock_database = MagicMock() mock_database.id = 1 mock_database.has_table.return_value = True mock_get_db.return_value = mock_database mock_engine = MagicMock() mock_inspector = MagicMock() mock_inspector.default_schema_name = "public" mock_database.get_sqla_engine.return_value.__enter__ = MagicMock( return_value=mock_engine ) mock_database.get_sqla_engine.return_value.__exit__ = MagicMock(return_value=False) # Simulate table not found mock_db.session.query.return_value.filter_by.return_value.first.return_value = None with patch("superset.examples.generic_loader.inspect") as mock_inspect: mock_inspect.return_value = mock_inspector tbl = load_parquet_table( parquet_file="test_data", table_name="test_table", database=mock_database, only_metadata=True, # No uuid parameter ) # UUID should remain None assert tbl.uuid is None def test_create_generic_loader_passes_uuid(): """Test that create_generic_loader passes UUID to load_parquet_table.""" from superset.examples.generic_loader import create_generic_loader test_uuid = "12345678-1234-1234-1234-123456789012" loader = create_generic_loader( parquet_file="test_data", table_name="test_table", uuid=test_uuid, ) # Verify loader was created with UUID in closure with patch("superset.examples.generic_loader.load_parquet_table") as mock_load: mock_load.return_value = MagicMock() loader(only_metadata=True) # Verify UUID was passed through mock_load.assert_called_once() call_kwargs = mock_load.call_args[1] assert call_kwargs["uuid"] == test_uuid def test_create_generic_loader_without_uuid(): """Test that create_generic_loader works without UUID (backward compat).""" from superset.examples.generic_loader import create_generic_loader loader = create_generic_loader( parquet_file="test_data", table_name="test_table", # No uuid ) with patch("superset.examples.generic_loader.load_parquet_table") as mock_load: mock_load.return_value = MagicMock() loader(only_metadata=True) mock_load.assert_called_once() call_kwargs = mock_load.call_args[1] assert call_kwargs["uuid"] is None