mirror of
https://github.com/apache/superset.git
synced 2026-04-19 08:04:53 +00:00
fix: delete chart, dashboards, dbs with assoc reports (#11801)
* fix: delete chart or dashboards with assoc reports * database constraint to reports and tests * add tests for dashboards and database * fix exceptions default text
This commit is contained in:
committed by
GitHub
parent
13c51d5211
commit
bac84a3aac
@@ -38,6 +38,7 @@ from superset.connectors.connector_registry import ConnectorRegistry
|
||||
from superset.extensions import db, security_manager
|
||||
from superset.models.core import Database, FavStar, FavStarClassName
|
||||
from superset.models.dashboard import Dashboard
|
||||
from superset.models.reports import ReportSchedule, ReportScheduleType
|
||||
from superset.models.slice import Slice
|
||||
from superset.utils import core as utils
|
||||
from tests.base_api_tests import ApiOwnersTestCaseMixin
|
||||
@@ -117,6 +118,26 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
db.session.delete(fav_chart)
|
||||
db.session.commit()
|
||||
|
||||
@pytest.fixture()
|
||||
def create_chart_with_report(self):
|
||||
with self.create_app().app_context():
|
||||
admin = self.get_user("admin")
|
||||
chart = self.insert_chart(f"chart_report", [admin.id], 1)
|
||||
report_schedule = ReportSchedule(
|
||||
type=ReportScheduleType.REPORT,
|
||||
name="report_with_chart",
|
||||
crontab="* * * * *",
|
||||
chart=chart,
|
||||
)
|
||||
db.session.commit()
|
||||
|
||||
yield chart
|
||||
|
||||
# rollback changes
|
||||
db.session.delete(report_schedule)
|
||||
db.session.delete(chart)
|
||||
db.session.commit()
|
||||
|
||||
def test_delete_chart(self):
|
||||
"""
|
||||
Chart API: Test delete
|
||||
@@ -174,6 +195,26 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
rv = self.delete_assert_metric(uri, "delete")
|
||||
self.assertEqual(rv.status_code, 404)
|
||||
|
||||
@pytest.mark.usefixtures("create_chart_with_report")
|
||||
def test_delete_chart_with_report(self):
|
||||
"""
|
||||
Chart API: Test delete with associated report
|
||||
"""
|
||||
self.login(username="admin")
|
||||
chart = (
|
||||
db.session.query(Slice)
|
||||
.filter(Slice.slice_name == "chart_report")
|
||||
.one_or_none()
|
||||
)
|
||||
uri = f"api/v1/chart/{chart.id}"
|
||||
rv = self.client.delete(uri)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
self.assertEqual(rv.status_code, 422)
|
||||
expected_response = {
|
||||
"message": "There are associated alerts or reports: report_with_chart"
|
||||
}
|
||||
self.assertEqual(response, expected_response)
|
||||
|
||||
def test_delete_bulk_charts_not_found(self):
|
||||
"""
|
||||
Chart API: Test delete bulk not found
|
||||
@@ -181,11 +222,35 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin):
|
||||
max_id = db.session.query(func.max(Slice.id)).scalar()
|
||||
chart_ids = [max_id + 1, max_id + 2]
|
||||
self.login(username="admin")
|
||||
argument = chart_ids
|
||||
uri = f"api/v1/chart/?q={prison.dumps(argument)}"
|
||||
uri = f"api/v1/chart/?q={prison.dumps(chart_ids)}"
|
||||
rv = self.delete_assert_metric(uri, "bulk_delete")
|
||||
self.assertEqual(rv.status_code, 404)
|
||||
|
||||
@pytest.mark.usefixtures("create_chart_with_report", "create_charts")
|
||||
def test_bulk_delete_chart_with_report(self):
|
||||
"""
|
||||
Chart API: Test bulk delete with associated report
|
||||
"""
|
||||
self.login(username="admin")
|
||||
chart_with_report = (
|
||||
db.session.query(Slice.id)
|
||||
.filter(Slice.slice_name == "chart_report")
|
||||
.one_or_none()
|
||||
)
|
||||
|
||||
charts = db.session.query(Slice.id).filter(Slice.slice_name.like("name%")).all()
|
||||
chart_ids = [chart.id for chart in charts]
|
||||
chart_ids.append(chart_with_report.id)
|
||||
|
||||
uri = f"api/v1/chart/?q={prison.dumps(chart_ids)}"
|
||||
rv = self.client.delete(uri)
|
||||
response = json.loads(rv.data.decode("utf-8"))
|
||||
self.assertEqual(rv.status_code, 422)
|
||||
expected_response = {
|
||||
"message": "There are associated alerts or reports: report_with_chart"
|
||||
}
|
||||
self.assertEqual(response, expected_response)
|
||||
|
||||
def test_delete_chart_admin_not_owned(self):
|
||||
"""
|
||||
Chart API: Test admin delete not owned
|
||||
|
||||
Reference in New Issue
Block a user