mirror of
https://github.com/apache/superset.git
synced 2026-07-28 01:22:36 +00:00
fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)
(cherry picked from commit 7774ec7e3c)
This commit is contained in:
@@ -62,10 +62,14 @@ class DatabaseFilter(ColumnOperator):
|
||||
"database_name",
|
||||
"expose_in_sqllab",
|
||||
"allow_file_upload",
|
||||
"created_by_fk",
|
||||
"changed_by_fk",
|
||||
] = Field(
|
||||
...,
|
||||
description="Column to filter on. Use get_schema(model_type='database') for "
|
||||
"available filter columns.",
|
||||
"available filter columns. Use created_by_fk with the user "
|
||||
"ID from get_instance_info's current_user to find "
|
||||
"databases created by a specific user.",
|
||||
)
|
||||
opr: ColumnOperatorEnum = Field(
|
||||
...,
|
||||
|
||||
@@ -26,7 +26,7 @@ from fastmcp.exceptions import ToolError
|
||||
from pydantic import ValidationError
|
||||
|
||||
from superset.mcp_service.app import mcp
|
||||
from superset.mcp_service.database.schemas import ListDatabasesRequest
|
||||
from superset.mcp_service.database.schemas import DatabaseFilter, ListDatabasesRequest
|
||||
from superset.utils import json
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
@@ -39,6 +39,25 @@ get_database_info_module = importlib.import_module(
|
||||
)
|
||||
|
||||
|
||||
class TestDatabaseFilterSchema:
|
||||
"""Tests for DatabaseFilter schema — filterable columns."""
|
||||
|
||||
def test_created_by_fk_is_valid_filter_column(self):
|
||||
"""created_by_fk must be accepted as a filter column."""
|
||||
f = DatabaseFilter(col="created_by_fk", opr="eq", value=1)
|
||||
assert f.col == "created_by_fk"
|
||||
|
||||
def test_changed_by_fk_is_valid_filter_column(self):
|
||||
"""changed_by_fk must be accepted as a filter column."""
|
||||
f = DatabaseFilter(col="changed_by_fk", opr="eq", value=1)
|
||||
assert f.col == "changed_by_fk"
|
||||
|
||||
def test_invalid_filter_column_rejected(self):
|
||||
"""Columns not in the Literal set must be rejected."""
|
||||
with pytest.raises(ValidationError):
|
||||
DatabaseFilter(col="not_a_real_column", opr="eq", value=1)
|
||||
|
||||
|
||||
def create_mock_database(
|
||||
database_id: int = 1,
|
||||
database_name: str = "examples",
|
||||
@@ -232,18 +251,15 @@ async def test_list_databases_does_not_expose_user_directory_fields(
|
||||
|
||||
|
||||
def test_database_filter_rejects_user_directory_fields() -> None:
|
||||
"""Test user directory fields cannot be used for database filters."""
|
||||
with pytest.raises(ValueError, match="created_by_fk"):
|
||||
ListDatabasesRequest(
|
||||
filters=[{"col": "created_by_fk", "opr": "eq", "value": 1}],
|
||||
)
|
||||
"""Test user directory string fields cannot be used for database filters.
|
||||
|
||||
|
||||
def test_database_filter_rejects_created_by_fk() -> None:
|
||||
"""created_by_fk is no longer a valid filter column; use created_by_me instead."""
|
||||
with pytest.raises(ValidationError, match="created_by_fk"):
|
||||
created_by_fk / changed_by_fk are integer FK IDs and ARE valid filter
|
||||
columns. The user-directory *string* fields (created_by, created_by_name,
|
||||
etc.) must still be rejected.
|
||||
"""
|
||||
with pytest.raises(ValidationError, match="created_by_name"):
|
||||
ListDatabasesRequest(
|
||||
filters=[{"col": "created_by_fk", "opr": "eq", "value": 0}],
|
||||
filters=[{"col": "created_by_name", "opr": "eq", "value": "admin"}],
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user