diff --git a/superset/mcp_service/chart/tool/update_chart.py b/superset/mcp_service/chart/tool/update_chart.py index 88fc5e28849..caefae1b9d0 100755 --- a/superset/mcp_service/chart/tool/update_chart.py +++ b/superset/mcp_service/chart/tool/update_chart.py @@ -196,7 +196,8 @@ def _validate_update_against_dataset( } ) - # Column existence + fuzzy-match validation (mirrors generate_chart pipeline layer 2) + # Column existence + fuzzy-match validation + # (mirrors generate_chart pipeline layer 2) from superset.mcp_service.chart.validation.dataset_validator import DatasetValidator is_col_valid, col_error = DatasetValidator.validate_against_dataset( @@ -414,11 +415,13 @@ async def update_chart( # noqa: C901 # Normalize column case to match dataset canonical names # (mirrors generate_chart pipeline layer 4) - if parsed_config is not None and getattr(chart, "datasource_id", None) is not None: + chart_datasource_id = getattr(chart, "datasource_id", None) + if parsed_config is not None and chart_datasource_id is not None: from superset.mcp_service.chart.validation.dataset_validator import ( DatasetValidator, NORMALIZATION_EXCEPTIONS, ) + try: parsed_config = DatasetValidator.normalize_column_names( parsed_config, chart.datasource_id diff --git a/tests/unit_tests/mcp_service/chart/tool/test_update_chart.py b/tests/unit_tests/mcp_service/chart/tool/test_update_chart.py old mode 100644 new mode 100755 index c504d8bca59..21e2286fb6f --- a/tests/unit_tests/mcp_service/chart/tool/test_update_chart.py +++ b/tests/unit_tests/mcp_service/chart/tool/test_update_chart.py @@ -1175,6 +1175,11 @@ class TestUpdateChartValidationGate: ) @patch("superset.daos.chart.ChartDAO.find_by_id", new_callable=Mock) @patch("superset.db.session") + @patch( + "superset.mcp_service.chart.validation.dataset_validator" + ".DatasetValidator.validate_against_dataset", + new=Mock(return_value=(True, None)), + ) @pytest.mark.asyncio async def test_preview_path_validation_failure_skips_cache( self, @@ -1238,6 +1243,11 @@ class TestUpdateChartValidationGate: ) @patch("superset.daos.chart.ChartDAO.find_by_id", new_callable=Mock) @patch("superset.db.session") + @patch( + "superset.mcp_service.chart.validation.dataset_validator" + ".DatasetValidator.validate_against_dataset", + new=Mock(return_value=(True, None)), + ) @pytest.mark.asyncio async def test_persist_path_validation_failure_skips_db_write( self,