From b9f1585a70ffa8eb4329fbca839aa5fd5d856e85 Mon Sep 17 00:00:00 2001 From: Sage Abdullah Date: Fri, 23 Aug 2024 15:31:29 +0100 Subject: [PATCH] Add tests for WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL Surprisingly we didn't have any tests for this... --- wagtail/admin/tests/pages/test_preview.py | 68 ++++++++++++++++++++- wagtail/snippets/tests/test_preview.py | 72 ++++++++++++++++++++++- 2 files changed, 138 insertions(+), 2 deletions(-) diff --git a/wagtail/admin/tests/pages/test_preview.py b/wagtail/admin/tests/pages/test_preview.py index f8222f0d7b..798f500b07 100644 --- a/wagtail/admin/tests/pages/test_preview.py +++ b/wagtail/admin/tests/pages/test_preview.py @@ -1,7 +1,7 @@ import datetime from functools import wraps -from django.test import TestCase +from django.test import TestCase, override_settings from django.urls import reverse from django.utils import timezone from freezegun import freeze_time @@ -535,6 +535,18 @@ class TestEnablePreview(WagtailTestUtils, TestCase): self.assertIsNotNone(controller) self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + # Should have a default interval of 500ms and should render the hidden spinner + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "500") + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNotNone(spinner) + self.assertIsNotNone(spinner.get("hidden")) + self.assertIsNotNone(spinner.select_one("svg.icon-spinner")) + + # Should not render any buttons (the refresh button in particular) + refresh_button = controller.select_one("button") + self.assertIsNone(refresh_button) + # Should show the iframe iframe = controller.select_one("#w-preview-iframe") self.assertIsNotNone(iframe) @@ -590,6 +602,60 @@ class TestEnablePreview(WagtailTestUtils, TestCase): self.assertIsNotNone(other_option) self.assertIsNone(other_option.get("selected")) + @override_settings(WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL=12345) + def test_custom_auto_update_interval(self): + edit_url = self.get_url_on_edit("edit", self.single) + preview_url = self.get_url_on_edit("preview_on_edit", self.single) + response = self.client.get(edit_url) + + self.assertEqual(response.status_code, 200) + + soup = self.get_soup(response.content) + + # Should set the custom interval value on the controller + controller = soup.select_one('[data-controller="w-preview"]') + self.assertIsNotNone(controller) + self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "12345") + + # Should render the spinner + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNotNone(spinner) + self.assertIsNotNone(spinner.get("hidden")) + self.assertIsNotNone(spinner.select_one("svg.icon-spinner")) + + # Should not render any buttons (the refresh button in particular) + refresh_button = controller.select_one("button") + self.assertIsNone(refresh_button) + + @override_settings(WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL=0) + def test_disable_auto_update_using_zero_interval(self): + edit_url = self.get_url_on_edit("edit", self.single) + preview_url = self.get_url_on_edit("preview_on_edit", self.single) + response = self.client.get(edit_url) + + self.assertEqual(response.status_code, 200) + + soup = self.get_soup(response.content) + + # Should set the interval value on the controller + controller = soup.select_one('[data-controller="w-preview"]') + self.assertIsNotNone(controller) + self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "0") + + # Should not render the spinner + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNone(spinner) + + # Should render the refresh button with the w-progress controller + refresh_button = controller.select_one("button") + self.assertIsNotNone(refresh_button) + self.assertEqual(refresh_button.get("data-controller"), "w-progress") + self.assertEqual(refresh_button.text.strip(), "Refresh") + def test_show_preview_on_revisions_list(self): latest_revision = self.single.save_revision(log_action=True) history_url = self.get_url_on_edit("history", self.single) diff --git a/wagtail/snippets/tests/test_preview.py b/wagtail/snippets/tests/test_preview.py index 646531242c..de3ebc2de1 100644 --- a/wagtail/snippets/tests/test_preview.py +++ b/wagtail/snippets/tests/test_preview.py @@ -1,6 +1,6 @@ import datetime -from django.test import TestCase +from django.test import TestCase, override_settings from django.urls import reverse from django.utils import timezone from freezegun import freeze_time @@ -423,6 +423,18 @@ class TestEnablePreview(WagtailTestUtils, TestCase): self.assertIsNotNone(controller) self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + # Should have a default interval of 500ms and should render the hidden spinner + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "500") + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNotNone(spinner) + self.assertIsNotNone(spinner.get("hidden")) + self.assertIsNotNone(spinner.select_one("svg.icon-spinner")) + + # Should not render any buttons (the refresh button in particular) + refresh_button = controller.select_one("button") + self.assertIsNone(refresh_button) + # Should show the iframe iframe = controller.select_one("#w-preview-iframe") self.assertIsNotNone(iframe) @@ -446,6 +458,64 @@ class TestEnablePreview(WagtailTestUtils, TestCase): self.assertEqual(other_option.text.strip(), "Normal") self.assertIsNone(other_option.get("selected")) + @override_settings(WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL=12345) + def test_custom_auto_update_interval(self): + edit_url = self.get_url(self.single, "edit", args=(self.single.pk,)) + preview_url = self.get_url( + self.single, "preview_on_edit", args=(self.multiple.pk,) + ) + response = self.client.get(edit_url) + + self.assertEqual(response.status_code, 200) + + soup = self.get_soup(response.content) + + # Should set the custom interval value on the controller + controller = soup.select_one('[data-controller="w-preview"]') + self.assertIsNotNone(controller) + self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "12345") + + # Should render the spinner + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNotNone(spinner) + self.assertIsNotNone(spinner.get("hidden")) + self.assertIsNotNone(spinner.select_one("svg.icon-spinner")) + + # Should not render any buttons (the refresh button in particular) + refresh_button = controller.select_one("button") + self.assertIsNone(refresh_button) + + @override_settings(WAGTAIL_AUTO_UPDATE_PREVIEW_INTERVAL=0) + def test_disable_auto_update_using_zero_interval(self): + edit_url = self.get_url(self.single, "edit", args=(self.single.pk,)) + preview_url = self.get_url( + self.single, "preview_on_edit", args=(self.multiple.pk,) + ) + response = self.client.get(edit_url) + + self.assertEqual(response.status_code, 200) + + soup = self.get_soup(response.content) + + # Should set the interval value on the controller + controller = soup.select_one('[data-controller="w-preview"]') + self.assertIsNotNone(controller) + self.assertEqual(controller.get("data-w-preview-url-value"), preview_url) + interval_value = controller.get("data-w-preview-auto-update-interval-value") + self.assertEqual(interval_value, "0") + + # Should not render the spinner + spinner = controller.select_one('[data-w-preview-target="spinner"]') + self.assertIsNone(spinner) + + # Should render the refresh button with the w-progress controller + refresh_button = controller.select_one("button") + self.assertIsNotNone(refresh_button) + self.assertEqual(refresh_button.get("data-controller"), "w-progress") + self.assertEqual(refresh_button.text.strip(), "Refresh") + def test_show_preview_on_revisions_list(self): latest_revision = self.multiple.save_revision(log_action=True) history_url = self.get_url(self.multiple, "history", args=(self.multiple.pk,))