From d73f48a735eb926a7dccb3e674ffcc5e4576f787 Mon Sep 17 00:00:00 2001 From: Sage Abdullah Date: Tue, 19 Sep 2023 10:59:32 +0100 Subject: [PATCH] Add tests for ModelViewSet's history view --- .../tests/viewsets/test_model_viewset.py | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/wagtail/admin/tests/viewsets/test_model_viewset.py b/wagtail/admin/tests/viewsets/test_model_viewset.py index 2aabf05ada..5352bef23c 100644 --- a/wagtail/admin/tests/viewsets/test_model_viewset.py +++ b/wagtail/admin/tests/viewsets/test_model_viewset.py @@ -1,11 +1,16 @@ import datetime from io import BytesIO +from django.conf import settings from django.contrib.admin.utils import quote +from django.contrib.contenttypes.models import ContentType from django.test import TestCase from django.urls import reverse +from django.utils.formats import date_format +from django.utils.timezone import make_aware from openpyxl import load_workbook +from wagtail.models import ModelLogEntry from wagtail.test.testapp.models import FeatureCompleteToy, JSONStreamModel from wagtail.test.utils.template_tests import AdminTemplateTestUtils from wagtail.test.utils.wagtail_tests import WagtailTestUtils @@ -702,6 +707,30 @@ class TestBreadcrumbs(AdminTemplateTestUtils, WagtailTestUtils, TestCase): response = self.client.get(delete_url) self.assertBreadcrumbsNotRendered(response.content) + def test_history_view(self): + history_url = reverse( + "feature_complete_toy:history", + args=(quote(self.object.pk),), + ) + response = self.client.get(history_url) + items = [ + { + "url": reverse("feature_complete_toy:index"), + "label": "Feature complete toys", + }, + { + "url": reverse( + "feature_complete_toy:edit", args=(quote(self.object.pk),) + ), + "label": str(self.object), + }, + { + "url": "", + "label": "History", + }, + ] + self.assertBreadcrumbsItemsRendered(items, response.content) + class TestLegacyPatterns(WagtailTestUtils, TestCase): # RemovedInWagtail60Warning: legacy integer pk-based URLs will be removed @@ -736,3 +765,100 @@ class TestLegacyPatterns(WagtailTestUtils, TestCase): response = self.client.get(legacy_delete_url) self.assertEqual(delete_url, "/admin/streammodel/delete/1/") self.assertRedirects(response, delete_url, 301) + + +class TestHistoryView(WagtailTestUtils, TestCase): + @classmethod + def setUpTestData(cls): + cls.user = cls.create_test_user() + cls.object = FeatureCompleteToy.objects.create(name="Buzz") + cls.url = reverse( + "feature_complete_toy:history", + args=(quote(cls.object.pk),), + ) + + content_type = ContentType.objects.get_for_model(FeatureCompleteToy) + cls.timestamp_1 = datetime.datetime(2021, 9, 30, 10, 1, 0) + cls.timestamp_2 = datetime.datetime(2022, 5, 10, 12, 34, 0) + if settings.USE_TZ: + cls.timestamp_1 = make_aware(cls.timestamp_1) + cls.timestamp_2 = make_aware(cls.timestamp_2) + ModelLogEntry.objects.create( + content_type=content_type, + label="Test Buzz", + action="wagtail.create", + user=cls.user, + timestamp=cls.timestamp_1, + object_id=cls.object.pk, + ) + ModelLogEntry.objects.create( + content_type=content_type, + label="Test Buzz Updated", + action="wagtail.edit", + user=cls.user, + timestamp=cls.timestamp_2, + object_id=cls.object.pk, + ) + + def setUp(self): + self.login(self.user) + + def test_simple(self): + expected = ( + ("Edited", str(self.user), date_format(self.timestamp_2, "c")), + ("Created", str(self.user), date_format(self.timestamp_1, "c")), + ) + response = self.client.get(self.url) + soup = self.get_soup(response.content) + rows = soup.select("tbody tr") + self.assertEqual(response.status_code, 200) + self.assertEqual(len(rows), 2) + + rendered_rows = [] + for row in rows: + cells = [] + tds = row.select("td") + self.assertEqual(len(tds), 3) + cells.append(tds[0].text.strip()) + cells.append(tds[1].text.strip()) + cells.append(tds[2].select_one("time").attrs.get("datetime")) + rendered_rows.append(cells) + + for rendered_row, expected_row in zip(rendered_rows, expected): + self.assertSequenceEqual(rendered_row, expected_row) + + def test_filters(self): + response = self.client.get(self.url, {"action": "wagtail.edit"}) + soup = self.get_soup(response.content) + rows = soup.select("tbody tr") + self.assertEqual(response.status_code, 200) + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].select_one("td").text.strip(), "Edited") + + response = self.client.get(self.url, {"action": "wagtail.create"}) + soup = self.get_soup(response.content) + rows = soup.select("tbody tr") + heading = soup.select_one("h2") + self.assertEqual(response.status_code, 200) + self.assertEqual(heading.text.strip(), "There is 1 match") + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].select_one("td").text.strip(), "Created") + + def test_empty(self): + ModelLogEntry.objects.all().delete() + response = self.client.get(self.url) + soup = self.get_soup(response.content) + results = soup.select_one("#listing-results") + table = soup.select_one("table") + self.assertEqual(response.status_code, 200) + self.assertIsNotNone(results) + self.assertEqual(results.text.strip(), "No log entries found.") + self.assertIsNone(table) + + def test_edit_view_links_to_history_view(self): + edit_url = reverse("feature_complete_toy:edit", args=(quote(self.object.pk),)) + response = self.client.get(edit_url) + soup = self.get_soup(response.content) + header = soup.select_one(".w-slim-header") + history_link = header.find("a", attrs={"href": self.url}) + self.assertIsNotNone(history_link)