1. from django.conf import settings
    
  2. from django.contrib.flatpages.forms import FlatpageForm
    
  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. from django.utils import translation
    
  7. 
    
  8. 
    
  9. @modify_settings(INSTALLED_APPS={"append": ["django.contrib.flatpages"]})
    
  10. @override_settings(SITE_ID=1)
    
  11. class FlatpageAdminFormTests(TestCase):
    
  12.     @classmethod
    
  13.     def setUpTestData(cls):
    
  14.         # don't use the manager because we want to ensure the site exists
    
  15.         # with pk=1, regardless of whether or not it already exists.
    
  16.         cls.site1 = Site(pk=1, domain="example.com", name="example.com")
    
  17.         cls.site1.save()
    
  18. 
    
  19.     def setUp(self):
    
  20.         # Site fields cache needs to be cleared after flatpages is added to
    
  21.         # INSTALLED_APPS
    
  22.         Site._meta._expire_cache()
    
  23.         self.form_data = {
    
  24.             "title": "A test page",
    
  25.             "content": "This is a test",
    
  26.             "sites": [settings.SITE_ID],
    
  27.         }
    
  28. 
    
  29.     def test_flatpage_admin_form_url_validation(self):
    
  30.         "The flatpage admin form correctly validates urls"
    
  31.         self.assertTrue(
    
  32.             FlatpageForm(data=dict(url="/new_flatpage/", **self.form_data)).is_valid()
    
  33.         )
    
  34.         self.assertTrue(
    
  35.             FlatpageForm(
    
  36.                 data=dict(url="/some.special~chars/", **self.form_data)
    
  37.             ).is_valid()
    
  38.         )
    
  39.         self.assertTrue(
    
  40.             FlatpageForm(
    
  41.                 data=dict(url="/some.very_special~chars-here/", **self.form_data)
    
  42.             ).is_valid()
    
  43.         )
    
  44. 
    
  45.         self.assertFalse(
    
  46.             FlatpageForm(data=dict(url="/a space/", **self.form_data)).is_valid()
    
  47.         )
    
  48.         self.assertFalse(
    
  49.             FlatpageForm(data=dict(url="/a % char/", **self.form_data)).is_valid()
    
  50.         )
    
  51.         self.assertFalse(
    
  52.             FlatpageForm(data=dict(url="/a ! char/", **self.form_data)).is_valid()
    
  53.         )
    
  54.         self.assertFalse(
    
  55.             FlatpageForm(data=dict(url="/a & char/", **self.form_data)).is_valid()
    
  56.         )
    
  57.         self.assertFalse(
    
  58.             FlatpageForm(data=dict(url="/a ? char/", **self.form_data)).is_valid()
    
  59.         )
    
  60. 
    
  61.     def test_flatpage_requires_leading_slash(self):
    
  62.         form = FlatpageForm(data=dict(url="no_leading_slash/", **self.form_data))
    
  63.         with translation.override("en"):
    
  64.             self.assertFalse(form.is_valid())
    
  65.             self.assertEqual(form.errors["url"], ["URL is missing a leading slash."])
    
  66. 
    
  67.     @override_settings(
    
  68.         APPEND_SLASH=True, MIDDLEWARE=["django.middleware.common.CommonMiddleware"]
    
  69.     )
    
  70.     def test_flatpage_requires_trailing_slash_with_append_slash(self):
    
  71.         form = FlatpageForm(data=dict(url="/no_trailing_slash", **self.form_data))
    
  72.         with translation.override("en"):
    
  73.             self.assertEqual(
    
  74.                 form.fields["url"].help_text,
    
  75.                 "Example: “/about/contact/”. Make sure to have leading and "
    
  76.                 "trailing slashes.",
    
  77.             )
    
  78.             self.assertFalse(form.is_valid())
    
  79.             self.assertEqual(form.errors["url"], ["URL is missing a trailing slash."])
    
  80. 
    
  81.     @override_settings(
    
  82.         APPEND_SLASH=False, MIDDLEWARE=["django.middleware.common.CommonMiddleware"]
    
  83.     )
    
  84.     def test_flatpage_doesnt_requires_trailing_slash_without_append_slash(self):
    
  85.         form = FlatpageForm(data=dict(url="/no_trailing_slash", **self.form_data))
    
  86.         self.assertTrue(form.is_valid())
    
  87.         with translation.override("en"):
    
  88.             self.assertEqual(
    
  89.                 form.fields["url"].help_text,
    
  90.                 "Example: “/about/contact”. Make sure to have a leading slash.",
    
  91.             )
    
  92. 
    
  93.     def test_flatpage_admin_form_url_uniqueness_validation(self):
    
  94.         """
    
  95.         The flatpage admin form correctly enforces url uniqueness among
    
  96.         flatpages of the same site.
    
  97.         """
    
  98.         data = dict(url="/myflatpage1/", **self.form_data)
    
  99. 
    
  100.         FlatpageForm(data=data).save()
    
  101. 
    
  102.         f = FlatpageForm(data=data)
    
  103. 
    
  104.         with translation.override("en"):
    
  105.             self.assertFalse(f.is_valid())
    
  106. 
    
  107.             self.assertEqual(
    
  108.                 f.errors,
    
  109.                 {
    
  110.                     "__all__": [
    
  111.                         "Flatpage with url /myflatpage1/ already exists for site "
    
  112.                         "example.com"
    
  113.                     ]
    
  114.                 },
    
  115.             )
    
  116. 
    
  117.     def test_flatpage_admin_form_edit(self):
    
  118.         """
    
  119.         Existing flatpages can be edited in the admin form without triggering
    
  120.         the url-uniqueness validation.
    
  121.         """
    
  122.         existing = FlatPage.objects.create(
    
  123.             url="/myflatpage1/", title="Some page", content="The content"
    
  124.         )
    
  125.         existing.sites.add(settings.SITE_ID)
    
  126. 
    
  127.         data = dict(url="/myflatpage1/", **self.form_data)
    
  128. 
    
  129.         f = FlatpageForm(data=data, instance=existing)
    
  130. 
    
  131.         self.assertTrue(f.is_valid(), f.errors)
    
  132. 
    
  133.         updated = f.save()
    
  134. 
    
  135.         self.assertEqual(updated.title, "A test page")
    
  136. 
    
  137.     def test_flatpage_nosites(self):
    
  138.         data = dict(url="/myflatpage1/", **self.form_data)
    
  139.         data.update({"sites": ""})
    
  140. 
    
  141.         f = FlatpageForm(data=data)
    
  142. 
    
  143.         self.assertFalse(f.is_valid())
    
  144. 
    
  145.         self.assertEqual(
    
  146.             f.errors, {"sites": [translation.gettext("This field is required.")]}
    
  147.         )