@@ -503,3 +503,229 @@ def filter_by_side_effect(**kwargs):
503503 assert result is schema_b_row
504504 assert found_by_uuid is False
505505 assert result .schema == "schema_b"
506+
507+
508+ @patch ("superset.examples.generic_loader.db" )
509+ def test_find_dataset_no_uuid_no_schema (mock_db : MagicMock ) -> None :
510+ """Test _find_dataset with no UUID and no schema (basic lookup)."""
511+ from superset .examples .generic_loader import _find_dataset
512+
513+ basic_row = MagicMock ()
514+ basic_row .uuid = None
515+ basic_row .table_name = "test_table"
516+ basic_row .schema = None
517+
518+ # No UUID provided, so skip UUID lookup; table_name+database_id lookup returns row
519+ mock_db .session .query .return_value .filter_by .return_value .first .return_value = (
520+ basic_row
521+ )
522+
523+ result , found_by_uuid = _find_dataset ("test_table" , 1 , None , None )
524+
525+ assert result is basic_row
526+ assert found_by_uuid is False
527+
528+
529+ @patch ("superset.examples.generic_loader.db" )
530+ @patch ("superset.examples.generic_loader.get_example_database" )
531+ def test_load_parquet_table_no_backfill_when_uuid_already_set (
532+ mock_get_db : MagicMock ,
533+ mock_db : MagicMock ,
534+ ) -> None :
535+ """Test that existing UUID is preserved (not overwritten) during backfill."""
536+ from superset .examples .generic_loader import load_parquet_table
537+
538+ mock_database = MagicMock ()
539+ mock_inspector = _setup_database_mocks (mock_get_db , mock_database , has_table = True )
540+
541+ with patch ("superset.examples.generic_loader.inspect" ) as mock_inspect :
542+ mock_inspect .return_value = mock_inspector
543+
544+ # Existing table already has a UUID set
545+ mock_existing_table = MagicMock ()
546+ mock_existing_table .uuid = "existing-uuid-1234"
547+ mock_existing_table .schema = "public"
548+ mock_existing_table .table_name = "test_table"
549+
550+ mock_db .session .query .return_value .filter_by .return_value .first .return_value = (
551+ mock_existing_table
552+ )
553+
554+ result = load_parquet_table (
555+ parquet_file = "test_data" ,
556+ table_name = "test_table" ,
557+ database = mock_database ,
558+ only_metadata = True ,
559+ uuid = "new-uuid-5678" , # Try to set a different UUID
560+ )
561+
562+ # Existing UUID should be preserved, not overwritten
563+ assert result .uuid == "existing-uuid-1234"
564+
565+
566+ @patch ("superset.examples.generic_loader.db" )
567+ @patch ("superset.examples.generic_loader.get_example_database" )
568+ def test_load_parquet_table_no_backfill_when_schema_already_set (
569+ mock_get_db : MagicMock ,
570+ mock_db : MagicMock ,
571+ ) -> None :
572+ """Test that existing schema is preserved (not overwritten) during backfill."""
573+ from superset .examples .generic_loader import load_parquet_table
574+
575+ mock_database = MagicMock ()
576+ mock_inspector = _setup_database_mocks (mock_get_db , mock_database , has_table = True )
577+
578+ with patch ("superset.examples.generic_loader.inspect" ) as mock_inspect :
579+ mock_inspect .return_value = mock_inspector
580+
581+ # Existing table already has a schema set
582+ mock_existing_table = MagicMock ()
583+ mock_existing_table .uuid = "some-uuid"
584+ mock_existing_table .schema = "existing_schema"
585+ mock_existing_table .table_name = "test_table"
586+
587+ mock_db .session .query .return_value .filter_by .return_value .first .return_value = (
588+ mock_existing_table
589+ )
590+
591+ result = load_parquet_table (
592+ parquet_file = "test_data" ,
593+ table_name = "test_table" ,
594+ database = mock_database ,
595+ only_metadata = True ,
596+ schema = "new_schema" , # Try to set a different schema
597+ )
598+
599+ # Existing schema should be preserved, not overwritten
600+ assert result .schema == "existing_schema"
601+
602+
603+ @patch ("superset.examples.generic_loader.db" )
604+ @patch ("superset.examples.generic_loader.get_example_database" )
605+ def test_load_parquet_table_both_uuid_and_schema_backfill (
606+ mock_get_db : MagicMock ,
607+ mock_db : MagicMock ,
608+ ) -> None :
609+ """Test that both UUID and schema are backfilled in a single call."""
610+ from superset .examples .generic_loader import load_parquet_table
611+
612+ mock_database = MagicMock ()
613+ mock_inspector = _setup_database_mocks (mock_get_db , mock_database , has_table = True )
614+
615+ with patch ("superset.examples.generic_loader.inspect" ) as mock_inspect :
616+ mock_inspect .return_value = mock_inspector
617+
618+ # Existing table with neither UUID nor schema
619+ mock_existing_table = MagicMock ()
620+ mock_existing_table .uuid = None
621+ mock_existing_table .schema = None
622+ mock_existing_table .table_name = "test_table"
623+
624+ # UUID lookup returns None, table_name lookup returns the table
625+ def filter_by_side_effect (** kwargs ):
626+ mock_result = MagicMock ()
627+ if "uuid" in kwargs :
628+ mock_result .first .return_value = None
629+ else :
630+ mock_result .first .return_value = mock_existing_table
631+ return mock_result
632+
633+ mock_db .session .query .return_value .filter_by .side_effect = filter_by_side_effect
634+
635+ result = load_parquet_table (
636+ parquet_file = "test_data" ,
637+ table_name = "test_table" ,
638+ database = mock_database ,
639+ only_metadata = True ,
640+ uuid = "new-uuid" ,
641+ schema = "new_schema" ,
642+ )
643+
644+ # Both should be backfilled
645+ assert result .uuid == "new-uuid"
646+ assert result .schema == "new_schema"
647+
648+
649+ def test_create_generic_loader_passes_schema () -> None :
650+ """Test that create_generic_loader passes schema to load_parquet_table."""
651+ from superset .examples .generic_loader import create_generic_loader
652+
653+ test_schema = "custom_schema"
654+ loader = create_generic_loader (
655+ parquet_file = "test_data" ,
656+ table_name = "test_table" ,
657+ schema = test_schema ,
658+ )
659+
660+ assert loader is not None
661+ assert callable (loader )
662+ assert loader .__name__ == "load_test_data"
663+
664+
665+ @patch ("superset.examples.generic_loader.db" )
666+ def test_find_dataset_not_found (mock_db : MagicMock ) -> None :
667+ """Test that _find_dataset returns (None, False) when nothing matches."""
668+ from superset .examples .generic_loader import _find_dataset
669+
670+ # Both UUID and table_name lookups return None
671+ mock_db .session .query .return_value .filter_by .return_value .first .return_value = None
672+
673+ result , found_by_uuid = _find_dataset (
674+ "nonexistent_table" , 999 , "nonexistent-uuid" , "public"
675+ )
676+
677+ assert result is None
678+ assert found_by_uuid is False
679+
680+
681+ @patch ("superset.examples.generic_loader.db" )
682+ @patch ("superset.examples.generic_loader.load_parquet_table" )
683+ def test_create_generic_loader_description_set (
684+ mock_load_parquet : MagicMock ,
685+ mock_db : MagicMock ,
686+ ) -> None :
687+ """Test that create_generic_loader applies description to the dataset."""
688+ from superset .examples .generic_loader import create_generic_loader
689+
690+ mock_tbl = MagicMock ()
691+ mock_load_parquet .return_value = mock_tbl
692+
693+ loader = create_generic_loader (
694+ parquet_file = "test_data" ,
695+ table_name = "test_table" ,
696+ description = "Test dataset description" ,
697+ )
698+
699+ # Call the loader (type annotation in create_generic_loader is incorrect)
700+ loader (True , False , False ) # type: ignore[call-arg,arg-type]
701+
702+ # Verify description was set
703+ assert mock_tbl .description == "Test dataset description"
704+ mock_db .session .merge .assert_called_with (mock_tbl )
705+ mock_db .session .commit .assert_called ()
706+
707+
708+ @patch ("superset.examples.generic_loader.db" )
709+ @patch ("superset.examples.generic_loader.load_parquet_table" )
710+ def test_create_generic_loader_no_description (
711+ mock_load_parquet : MagicMock ,
712+ mock_db : MagicMock ,
713+ ) -> None :
714+ """Test that create_generic_loader skips description update when None."""
715+ from superset .examples .generic_loader import create_generic_loader
716+
717+ mock_tbl = MagicMock ()
718+ mock_load_parquet .return_value = mock_tbl
719+
720+ loader = create_generic_loader (
721+ parquet_file = "test_data" ,
722+ table_name = "test_table" ,
723+ description = None , # No description
724+ )
725+
726+ # Call the loader (type annotation in create_generic_loader is incorrect)
727+ loader (True , False , False ) # type: ignore[call-arg,arg-type]
728+
729+ # Verify description was NOT set (no extra commit for description)
730+ # The key is that tbl.description should not be assigned
731+ assert not hasattr (mock_tbl , "description" ) or mock_tbl .description != "anything"
0 commit comments