@@ -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
185245async def test_list_dashboards_with_filters (mock_list , mcp_server ):
0 commit comments