fix(mcp): improve default chart names with descriptive format (#38406)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Amin Ghadersohi
2026-03-10 10:53:05 +01:00
committed by GitHub
parent 13fe88000a
commit 0cfd760a36
4 changed files with 280 additions and 31 deletions

View File

@@ -568,8 +568,8 @@ class TestMapConfigToFormData:
class TestGenerateChartName:
"""Test generate_chart_name function"""
def test_generate_table_chart_name(self) -> None:
"""Test generating name for table chart"""
def test_table_no_aggregates(self) -> None:
"""Table without aggregates uses column names."""
config = TableChartConfig(
chart_type="table",
columns=[
@@ -579,25 +579,138 @@ class TestGenerateChartName:
)
result = generate_chart_name(config)
assert result == "Table Chart - product, revenue"
assert result == "Product, Revenue Table"
def test_generate_xy_chart_name(self) -> None:
"""Test generating name for XY chart"""
def test_table_no_aggregates_with_dataset_name(self) -> None:
"""Table without aggregates includes dataset name when available."""
config = TableChartConfig(
chart_type="table",
columns=[ColumnRef(name="product")],
)
result = generate_chart_name(config, dataset_name="Orders")
assert result == "Orders Records"
def test_table_with_aggregates(self) -> None:
"""Table with aggregates produces a summary name."""
config = TableChartConfig(
chart_type="table",
columns=[
ColumnRef(name="product"),
ColumnRef(name="revenue", aggregate="SUM"),
],
)
result = generate_chart_name(config)
assert result == "Sum(Revenue) Summary"
def test_line_chart_over_time(self) -> None:
"""Line chart without group_by uses 'Over Time' format."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="date"),
y=[ColumnRef(name="revenue"), ColumnRef(name="orders")],
x=ColumnRef(name="order_date"),
y=[ColumnRef(name="revenue", aggregate="SUM")],
kind="line",
)
result = generate_chart_name(config)
assert result == "Line Chart - date vs revenue, orders"
assert result == "Sum(Revenue) Over Time"
def test_generate_chart_name_unsupported(self) -> None:
"""Test generating name for unsupported config type"""
def test_bar_chart_by_dimension(self) -> None:
"""Bar chart uses 'by [X]' format."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="product_category"),
y=[ColumnRef(name="order_count", aggregate="COUNT")],
kind="bar",
)
result = generate_chart_name(config)
assert result == "Count(Order Count) by Product Category"
def test_line_chart_with_group_by(self) -> None:
"""Line chart with group_by uses 'by [group]' format."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="date"),
y=[ColumnRef(name="revenue", aggregate="SUM")],
kind="line",
group_by=ColumnRef(name="sales_rep"),
)
result = generate_chart_name(config)
assert result == "Sum(Revenue) by Sales Rep"
def test_scatter_plot(self) -> None:
"""Scatter plot uses 'Y vs X' format."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="age"),
y=[ColumnRef(name="income")],
kind="scatter",
)
result = generate_chart_name(config)
assert result == "Income vs Age"
def test_time_grain_in_context(self) -> None:
"""Time grain is appended as context."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="date"),
y=[ColumnRef(name="revenue", aggregate="SUM")],
kind="line",
time_grain="P1M",
)
result = generate_chart_name(config)
assert result == "Sum(Revenue) Over Time \u2013 Monthly"
def test_filter_context(self) -> None:
"""Filters are appended as context."""
config = TableChartConfig(
chart_type="table",
columns=[ColumnRef(name="product")],
filters=[FilterConfig(column="region", op="=", value="West")],
)
result = generate_chart_name(config, dataset_name="Orders")
assert result == "Orders Records \u2013 Region West"
def test_name_truncation(self) -> None:
"""Names exceeding 60 chars are truncated."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="date"),
y=[
ColumnRef(
name="very_long_metric_name_that_goes_on_and_on", aggregate="SUM"
)
],
kind="line",
group_by=ColumnRef(name="another_very_long_dimension_name_here"),
)
result = generate_chart_name(config)
assert len(result) <= 60
def test_unsupported_config_type(self) -> None:
"""Unsupported config type returns generic name."""
result = generate_chart_name("invalid_config") # type: ignore
assert result == "Chart"
def test_custom_labels_used(self) -> None:
"""Column labels are preferred over names."""
config = XYChartConfig(
chart_type="xy",
x=ColumnRef(name="ds", label="Date"),
y=[ColumnRef(name="cnt", aggregate="COUNT", label="Order Count")],
kind="bar",
)
result = generate_chart_name(config)
assert result == "Order Count by Date"
class TestGenerateExploreLink:
"""Test generate_explore_link function"""