kopia lustrzana https://github.com/wagtail/wagtail
Add tests for ModelViewSet's history view
rodzic
d7e32c79cc
commit
d73f48a735
|
@ -1,11 +1,16 @@
|
||||||
import datetime
|
import datetime
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.contrib.admin.utils import quote
|
from django.contrib.admin.utils import quote
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.urls import reverse
|
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 openpyxl import load_workbook
|
||||||
|
|
||||||
|
from wagtail.models import ModelLogEntry
|
||||||
from wagtail.test.testapp.models import FeatureCompleteToy, JSONStreamModel
|
from wagtail.test.testapp.models import FeatureCompleteToy, JSONStreamModel
|
||||||
from wagtail.test.utils.template_tests import AdminTemplateTestUtils
|
from wagtail.test.utils.template_tests import AdminTemplateTestUtils
|
||||||
from wagtail.test.utils.wagtail_tests import WagtailTestUtils
|
from wagtail.test.utils.wagtail_tests import WagtailTestUtils
|
||||||
|
@ -702,6 +707,30 @@ class TestBreadcrumbs(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
||||||
response = self.client.get(delete_url)
|
response = self.client.get(delete_url)
|
||||||
self.assertBreadcrumbsNotRendered(response.content)
|
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):
|
class TestLegacyPatterns(WagtailTestUtils, TestCase):
|
||||||
# RemovedInWagtail60Warning: legacy integer pk-based URLs will be removed
|
# RemovedInWagtail60Warning: legacy integer pk-based URLs will be removed
|
||||||
|
@ -736,3 +765,100 @@ class TestLegacyPatterns(WagtailTestUtils, TestCase):
|
||||||
response = self.client.get(legacy_delete_url)
|
response = self.client.get(legacy_delete_url)
|
||||||
self.assertEqual(delete_url, "/admin/streammodel/delete/1/")
|
self.assertEqual(delete_url, "/admin/streammodel/delete/1/")
|
||||||
self.assertRedirects(response, delete_url, 301)
|
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)
|
||||||
|
|
Ładowanie…
Reference in New Issue