This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch tdd/issue-28562-drill-to-detail-filters
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 262c63e5c2f4ab5a806c993a6f04ac2af626ce12
Author: Claude Code <[email protected]>
AuthorDate: Sat Jul 11 11:12:11 2026 -0700

    test(charts): assert drill-to-detail carries applied filters (#28562)
    
    Regression coverage for #28562, where 'Drill to Detail by' from a chart on a
    dashboard reportedly ignores the dashboard's applied filters. This exercises
    the backend drill-detail action (_get_drill_detail) directly and asserts 
that
    the chart's applied filters survive onto the query object that is executed 
for
    the samples query.
    
    Closes #28562
    
    Co-Authored-By: Claude Opus 4.8 <[email protected]>
---
 .../common/test_query_actions_currency.py          | 61 +++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)

diff --git a/tests/unit_tests/common/test_query_actions_currency.py 
b/tests/unit_tests/common/test_query_actions_currency.py
index 50ec9619c81..6ad14e88d03 100644
--- a/tests/unit_tests/common/test_query_actions_currency.py
+++ b/tests/unit_tests/common/test_query_actions_currency.py
@@ -19,7 +19,9 @@ from unittest.mock import MagicMock, patch
 import pandas as pd
 import pytest
 
-from superset.common.query_actions import _detect_currency
+from superset.common.chart_data import ChartDataResultType
+from superset.common.query_actions import _detect_currency, _get_drill_detail
+from superset.common.query_object import QueryObject
 
 
 @pytest.fixture
@@ -288,3 +290,60 @@ def 
test_detect_currency_column_config_no_currency_column_returns_none(
     )
 
     assert result is None
+
+
+# Tests for drill-to-detail filter propagation (issue #28562)
+
+
+@patch("superset.common.query_actions._get_full")
+def test_get_drill_detail_preserves_applied_filters(
+    mock_get_full: MagicMock,
+) -> None:
+    """
+    Regression for #28562: 'Drill to Detail by' must carry a chart's applied
+    filters (e.g. the dashboard's native filters) into the drill-to-detail
+    samples query. The drill-detail action rewrites columns/metrics/orderby but
+    must leave ``QueryObject.filter`` untouched so the underlying rows stay
+    scoped to the dashboard's filter selections.
+
+    This exercises the backend drill-detail transformation directly and asserts
+    the incoming filters survive onto the query object that is ultimately
+    executed. A green run means the backend honors the filters (the reported
+    behavior is not reproduced in this code path); a red run means they are
+    dropped.
+    """
+    applied_filter = {"col": "region", "op": "==", "val": "USA"}
+
+    query_obj = QueryObject(
+        columns=["region", "sales"],
+        metrics=["count"],
+        filters=[applied_filter],
+    )
+
+    col_region = MagicMock()
+    col_region.column_name = "region"
+    col_sales = MagicMock()
+    col_sales.column_name = "sales"
+
+    datasource = MagicMock()
+    datasource.columns = [col_region, col_sales]
+
+    query_context = MagicMock()
+    query_context.datasource = datasource
+    query_context.result_type = ChartDataResultType.DRILL_DETAIL
+
+    captured: dict[str, QueryObject] = {}
+
+    def _capture(_ctx: MagicMock, obj: QueryObject, _force: bool) -> dict:
+        captured["query_obj"] = obj
+        return {}
+
+    mock_get_full.side_effect = _capture
+
+    _get_drill_detail(query_context, query_obj)
+
+    executed = captured["query_obj"]
+    assert applied_filter in executed.filter, (
+        "Drill-to-detail dropped the chart's applied filters; the samples 
query "
+        "would return unfiltered rows (issue #28562)."
+    )

Reply via email to