website/website/common/tests/test_pages.py

80 lines
2.9 KiB
Python

from django.template.loader import get_template
from django.test import SimpleTestCase, TestCase
from django.urls import reverse
from website.common.factories import ContentPageFactory, ListingPageFactory
from website.common.models import BaseListingPage, BasePage
from website.common.utils import get_page_models
from website.home.models import HomePage
class BasePageTestCase(SimpleTestCase):
def test_unique_body_classes(self) -> None:
body_classes = [page.body_class for page in get_page_models()]
self.assertEqual(len(body_classes), len(set(body_classes)))
def test_pages_inherit_base_page(self) -> None:
for page_model in get_page_models():
self.assertTrue(
issubclass(page_model, BasePage),
f"{page_model} does not inherit from {BasePage}.",
)
def test_pages_have_template(self) -> None:
for page in get_page_models():
get_template(page.template)
class ContentPageTestCase(TestCase):
@classmethod
def setUpTestData(cls) -> None:
cls.home_page = HomePage.objects.get()
cls.page = ContentPageFactory(parent=cls.home_page)
def test_accessible(self) -> None:
response = self.client.get(self.page.url)
self.assertEqual(response.status_code, 200)
def test_queries(self) -> None:
with self.assertNumQueries(32):
self.client.get(self.page.url)
class ListingPageTestCase(TestCase):
@classmethod
def setUpTestData(cls) -> None:
cls.home_page = HomePage.objects.get()
cls.page = ListingPageFactory(parent=cls.home_page)
# Orphaned content page, shouldn't show up on lists
ContentPageFactory()
ContentPageFactory(parent=cls.page)
ContentPageFactory(parent=cls.page)
def test_accessible(self) -> None:
with self.assertNumQueries(35):
response = self.client.get(self.page.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context["listing_pages"]), 2)
self.assertContains(response, self.page.reverse_subpage("feed"))
def test_feed_redirects(self) -> None:
response = self.client.get(self.page.url + self.page.reverse_subpage("feed"))
self.assertRedirects(
response, reverse("feed"), status_code=301, fetch_redirect_response=True
)
def test_meta_url(self) -> None:
response = self.client.get(self.page.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["page"].get_meta_url(), self.page.full_url)
def test_meta_url_with_page(self) -> None:
ContentPageFactory.create_batch(BaseListingPage.PAGE_SIZE, parent=self.page)
response = self.client.get(self.page.url, {"page": 2})
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.context["page"].get_meta_url(), self.page.full_url + "?page=2"
)