1. from django.conf import settings
    
  2. from django.contrib.auth.models import User
    
  3. from django.contrib.flatpages.models import FlatPage
    
  4. from django.contrib.sites.models import Site
    
  5. from django.test import TestCase, modify_settings, override_settings
    
  6. 
    
  7. from .settings import FLATPAGES_TEMPLATES
    
  8. 
    
  9. 
    
  10. class TestDataMixin:
    
  11.     @classmethod
    
  12.     def setUpTestData(cls):
    
  13.         # don't use the manager because we want to ensure the site exists
    
  14.         # with pk=1, regardless of whether or not it already exists.
    
  15.         cls.site1 = Site(pk=1, domain="example.com", name="example.com")
    
  16.         cls.site1.save()
    
  17.         cls.fp1 = FlatPage.objects.create(
    
  18.             url="/flatpage/",
    
  19.             title="A Flatpage",
    
  20.             content="Isn't it flat!",
    
  21.             enable_comments=False,
    
  22.             template_name="",
    
  23.             registration_required=False,
    
  24.         )
    
  25.         cls.fp2 = FlatPage.objects.create(
    
  26.             url="/location/flatpage/",
    
  27.             title="A Nested Flatpage",
    
  28.             content="Isn't it flat and deep!",
    
  29.             enable_comments=False,
    
  30.             template_name="",
    
  31.             registration_required=False,
    
  32.         )
    
  33.         cls.fp3 = FlatPage.objects.create(
    
  34.             url="/sekrit/",
    
  35.             title="Sekrit Flatpage",
    
  36.             content="Isn't it sekrit!",
    
  37.             enable_comments=False,
    
  38.             template_name="",
    
  39.             registration_required=True,
    
  40.         )
    
  41.         cls.fp4 = FlatPage.objects.create(
    
  42.             url="/location/sekrit/",
    
  43.             title="Sekrit Nested Flatpage",
    
  44.             content="Isn't it sekrit and deep!",
    
  45.             enable_comments=False,
    
  46.             template_name="",
    
  47.             registration_required=True,
    
  48.         )
    
  49.         cls.fp1.sites.add(cls.site1)
    
  50.         cls.fp2.sites.add(cls.site1)
    
  51.         cls.fp3.sites.add(cls.site1)
    
  52.         cls.fp4.sites.add(cls.site1)
    
  53. 
    
  54. 
    
  55. @modify_settings(INSTALLED_APPS={"append": "django.contrib.flatpages"})
    
  56. @override_settings(
    
  57.     LOGIN_URL="/accounts/login/",
    
  58.     MIDDLEWARE=[
    
  59.         "django.middleware.common.CommonMiddleware",
    
  60.         "django.contrib.sessions.middleware.SessionMiddleware",
    
  61.         "django.middleware.csrf.CsrfViewMiddleware",
    
  62.         "django.contrib.auth.middleware.AuthenticationMiddleware",
    
  63.         "django.contrib.messages.middleware.MessageMiddleware",
    
  64.         # no 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
    
  65.     ],
    
  66.     ROOT_URLCONF="flatpages_tests.urls",
    
  67.     TEMPLATES=FLATPAGES_TEMPLATES,
    
  68.     SITE_ID=1,
    
  69. )
    
  70. class FlatpageViewTests(TestDataMixin, TestCase):
    
  71.     def test_view_flatpage(self):
    
  72.         "A flatpage can be served through a view"
    
  73.         response = self.client.get("/flatpage_root/flatpage/")
    
  74.         self.assertContains(response, "<p>Isn't it flat!</p>")
    
  75. 
    
  76.     def test_view_non_existent_flatpage(self):
    
  77.         """A nonexistent flatpage raises 404 when served through a view."""
    
  78.         response = self.client.get("/flatpage_root/no_such_flatpage/")
    
  79.         self.assertEqual(response.status_code, 404)
    
  80. 
    
  81.     def test_view_authenticated_flatpage(self):
    
  82.         "A flatpage served through a view can require authentication"
    
  83.         response = self.client.get("/flatpage_root/sekrit/")
    
  84.         self.assertRedirects(response, "/accounts/login/?next=/flatpage_root/sekrit/")
    
  85.         user = User.objects.create_user("testuser", "[email protected]", "s3krit")
    
  86.         self.client.force_login(user)
    
  87.         response = self.client.get("/flatpage_root/sekrit/")
    
  88.         self.assertContains(response, "<p>Isn't it sekrit!</p>")
    
  89. 
    
  90.     def test_fallback_flatpage(self):
    
  91.         "A fallback flatpage won't be served if the middleware is disabled"
    
  92.         response = self.client.get("/flatpage/")
    
  93.         self.assertEqual(response.status_code, 404)
    
  94. 
    
  95.     def test_fallback_non_existent_flatpage(self):
    
  96.         """
    
  97.         A nonexistent flatpage won't be served if the fallback middleware is
    
  98.         disabled.
    
  99.         """
    
  100.         response = self.client.get("/no_such_flatpage/")
    
  101.         self.assertEqual(response.status_code, 404)
    
  102. 
    
  103.     def test_view_flatpage_special_chars(self):
    
  104.         "A flatpage with special chars in the URL can be served through a view"
    
  105.         fp = FlatPage.objects.create(
    
  106.             url="/some.very_special~chars-here/",
    
  107.             title="A very special page",
    
  108.             content="Isn't it special!",
    
  109.             enable_comments=False,
    
  110.             registration_required=False,
    
  111.         )
    
  112.         fp.sites.add(settings.SITE_ID)
    
  113. 
    
  114.         response = self.client.get("/flatpage_root/some.very_special~chars-here/")
    
  115.         self.assertContains(response, "<p>Isn't it special!</p>")
    
  116. 
    
  117. 
    
  118. @modify_settings(INSTALLED_APPS={"append": "django.contrib.flatpages"})
    
  119. @override_settings(
    
  120.     APPEND_SLASH=True,
    
  121.     LOGIN_URL="/accounts/login/",
    
  122.     MIDDLEWARE=[
    
  123.         "django.middleware.common.CommonMiddleware",
    
  124.         "django.contrib.sessions.middleware.SessionMiddleware",
    
  125.         "django.middleware.csrf.CsrfViewMiddleware",
    
  126.         "django.contrib.auth.middleware.AuthenticationMiddleware",
    
  127.         "django.contrib.messages.middleware.MessageMiddleware",
    
  128.         # no 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
    
  129.     ],
    
  130.     ROOT_URLCONF="flatpages_tests.urls",
    
  131.     TEMPLATES=FLATPAGES_TEMPLATES,
    
  132.     SITE_ID=1,
    
  133. )
    
  134. class FlatpageViewAppendSlashTests(TestDataMixin, TestCase):
    
  135.     def test_redirect_view_flatpage(self):
    
  136.         "A flatpage can be served through a view and should add a slash"
    
  137.         response = self.client.get("/flatpage_root/flatpage")
    
  138.         self.assertRedirects(response, "/flatpage_root/flatpage/", status_code=301)
    
  139. 
    
  140.     def test_redirect_view_non_existent_flatpage(self):
    
  141.         """
    
  142.         A nonexistent flatpage raises 404 when served through a view and
    
  143.         should not add a slash.
    
  144.         """
    
  145.         response = self.client.get("/flatpage_root/no_such_flatpage")
    
  146.         self.assertEqual(response.status_code, 404)
    
  147. 
    
  148.     def test_redirect_fallback_flatpage(self):
    
  149.         """
    
  150.         A fallback flatpage won't be served if the middleware is disabled and
    
  151.         should not add a slash.
    
  152.         """
    
  153.         response = self.client.get("/flatpage")
    
  154.         self.assertEqual(response.status_code, 404)
    
  155. 
    
  156.     def test_redirect_fallback_non_existent_flatpage(self):
    
  157.         """
    
  158.         A nonexistent flatpage won't be served if the fallback middleware is
    
  159.         disabled and should not add a slash.
    
  160.         """
    
  161.         response = self.client.get("/no_such_flatpage")
    
  162.         self.assertEqual(response.status_code, 404)
    
  163. 
    
  164.     def test_redirect_view_flatpage_special_chars(self):
    
  165.         """
    
  166.         A flatpage with special chars in the URL can be served through a view
    
  167.         and should add a slash.
    
  168.         """
    
  169.         fp = FlatPage.objects.create(
    
  170.             url="/some.very_special~chars-here/",
    
  171.             title="A very special page",
    
  172.             content="Isn't it special!",
    
  173.             enable_comments=False,
    
  174.             registration_required=False,
    
  175.         )
    
  176.         fp.sites.add(settings.SITE_ID)
    
  177. 
    
  178.         response = self.client.get("/flatpage_root/some.very_special~chars-here")
    
  179.         self.assertRedirects(
    
  180.             response, "/flatpage_root/some.very_special~chars-here/", status_code=301
    
  181.         )