Skip to content

Commit 84bbc70

Browse files
test(mcp): cover dashboard role permission edge cases
1 parent aee35e9 commit 84bbc70

1 file changed

Lines changed: 60 additions & 0 deletions

File tree

tests/unit_tests/mcp_service/dashboard/tool/test_dashboard_tools.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,66 @@ def name(self) -> str:
180180
assert role_info.permissions == ["can_read on Dashboard", "can_write"]
181181

182182

183+
def test_dashboard_role_serializer_handles_detached_permissions() -> None:
184+
class DetachedRole:
185+
id = 1
186+
name = "Gamma"
187+
188+
@property
189+
def permissions(self) -> list[object]:
190+
raise DetachedInstanceError("detached permissions")
191+
192+
role_info = serialize_role_object(DetachedRole())
193+
194+
assert role_info is not None
195+
assert role_info.permissions is None
196+
197+
198+
def test_dashboard_role_serializer_handles_non_iterable_permissions() -> None:
199+
role = SimpleNamespace(id=1, name="Gamma", permissions=object())
200+
201+
role_info = serialize_role_object(role)
202+
203+
assert role_info is not None
204+
assert role_info.permissions == []
205+
206+
207+
def test_dashboard_role_serializer_stops_on_detached_permission_iterator() -> None:
208+
class DetachedPermissionIterator:
209+
def __iter__(self) -> "DetachedPermissionIterator":
210+
return self
211+
212+
def __next__(self) -> object:
213+
raise DetachedInstanceError("detached permission iterator")
214+
215+
role = SimpleNamespace(
216+
id=1,
217+
name="Gamma",
218+
permissions=DetachedPermissionIterator(),
219+
)
220+
221+
role_info = serialize_role_object(role)
222+
223+
assert role_info is not None
224+
assert role_info.permissions == []
225+
226+
227+
def test_dashboard_role_serializer_skips_unnamed_permission_items() -> None:
228+
role = SimpleNamespace(
229+
id=1,
230+
name="Gamma",
231+
permissions=[
232+
SimpleNamespace(permission=SimpleNamespace(name="can_read")),
233+
SimpleNamespace(view_menu=SimpleNamespace(name="Dashboard")),
234+
],
235+
)
236+
237+
role_info = serialize_role_object(role)
238+
239+
assert role_info is not None
240+
assert role_info.permissions == []
241+
242+
183243
@patch("superset.daos.dashboard.DashboardDAO.list")
184244
@pytest.mark.asyncio
185245
async def test_list_dashboards_with_filters(mock_list, mcp_server):

0 commit comments

Comments
 (0)