class TestPurgeRevisionsCommand(TestCase): fixtures = ["test.json"] def setUp(self): # Find root page self.root_page = Page.objects.get(id=2) self.page = SimplePage( title="Hello world!", slug="hello-world", content="hello", live=False, ) self.root_page.add_child(instance=self.page) self.page.refresh_from_db() def run_command(self, days=None): if days: days_input = "--days=" + str(days) return management.call_command("purge_revisions", days_input, stdout=StringIO()) return management.call_command("purge_revisions", stdout=StringIO()) def test_latest_revision_not_purged(self): revision_1 = self.page.save_revision() revision_2 = self.page.save_revision() self.run_command() # revision 1 should be deleted, revision 2 should not be self.assertNotIn(revision_1, PageRevision.objects.filter(page=self.page)) self.assertIn(revision_2, PageRevision.objects.filter(page=self.page)) def test_revisions_in_moderation_not_purged(self): self.page.save_revision(submitted_for_moderation=True) revision = self.page.save_revision() self.run_command() self.assertTrue( PageRevision.objects.filter( page=self.page, submitted_for_moderation=True).exists()) try: from wagtail.models import Task, Workflow, WorkflowTask workflow = Workflow.objects.create(name="test_workflow") task_1 = Task.objects.create(name="test_task_1") user = get_user_model().objects.first() WorkflowTask.objects.create(workflow=workflow, task=task_1, sort_order=1) workflow.start(self.page, user) self.page.save_revision() self.run_command() # even though no longer the latest revision, the old revision should stay as it is # attached to an in progress workflow self.assertIn(revision, PageRevision.objects.filter(page=self.page)) except ImportError: pass def test_revisions_with_approve_go_live_not_purged(self): approved_revision = self.page.save_revision( approved_go_live_at=timezone.now() + timedelta(days=1)) self.page.save_revision() self.run_command() self.assertIn(approved_revision, PageRevision.objects.filter(page=self.page)) def test_purge_revisions_with_date_cutoff(self): old_revision = self.page.save_revision() self.page.save_revision() self.run_command(days=30) # revision should not be deleted, as it is younger than 30 days self.assertIn(old_revision, PageRevision.objects.filter(page=self.page)) old_revision.created_at = timezone.now() - timedelta(days=31) old_revision.save() self.run_command(days=30) # revision is now older than 30 days, so should be deleted self.assertNotIn(old_revision, PageRevision.objects.filter(page=self.page))
class TestPageUnpublish(TestCase, WagtailTestUtils): def setUp(self): self.user = self.login() # Create a page to unpublish self.root_page = Page.objects.get(id=2) self.page = SimplePage( title="Hello world!", slug="hello-world", content="hello", live=True, ) self.root_page.add_child(instance=self.page) def test_unpublish_view(self): """ This tests that the unpublish view responds with an unpublish confirm page """ # Get unpublish page response = self.client.get( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, ))) # Check that the user received an unpublish confirm page self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "wagtailadmin/pages/confirm_unpublish.html") def test_unpublish_view_invalid_page_id(self): """ This tests that the unpublish view returns an error if the page id is invalid """ # Get unpublish page response = self.client.get( reverse("wagtailadmin_pages:unpublish", args=(12345, ))) # Check that the user received a 404 response self.assertEqual(response.status_code, 404) def test_unpublish_view_bad_permissions(self): """ This tests that the unpublish view doesn't allow users without unpublish permissions """ # Remove privileges from user self.user.is_superuser = False self.user.user_permissions.add( Permission.objects.get(content_type__app_label="wagtailadmin", codename="access_admin")) self.user.save() # Get unpublish page response = self.client.get( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, ))) # Check that the user received a 302 redirected response self.assertEqual(response.status_code, 302) def test_unpublish_view_post(self): """ This posts to the unpublish view and checks that the page was unpublished """ # Connect a mock signal handler to page_unpublished signal mock_handler = mock.MagicMock() page_unpublished.connect(mock_handler) # Post to the unpublish page response = self.client.post( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, ))) # Should be redirected to explorer page self.assertRedirects( response, reverse("wagtailadmin_explore", args=(self.root_page.id, ))) # Check that the page was unpublished self.assertFalse(SimplePage.objects.get(id=self.page.id).live) # Check that the page_unpublished signal was fired self.assertEqual(mock_handler.call_count, 1) mock_call = mock_handler.mock_calls[0][2] self.assertEqual(mock_call["sender"], self.page.specific_class) self.assertEqual(mock_call["instance"], self.page) self.assertIsInstance(mock_call["instance"], self.page.specific_class) def test_after_unpublish_page(self): def hook_func(request, page): self.assertIsInstance(request, HttpRequest) self.assertEqual(page.id, self.page.id) return HttpResponse("Overridden!") with self.register_hook("after_unpublish_page", hook_func): post_data = {} response = self.client.post( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, )), post_data) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, b"Overridden!") self.page.refresh_from_db() self.assertEqual(self.page.status_string, _("draft")) def test_before_unpublish_page(self): def hook_func(request, page): self.assertIsInstance(request, HttpRequest) self.assertEqual(page.id, self.page.id) return HttpResponse("Overridden!") with self.register_hook("before_unpublish_page", hook_func): post_data = {} response = self.client.post( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, )), post_data) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, b"Overridden!") # The hook response is served before unpublish is called. self.page.refresh_from_db() self.assertEqual(self.page.status_string, _("live")) def test_unpublish_descendants_view(self): """ This tests that the unpublish view responds with an unpublish confirm page that does not contain the form field 'include_descendants' """ # Get unpublish page response = self.client.get( reverse("wagtailadmin_pages:unpublish", args=(self.page.id, ))) # Check that the user received an unpublish confirm page self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "wagtailadmin/pages/confirm_unpublish.html") # Check the form does not contain the checkbox field include_descendants self.assertNotContains( response, '<input id="id_include_descendants" name="include_descendants" type="checkbox">', )