diff --git a/wagtail/tests/test_revision_model.py b/wagtail/tests/test_revision_model.py index 66f5c4ef64..18852ddd69 100644 --- a/wagtail/tests/test_revision_model.py +++ b/wagtail/tests/test_revision_model.py @@ -6,6 +6,7 @@ from freezegun import freeze_time from wagtail.models import Page, Revision, get_default_page_content_type from wagtail.test.testapp.models import ( + FullFeaturedSnippet, RevisableGrandChildModel, RevisableModel, SimplePage, @@ -178,3 +179,25 @@ class TestRevisableModel(TestCase): "SubmittedRevisionsManager is deprecated and will be removed in a future release.", ): self.assertEqual(list(Revision.submitted_revisions.all()), [revision]) + + def test_revision_cascade_on_object_delete(self): + page = self.create_page() + full_featured_snippet = FullFeaturedSnippet.objects.create(text="foo") + cases = [ + # Tuple of (instance, cascades) + # For models that define a GenericRelation to Revision, the revision + # should be deleted when the instance is deleted. + (page, True), + (full_featured_snippet, True), + (self.instance, False), # No GenericRelation to Revision + ] + for instance, cascades in cases: + with self.subTest(instance=instance): + revision = instance.save_revision() + query = { + "base_content_type": instance.get_base_content_type(), + "object_id": str(instance.pk), + } + self.assertEqual(Revision.objects.filter(**query).first(), revision) + instance.delete() + self.assertIs(Revision.objects.filter(**query).exists(), not cascades) diff --git a/wagtail/tests/test_workflow.py b/wagtail/tests/test_workflow.py index d4a385bb4d..1ce3acdc02 100644 --- a/wagtail/tests/test_workflow.py +++ b/wagtail/tests/test_workflow.py @@ -449,6 +449,19 @@ class TestPageWorkflows(WagtailTestUtils, TestCase): self.assertIsNone(self.object.locked_at) self.assertIsNone(self.object.locked_by) + def test_workflow_state_cascade_on_object_delete(self, cascades=True): + data = self.start_workflow() + query = { + "base_content_type": self.object.get_base_content_type(), + "object_id": str(self.object.pk), + } + self.assertEqual( + WorkflowState.objects.filter(**query).first(), + data["workflow_state"], + ) + self.object.delete() + self.assertIs(WorkflowState.objects.filter(**query).exists(), not cascades) + class TestSnippetWorkflows(TestPageWorkflows): fixtures = None @@ -479,3 +492,10 @@ class TestSnippetWorkflowsNotLockable(TestSnippetWorkflows): self.assertEqual(workflow_state.workflow, workflow) self.assertEqual(workflow_state.content_object, self.object) self.assertEqual(workflow_state.status, "in_progress") + + def test_workflow_state_cascade_on_object_delete(self): + # We expect the cascade to not happen as the model does not define + # a GenericRelation to WorkflowState. However, workflows should still + # work as expected. + # See https://github.com/wagtail/wagtail/issues/11300 for more details. + return super().test_workflow_state_cascade_on_object_delete(cascades=False)