fix: add parent_slice_id for multilayer charts to embed (#38243)

This commit is contained in:
Mehmet Salih Yavuz
2026-03-12 21:21:43 +03:00
committed by GitHub
parent 7f476a79b3
commit 95f61bd223
5 changed files with 329 additions and 29 deletions

View File

@@ -1433,3 +1433,117 @@ def test_prefetch_rls_filters_works_for_guest_user(
# Cache should be populated with (username, table_id) keys and empty lists
assert mock_g._rls_filter_cache[("guest_user", 10)] == []
assert mock_g._rls_filter_cache[("guest_user", 20)] == []
def test_validate_child_in_parent_multilayer_valid(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation succeeds for valid multi-layer child"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = json.dumps(
{"viz_type": "deck_multi", "deck_slices": [1, 2, 3]}
)
# Child 2 is in parent's deck_slices
assert sm._validate_child_in_parent_multilayer(
child_slice_id=2, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_invalid_child(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails for child not in parent config"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = json.dumps(
{"viz_type": "deck_multi", "deck_slices": [1, 2, 3]}
)
# Child 5 is NOT in parent's deck_slices
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=5, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_wrong_viz_type(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails for non-multilayer charts"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = json.dumps(
{
"viz_type": "line", # Not deck_multi
"deck_slices": [1, 2, 3],
}
)
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=2, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_empty_deck_slices(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails when deck_slices is empty"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = json.dumps({"viz_type": "deck_multi", "deck_slices": []})
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=1, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_no_deck_slices(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails when deck_slices is missing"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = json.dumps(
{
"viz_type": "deck_multi"
# No deck_slices key
}
)
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=1, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_malformed_json(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails gracefully with malformed JSON"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = "not valid json {{"
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=1, parent_slice=parent_slice
)
def test_validate_child_in_parent_multilayer_null_params(
app_context: None, mocker: MockerFixture
) -> None:
"""Test validation fails gracefully with null params"""
sm = SupersetSecurityManager(appbuilder)
parent_slice = mocker.MagicMock(spec=Slice)
parent_slice.params = None
assert not sm._validate_child_in_parent_multilayer(
child_slice_id=1, parent_slice=parent_slice
)