def test_restoring_page_custom_move_to(self):
        from wagtail_recycle_bin.wagtail_hooks import urlconf_time

        root_page = Page.objects.get(url_path="/")

        top = Page(title="1p", has_unpublished_changes=False, live=True)
        root_page.add_child(instance=top)

        sub_page = Page(title="1p 1u",
                        has_unpublished_changes=True,
                        live=False)
        top.add_child(instance=sub_page)

        with self.register_hook("before_delete_page", recycle_delete):
            delete_url = reverse("wagtailadmin_pages:delete",
                                 args=(sub_page.id, ))
            self.client.post(delete_url)

        sub_page.refresh_from_db()

        with self.register_hook("register_admin_urls", urlconf_time):
            restore_url = reverse(
                "wagtail_recycle_bin_move",
                args=(sub_page.id, ),
            )
            self.client.post(restore_url, {"move_page": str(root_page.id)})

        sub_page.refresh_from_db()

        self.assertIn(
            sub_page.id,
            list(root_page.get_children().values_list("id", flat=True)),
        )

        self.assertEqual(RecycleBin.objects.count(), 0)
    def test_removing_page_unpublishes_all_sub_pages(self):
        root_page = Page.objects.get(url_path="/")

        top = Page(title="1p", has_unpublished_changes=False, live=True)
        root_page.add_child(instance=top)

        sub_page = Page(title="1p 1u",
                        has_unpublished_changes=True,
                        live=False)
        top.add_child(instance=sub_page)

        sub_page = Page(title="1p 2p",
                        has_unpublished_changes=False,
                        live=True)
        top.add_child(instance=sub_page)
        sub_page_id = sub_page.id

        sub_sub_page = Page(title="1p 2p 3u",
                            has_unpublished_changes=True,
                            live=False)
        sub_page.add_child(instance=sub_sub_page)

        self.assertEqual(top.get_descendants(inclusive=True).live().count(), 2)
        self.assertEqual(
            top.get_descendants(inclusive=True).not_live().count(), 2)

        with self.register_hook("before_delete_page", recycle_delete):
            delete_url = reverse("wagtailadmin_pages:delete", args=(top.id, ))
            self.client.post(delete_url)

        top.refresh_from_db()

        self.assertEqual(top.get_descendants(inclusive=True).live().count(), 0)
        self.assertEqual(
            top.get_descendants(inclusive=True).not_live().count(), 4)
    def test_restoring_page_re_publishes(self):
        from wagtail_recycle_bin.wagtail_hooks import urlconf_time

        root_page = Page.objects.get(url_path="/")

        top = Page(title="1p", has_unpublished_changes=False, live=True)
        root_page.add_child(instance=top)

        sub_page = Page(title="1p 1u",
                        has_unpublished_changes=True,
                        live=False)
        top.add_child(instance=sub_page)

        sub_page = Page(title="1p 2p",
                        has_unpublished_changes=False,
                        live=True)
        top.add_child(instance=sub_page)
        sub_page_id = sub_page.id

        sub_sub_page = Page(title="1p 2p 3u",
                            has_unpublished_changes=True,
                            live=False)
        sub_page.add_child(instance=sub_sub_page)

        self.assertEqual(top.get_descendants(inclusive=True).live().count(), 2)
        self.assertEqual(
            top.get_descendants(inclusive=True).not_live().count(), 2)

        with self.register_hook("before_delete_page", recycle_delete):
            delete_url = reverse("wagtailadmin_pages:delete", args=(top.id, ))
            self.client.post(delete_url)

        top.refresh_from_db()

        self.assertEqual(top.get_descendants(inclusive=True).live().count(), 0)
        self.assertEqual(
            top.get_descendants(inclusive=True).not_live().count(), 4)

        with self.register_hook("register_admin_urls", urlconf_time):
            restore_url = reverse("wagtail_recycle_bin_restore",
                                  args=(top.id, ))
            self.client.get(restore_url)

        top.refresh_from_db()

        self.assertEqual(top.get_descendants(inclusive=True).live().count(), 2)
        self.assertEqual(
            top.get_descendants(inclusive=True).not_live().count(), 2)
        self.assertEqual(RecycleBin.objects.count(), 0)
        self.assertEqual(RecycleBinPage.objects.first().get_children().count(),
                         0)
    def test_update_wont_publish_or_unpublish_if_live_column_is_missing(self):
        live_page = Page(title='Live Page', live=True)
        draft_page = Page(title='Draft Page', live=False)
        home = Page.objects.get(slug='home')
        home.add_child(instance=live_page)
        home.add_child(instance=draft_page)

        csv_data = StringIO('id,title\r\n'
                            f'3,Updated Live Page\r\n'
                            f'4,Updated Draft Page\r\n')
        successes, errors = import_pages(csv_data, Page)
        self.assertEqual(successes, [
            'Updated page Updated Live Page with id 3',
            'Updated page Updated Draft Page with id 4',
        ])
        self.assertEqual(errors, [])

        live_page.refresh_from_db()
        self.assertEqual(live_page.title, 'Updated Live Page')
        self.assertTrue(live_page.live)
        draft_page.refresh_from_db()
        self.assertEqual(draft_page.title, 'Updated Draft Page')
        self.assertFalse(draft_page.live)