2525from superset .models .dashboard import Dashboard
2626from superset .utils import json
2727from tests .integration_tests .base_tests import SupersetTestCase
28+ from tests .integration_tests .conftest import with_feature_flags
2829from tests .integration_tests .constants import (
2930 ADMIN_USERNAME ,
3031 ALPHA_USERNAME ,
@@ -60,6 +61,7 @@ def _create_dashboard(self, title: str = "soft_delete_test") -> Dashboard:
6061 db .session .commit ()
6162 return dashboard
6263
64+ @with_feature_flags (SOFT_DELETE = True )
6365 def test_delete_dashboard_soft_deletes (self ) -> None :
6466 """DELETE should set deleted_at instead of removing the row."""
6567 dashboard = self ._create_dashboard ("sd_test_1" )
@@ -81,6 +83,7 @@ def test_delete_dashboard_soft_deletes(self) -> None:
8183 # Cleanup
8284 _hard_delete_dashboard (dashboard_id )
8385
86+ @with_feature_flags (SOFT_DELETE = True )
8487 def test_soft_deleted_dashboard_excluded_from_list (self ) -> None :
8588 """GET /api/v1/dashboard/ should not include soft-deleted."""
8689 dashboard = self ._create_dashboard ("sd_list_test" )
@@ -97,6 +100,7 @@ def test_soft_deleted_dashboard_excluded_from_list(self) -> None:
97100 # Cleanup
98101 _hard_delete_dashboard (dashboard_id )
99102
103+ @with_feature_flags (SOFT_DELETE = True )
100104 def test_soft_deleted_dashboard_included_in_list_when_requested (self ) -> None :
101105 """GET /api/v1/dashboard/ with dashboard_deleted_state=include returns deleted dashboards.""" # noqa: E501
102106 dashboard = self ._create_dashboard ("sd_list_with_deleted" )
@@ -120,6 +124,7 @@ def test_soft_deleted_dashboard_included_in_list_when_requested(self) -> None:
120124 # Cleanup
121125 _hard_delete_dashboard (dashboard_id )
122126
127+ @with_feature_flags (SOFT_DELETE = True )
123128 def test_only_filter_returns_only_soft_deleted_dashboards (self ) -> None :
124129 """dashboard_deleted_state=only excludes live rows and returns only deleted ones.""" # noqa: E501
125130 live_dashboard = self ._create_dashboard ("only_live_dash" )
@@ -143,6 +148,7 @@ def test_only_filter_returns_only_soft_deleted_dashboards(self) -> None:
143148 _hard_delete_dashboard (live_id )
144149 _hard_delete_dashboard (deleted_id )
145150
151+ @with_feature_flags (SOFT_DELETE = True )
146152 def test_deleted_state_list_shows_owner_their_own_deleted (self ) -> None :
147153 """A non-admin owner can still enumerate their own soft-deleted
148154 dashboards. Deleted-state scoping mirrors the restore audience, so it
@@ -173,6 +179,7 @@ def test_deleted_state_list_shows_owner_their_own_deleted(self) -> None:
173179 # Cleanup
174180 _hard_delete_dashboard (dashboard_id )
175181
182+ @with_feature_flags (SOFT_DELETE = True )
176183 def test_deleted_state_list_hides_non_owned_from_read_access_user (self ) -> None :
177184 """A read-access non-owner must not be able to enumerate a dashboard
178185 once it is soft-deleted.
@@ -259,6 +266,7 @@ def test_deleted_state_list_hides_non_owned_from_read_access_user(self) -> None:
259266 db .session .delete (database )
260267 db .session .commit ()
261268
269+ @with_feature_flags (SOFT_DELETE = True )
262270 def test_embedded_dashboard_with_soft_deleted_parent (self ) -> None :
263271 """Embedded URL keeps loading after the parent dashboard is soft-deleted.
264272
@@ -354,6 +362,7 @@ def _create_dashboard(self, title: str = "restore_test") -> Dashboard:
354362 db .session .commit ()
355363 return dashboard
356364
365+ @with_feature_flags (SOFT_DELETE = True )
357366 def test_restore_soft_deleted_dashboard (self ) -> None :
358367 """POST /api/v1/dashboard/<uuid>/restore makes it visible again."""
359368 dashboard = self ._create_dashboard ("restore_sd_test" )
@@ -371,6 +380,7 @@ def test_restore_soft_deleted_dashboard(self) -> None:
371380 # Cleanup
372381 _hard_delete_dashboard (dashboard_id )
373382
383+ @with_feature_flags (SOFT_DELETE = True )
374384 def test_restore_failure_returns_422 (self ) -> None :
375385 """A failure during restore surfaces as a clean 422 via the
376386 ``DashboardRestoreFailedError`` handler rather than an unhandled 500.
@@ -401,6 +411,7 @@ def test_restore_failure_returns_422(self) -> None:
401411 # Cleanup
402412 _hard_delete_dashboard (dashboard_id )
403413
414+ @with_feature_flags (SOFT_DELETE = True )
404415 def test_restore_uses_can_write_permission (self ) -> None :
405416 """Non-admin owner with ``can_write_Dashboard`` can hit the restore
406417 endpoint.
@@ -444,6 +455,7 @@ def test_restore_uses_can_write_permission(self) -> None:
444455 # Cleanup
445456 _hard_delete_dashboard (dashboard_id )
446457
458+ @with_feature_flags (SOFT_DELETE = True )
447459 def test_restore_preserves_chart_associations (self ) -> None :
448460 """Restoring a dashboard reconnects to its charts (T028)."""
449461 from superset .models .slice import Slice
@@ -482,6 +494,7 @@ def test_restore_preserves_chart_associations(self) -> None:
482494 db .session .delete (chart )
483495 _hard_delete_dashboard (dashboard_id )
484496
497+ @with_feature_flags (SOFT_DELETE = True )
485498 def test_restore_blocked_by_active_slug_twin (self ) -> None :
486499 """Restore returns 422 when another active dashboard now owns the slug.
487500
@@ -552,6 +565,7 @@ def test_restore_blocked_by_active_slug_twin(self) -> None:
552565 _hard_delete_dashboard (first_id )
553566 _hard_delete_dashboard (second_id )
554567
568+ @with_feature_flags (SOFT_DELETE = True )
555569 def test_partial_index_allows_multiple_soft_deleted_with_same_slug (self ) -> None :
556570 """On dialects with the partial index, two soft-deleted dashboards can share a slug.
557571
@@ -611,6 +625,7 @@ def test_partial_index_allows_multiple_soft_deleted_with_same_slug(self) -> None
611625 _hard_delete_dashboard (first_id )
612626 _hard_delete_dashboard (second_id )
613627
628+ @with_feature_flags (SOFT_DELETE = True )
614629 def test_restore_via_import_with_slug_rename (self ) -> None :
615630 """Restore-via-import succeeds when the upload changes the slug to a
616631 free value, even when the soft-deleted dashboard's old slug is now
0 commit comments