Skip to content

Commit b9877d0

Browse files
author
Mike Bridge
committed
test(dashboards): enable SOFT_DELETE flag in soft-delete integration tests
The soft-delete behaviour is gated behind the temporary SOFT_DELETE rollout flag (superset/daos/base.py, superset/models/helpers.py), which apache#41166 landed on master as off-by-default. These tests were written before the gate and did not enable it, so once rebased onto the gated master every soft-delete assertion failed (rows hard-deleted, deleted-state filters empty, embedded view 404). Decorate each test with @with_feature_flags(SOFT_DELETE=True) so they exercise the gated behaviour.
1 parent b9d9a60 commit b9877d0

1 file changed

Lines changed: 15 additions & 0 deletions

File tree

tests/integration_tests/dashboards/soft_delete_tests.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from superset.models.dashboard import Dashboard
2626
from superset.utils import json
2727
from tests.integration_tests.base_tests import SupersetTestCase
28+
from tests.integration_tests.conftest import with_feature_flags
2829
from 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

Comments
 (0)