summaryrefslogtreecommitdiff
path: root/tests/flatpages_tests
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2015-02-09 19:20:39 -0500
committerTim Graham <timograham@gmail.com>2015-02-11 10:19:22 -0500
commitd3a725054fa260e84c788b240fd03cbd0ccc1151 (patch)
tree116b3091e5af5c454aabc8b4c615bfa3f87373c3 /tests/flatpages_tests
parent197dd4b8f12164f6acebb3b959f9ac2040a40400 (diff)
downloaddjango-d3a725054fa260e84c788b240fd03cbd0ccc1151.tar.gz
Moved contrib.flatpages tests out of contrib.
Diffstat (limited to 'tests/flatpages_tests')
-rw-r--r--tests/flatpages_tests/__init__.py0
-rw-r--r--tests/flatpages_tests/fixtures/example_site.json11
-rw-r--r--tests/flatpages_tests/fixtures/sample_flatpages.json63
-rw-r--r--tests/flatpages_tests/settings.py11
-rw-r--r--tests/flatpages_tests/templates/flatpages/default.html9
-rw-r--r--tests/flatpages_tests/templates/registration/login.html0
-rw-r--r--tests/flatpages_tests/test_csrf.py74
-rw-r--r--tests/flatpages_tests/test_forms.py103
-rw-r--r--tests/flatpages_tests/test_middleware.py151
-rw-r--r--tests/flatpages_tests/test_models.py22
-rw-r--r--tests/flatpages_tests/test_sitemaps.py37
-rw-r--r--tests/flatpages_tests/test_templatetags.py131
-rw-r--r--tests/flatpages_tests/test_views.py125
-rw-r--r--tests/flatpages_tests/urls.py13
14 files changed, 750 insertions, 0 deletions
diff --git a/tests/flatpages_tests/__init__.py b/tests/flatpages_tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/flatpages_tests/__init__.py
diff --git a/tests/flatpages_tests/fixtures/example_site.json b/tests/flatpages_tests/fixtures/example_site.json
new file mode 100644
index 0000000000..71aa84de12
--- /dev/null
+++ b/tests/flatpages_tests/fixtures/example_site.json
@@ -0,0 +1,11 @@
+[
+ {
+ "pk": 1,
+ "model": "sites.site",
+ "fields": {
+ "domain": "example.com",
+ "name": "example.com"
+ }
+ }
+]
+
diff --git a/tests/flatpages_tests/fixtures/sample_flatpages.json b/tests/flatpages_tests/fixtures/sample_flatpages.json
new file mode 100644
index 0000000000..885af1eb60
--- /dev/null
+++ b/tests/flatpages_tests/fixtures/sample_flatpages.json
@@ -0,0 +1,63 @@
+[
+ {
+ "pk": 1,
+ "model": "flatpages.flatpage",
+ "fields": {
+ "registration_required": false,
+ "title": "A Flatpage",
+ "url": "/flatpage/",
+ "template_name": "",
+ "sites": [
+ 1
+ ],
+ "content": "Isn't it flat!",
+ "enable_comments": false
+ }
+ },
+ {
+ "pk": 2,
+ "model": "flatpages.flatpage",
+ "fields": {
+ "registration_required": false,
+ "title": "A Nested Flatpage",
+ "url": "/location/flatpage/",
+ "template_name": "",
+ "sites": [
+ 1
+ ],
+ "content": "Isn't it flat and deep!",
+ "enable_comments": false
+ }
+ },
+
+ {
+ "pk": 101,
+ "model": "flatpages.flatpage",
+ "fields": {
+ "registration_required": true,
+ "title": "Sekrit Flatpage",
+ "url": "/sekrit/",
+ "template_name": "",
+ "sites": [
+ 1
+ ],
+ "content": "Isn't it sekrit!",
+ "enable_comments": false
+ }
+ },
+ {
+ "pk": 102,
+ "model": "flatpages.flatpage",
+ "fields": {
+ "registration_required": true,
+ "title": "Sekrit Nested Flatpage",
+ "url": "/location/sekrit/",
+ "template_name": "",
+ "sites": [
+ 1
+ ],
+ "content": "Isn't it sekrit and deep!",
+ "enable_comments": false
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/flatpages_tests/settings.py b/tests/flatpages_tests/settings.py
new file mode 100644
index 0000000000..ad888f9d95
--- /dev/null
+++ b/tests/flatpages_tests/settings.py
@@ -0,0 +1,11 @@
+import os
+
+FLATPAGES_TEMPLATES = [{
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [os.path.join(os.path.dirname(__file__), 'templates')],
+ 'OPTIONS': {
+ 'context_processors': (
+ 'django.contrib.auth.context_processors.auth',
+ ),
+ },
+}]
diff --git a/tests/flatpages_tests/templates/flatpages/default.html b/tests/flatpages_tests/templates/flatpages/default.html
new file mode 100644
index 0000000000..559e3f710f
--- /dev/null
+++ b/tests/flatpages_tests/templates/flatpages/default.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>{{ flatpage.title }}</title>
+</head>
+<body>
+<p>{{ flatpage.content }}</p>
+</body>
+</html>
diff --git a/tests/flatpages_tests/templates/registration/login.html b/tests/flatpages_tests/templates/registration/login.html
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/flatpages_tests/templates/registration/login.html
diff --git a/tests/flatpages_tests/test_csrf.py b/tests/flatpages_tests/test_csrf.py
new file mode 100644
index 0000000000..a3dd8d2cdd
--- /dev/null
+++ b/tests/flatpages_tests/test_csrf.py
@@ -0,0 +1,74 @@
+from django.contrib.auth.models import User
+from django.test import Client, TestCase, modify_settings, override_settings
+
+from .settings import FLATPAGES_TEMPLATES
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ LOGIN_URL='/accounts/login/',
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ CSRF_FAILURE_VIEW='django.views.csrf.csrf_failure',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageCSRFTests(TestCase):
+ fixtures = ['sample_flatpages', 'example_site']
+
+ def setUp(self):
+ self.client = Client(enforce_csrf_checks=True)
+
+ def test_view_flatpage(self):
+ "A flatpage can be served through a view, even when the middleware is in use"
+ response = self.client.get('/flatpage_root/flatpage/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it flat!</p>")
+
+ def test_view_non_existent_flatpage(self):
+ "A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
+ response = self.client.get('/flatpage_root/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_view_authenticated_flatpage(self):
+ "A flatpage served through a view can require authentication"
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
+ User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ self.client.login(username='testuser', password='s3krit')
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it sekrit!</p>")
+
+ def test_fallback_flatpage(self):
+ "A flatpage can be served by the fallback middleware"
+ response = self.client.get('/flatpage/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it flat!</p>")
+
+ def test_fallback_non_existent_flatpage(self):
+ "A non-existent flatpage raises a 404 when served by the fallback middleware"
+ response = self.client.get('/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_post_view_flatpage(self):
+ "POSTing to a flatpage served through a view will raise a CSRF error if no token is provided (Refs #14156)"
+ response = self.client.post('/flatpage_root/flatpage/')
+ self.assertEqual(response.status_code, 403)
+
+ def test_post_fallback_flatpage(self):
+ "POSTing to a flatpage served by the middleware will raise a CSRF error if no token is provided (Refs #14156)"
+ response = self.client.post('/flatpage/')
+ self.assertEqual(response.status_code, 403)
+
+ def test_post_unknown_page(self):
+ "POSTing to an unknown page isn't caught as a 403 CSRF error"
+ response = self.client.post('/no_such_page/')
+ self.assertEqual(response.status_code, 404)
diff --git a/tests/flatpages_tests/test_forms.py b/tests/flatpages_tests/test_forms.py
new file mode 100644
index 0000000000..8f05d8562b
--- /dev/null
+++ b/tests/flatpages_tests/test_forms.py
@@ -0,0 +1,103 @@
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.contrib.flatpages.forms import FlatpageForm
+from django.contrib.flatpages.models import FlatPage
+from django.contrib.sites.models import Site
+from django.test import TestCase, modify_settings, override_settings
+from django.utils import translation
+
+
+@modify_settings(INSTALLED_APPS={'append': ['django.contrib.flatpages', ]})
+@override_settings(SITE_ID=1)
+class FlatpageAdminFormTests(TestCase):
+ fixtures = ['example_site']
+
+ def setUp(self):
+ # Site fields cache needs to be cleared after flatpages is added to
+ # INSTALLED_APPS
+ Site._meta._expire_cache()
+ self.form_data = {
+ 'title': "A test page",
+ 'content': "This is a test",
+ 'sites': [settings.SITE_ID],
+ }
+
+ def test_flatpage_admin_form_url_validation(self):
+ "The flatpage admin form correctly validates urls"
+ self.assertTrue(FlatpageForm(data=dict(url='/new_flatpage/', **self.form_data)).is_valid())
+ self.assertTrue(FlatpageForm(data=dict(url='/some.special~chars/', **self.form_data)).is_valid())
+ self.assertTrue(FlatpageForm(data=dict(url='/some.very_special~chars-here/', **self.form_data)).is_valid())
+
+ self.assertFalse(FlatpageForm(data=dict(url='/a space/', **self.form_data)).is_valid())
+ self.assertFalse(FlatpageForm(data=dict(url='/a % char/', **self.form_data)).is_valid())
+ self.assertFalse(FlatpageForm(data=dict(url='/a ! char/', **self.form_data)).is_valid())
+ self.assertFalse(FlatpageForm(data=dict(url='/a & char/', **self.form_data)).is_valid())
+ self.assertFalse(FlatpageForm(data=dict(url='/a ? char/', **self.form_data)).is_valid())
+
+ def test_flatpage_requires_leading_slash(self):
+ form = FlatpageForm(data=dict(url='no_leading_slash/', **self.form_data))
+ with translation.override('en'):
+ self.assertFalse(form.is_valid())
+ self.assertEqual(form.errors['url'], ["URL is missing a leading slash."])
+
+ @override_settings(APPEND_SLASH=True,
+ MIDDLEWARE_CLASSES=['django.middleware.common.CommonMiddleware'])
+ def test_flatpage_requires_trailing_slash_with_append_slash(self):
+ form = FlatpageForm(data=dict(url='/no_trailing_slash', **self.form_data))
+ with translation.override('en'):
+ self.assertFalse(form.is_valid())
+ self.assertEqual(form.errors['url'], ["URL is missing a trailing slash."])
+
+ @override_settings(APPEND_SLASH=False,
+ MIDDLEWARE_CLASSES=['django.middleware.common.CommonMiddleware'])
+ def test_flatpage_doesnt_requires_trailing_slash_without_append_slash(self):
+ form = FlatpageForm(data=dict(url='/no_trailing_slash', **self.form_data))
+ self.assertTrue(form.is_valid())
+
+ def test_flatpage_admin_form_url_uniqueness_validation(self):
+ "The flatpage admin form correctly enforces url uniqueness among flatpages of the same site"
+ data = dict(url='/myflatpage1/', **self.form_data)
+
+ FlatpageForm(data=data).save()
+
+ f = FlatpageForm(data=data)
+
+ with translation.override('en'):
+ self.assertFalse(f.is_valid())
+
+ self.assertEqual(
+ f.errors,
+ {'__all__': ['Flatpage with url /myflatpage1/ already exists for site example.com']})
+
+ def test_flatpage_admin_form_edit(self):
+ """
+ Existing flatpages can be edited in the admin form without triggering
+ the url-uniqueness validation.
+
+ """
+ existing = FlatPage.objects.create(
+ url="/myflatpage1/", title="Some page", content="The content")
+ existing.sites.add(settings.SITE_ID)
+
+ data = dict(url='/myflatpage1/', **self.form_data)
+
+ f = FlatpageForm(data=data, instance=existing)
+
+ self.assertTrue(f.is_valid(), f.errors)
+
+ updated = f.save()
+
+ self.assertEqual(updated.title, "A test page")
+
+ def test_flatpage_nosites(self):
+ data = dict(url='/myflatpage1/', **self.form_data)
+ data.update({'sites': ''})
+
+ f = FlatpageForm(data=data)
+
+ self.assertFalse(f.is_valid())
+
+ self.assertEqual(
+ f.errors,
+ {'sites': [translation.ugettext('This field is required.')]})
diff --git a/tests/flatpages_tests/test_middleware.py b/tests/flatpages_tests/test_middleware.py
new file mode 100644
index 0000000000..26267036b2
--- /dev/null
+++ b/tests/flatpages_tests/test_middleware.py
@@ -0,0 +1,151 @@
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.flatpages.models import FlatPage
+from django.test import TestCase, modify_settings, override_settings
+
+from .settings import FLATPAGES_TEMPLATES
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ LOGIN_URL='/accounts/login/',
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageMiddlewareTests(TestCase):
+ fixtures = ['sample_flatpages', 'example_site']
+
+ def test_view_flatpage(self):
+ "A flatpage can be served through a view, even when the middleware is in use"
+ response = self.client.get('/flatpage_root/flatpage/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it flat!</p>")
+
+ def test_view_non_existent_flatpage(self):
+ "A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
+ response = self.client.get('/flatpage_root/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_view_authenticated_flatpage(self):
+ "A flatpage served through a view can require authentication"
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
+ User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ self.client.login(username='testuser', password='s3krit')
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it sekrit!</p>")
+
+ def test_fallback_flatpage(self):
+ "A flatpage can be served by the fallback middleware"
+ response = self.client.get('/flatpage/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it flat!</p>")
+
+ def test_fallback_non_existent_flatpage(self):
+ "A non-existent flatpage raises a 404 when served by the fallback middleware"
+ response = self.client.get('/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_fallback_authenticated_flatpage(self):
+ "A flatpage served by the middleware can require authentication"
+ response = self.client.get('/sekrit/')
+ self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
+ User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ self.client.login(username='testuser', password='s3krit')
+ response = self.client.get('/sekrit/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it sekrit!</p>")
+
+ def test_fallback_flatpage_special_chars(self):
+ "A flatpage with special chars in the URL can be served by the fallback middleware"
+ fp = FlatPage.objects.create(
+ url="/some.very_special~chars-here/",
+ title="A very special page",
+ content="Isn't it special!",
+ enable_comments=False,
+ registration_required=False,
+ )
+ fp.sites.add(settings.SITE_ID)
+
+ response = self.client.get('/some.very_special~chars-here/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it special!</p>")
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ APPEND_SLASH=True,
+ LOGIN_URL='/accounts/login/',
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageMiddlewareAppendSlashTests(TestCase):
+ fixtures = ['sample_flatpages', 'example_site']
+
+ def test_redirect_view_flatpage(self):
+ "A flatpage can be served through a view and should add a slash"
+ response = self.client.get('/flatpage_root/flatpage')
+ self.assertRedirects(response, '/flatpage_root/flatpage/', status_code=301)
+
+ def test_redirect_view_non_existent_flatpage(self):
+ "A non-existent flatpage raises 404 when served through a view and should not add a slash"
+ response = self.client.get('/flatpage_root/no_such_flatpage')
+ self.assertEqual(response.status_code, 404)
+
+ def test_redirect_fallback_flatpage(self):
+ "A flatpage can be served by the fallback middleware and should add a slash"
+ response = self.client.get('/flatpage')
+ self.assertRedirects(response, '/flatpage/', status_code=301)
+
+ def test_redirect_fallback_non_existent_flatpage(self):
+ "A non-existent flatpage raises a 404 when served by the fallback middleware and should not add a slash"
+ response = self.client.get('/no_such_flatpage')
+ self.assertEqual(response.status_code, 404)
+
+ def test_redirect_fallback_flatpage_special_chars(self):
+ "A flatpage with special chars in the URL can be served by the fallback middleware and should add a slash"
+ fp = FlatPage.objects.create(
+ url="/some.very_special~chars-here/",
+ title="A very special page",
+ content="Isn't it special!",
+ enable_comments=False,
+ registration_required=False,
+ )
+ fp.sites.add(settings.SITE_ID)
+
+ response = self.client.get('/some.very_special~chars-here')
+ self.assertRedirects(response, '/some.very_special~chars-here/', status_code=301)
+
+ def test_redirect_fallback_flatpage_root(self):
+ "A flatpage at / should not cause a redirect loop when APPEND_SLASH is set"
+ fp = FlatPage.objects.create(
+ url="/",
+ title="Root",
+ content="Root",
+ enable_comments=False,
+ registration_required=False,
+ )
+ fp.sites.add(settings.SITE_ID)
+
+ response = self.client.get('/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Root</p>")
diff --git a/tests/flatpages_tests/test_models.py b/tests/flatpages_tests/test_models.py
new file mode 100644
index 0000000000..c48dc38637
--- /dev/null
+++ b/tests/flatpages_tests/test_models.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import unicode_literals
+
+from django.contrib.flatpages.models import FlatPage
+from django.core.urlresolvers import clear_script_prefix, set_script_prefix
+from django.test import TestCase
+
+
+class FlatpageModelTests(TestCase):
+
+ def test_get_absolute_url_urlencodes(self):
+ pf = FlatPage(title="Café!", url='/café/')
+ self.assertEqual(pf.get_absolute_url(), '/caf%C3%A9/')
+
+ def test_get_absolute_url_honors_script_prefix(self):
+ pf = FlatPage(title="Tea!", url='/tea/')
+ set_script_prefix('/beverages/')
+ try:
+ self.assertEqual(pf.get_absolute_url(), '/beverages/tea/')
+ finally:
+ clear_script_prefix()
diff --git a/tests/flatpages_tests/test_sitemaps.py b/tests/flatpages_tests/test_sitemaps.py
new file mode 100644
index 0000000000..5be4fe518a
--- /dev/null
+++ b/tests/flatpages_tests/test_sitemaps.py
@@ -0,0 +1,37 @@
+from __future__ import unicode_literals
+
+from django.apps import apps
+from django.contrib.sites.models import Site
+from django.test import TestCase
+from django.test.utils import modify_settings, override_settings
+
+
+@override_settings(
+ ROOT_URLCONF='flatpages_tests.urls',
+ SITE_ID=1,
+)
+@modify_settings(
+ INSTALLED_APPS={
+ 'append': ['django.contrib.sitemaps', 'django.contrib.flatpages'],
+ },
+)
+class FlatpagesSitemapTests(TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ super(FlatpagesSitemapTests, cls).setUpClass()
+ # This cleanup is necessary because contrib.sites cache
+ # makes tests interfere with each other, see #11505
+ Site.objects.clear_cache()
+
+ @classmethod
+ def setUpTestData(cls):
+ Site = apps.get_model('sites.Site')
+ current_site = Site.objects.get_current()
+ current_site.flatpage_set.create(url="/foo/", title="foo")
+ current_site.flatpage_set.create(url="/private-foo/", title="private foo", registration_required=True)
+
+ def test_flatpage_sitemap(self):
+ response = self.client.get('/flatpages/sitemap.xml')
+ self.assertIn(b'<url><loc>http://example.com/foo/</loc></url>', response.getvalue())
+ self.assertNotIn(b'<url><loc>http://example.com/private-foo/</loc></url>', response.getvalue())
diff --git a/tests/flatpages_tests/test_templatetags.py b/tests/flatpages_tests/test_templatetags.py
new file mode 100644
index 0000000000..de88890e11
--- /dev/null
+++ b/tests/flatpages_tests/test_templatetags.py
@@ -0,0 +1,131 @@
+from django.contrib.auth.models import AnonymousUser, User
+from django.template import Context, Template, TemplateSyntaxError
+from django.test import TestCase, modify_settings, override_settings
+
+from .settings import FLATPAGES_TEMPLATES
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageTemplateTagTests(TestCase):
+ fixtures = ['sample_flatpages']
+
+ def test_get_flatpages_tag(self):
+ "The flatpage template tag retrives unregistered prefixed flatpages by default"
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages as flatpages %}"
+ "{% for page in flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context())
+ self.assertEqual(out, "A Flatpage,A Nested Flatpage,")
+
+ def test_get_flatpages_tag_for_anon_user(self):
+ "The flatpage template tag retrives unregistered flatpages for an anonymous user"
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages for anonuser as flatpages %}"
+ "{% for page in flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context({
+ 'anonuser': AnonymousUser()
+ }))
+ self.assertEqual(out, "A Flatpage,A Nested Flatpage,")
+
+ def test_get_flatpages_tag_for_user(self):
+ "The flatpage template tag retrives all flatpages for an authenticated user"
+ me = User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages for me as flatpages %}"
+ "{% for page in flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context({
+ 'me': me
+ }))
+ self.assertEqual(out, "A Flatpage,A Nested Flatpage,Sekrit Nested Flatpage,Sekrit Flatpage,")
+
+ def test_get_flatpages_with_prefix(self):
+ "The flatpage template tag retrives unregistered prefixed flatpages by default"
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages '/location/' as location_flatpages %}"
+ "{% for page in location_flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context())
+ self.assertEqual(out, "A Nested Flatpage,")
+
+ def test_get_flatpages_with_prefix_for_anon_user(self):
+ "The flatpage template tag retrives unregistered prefixed flatpages for an anonymous user"
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages '/location/' for anonuser as location_flatpages %}"
+ "{% for page in location_flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context({
+ 'anonuser': AnonymousUser()
+ }))
+ self.assertEqual(out, "A Nested Flatpage,")
+
+ def test_get_flatpages_with_prefix_for_user(self):
+ "The flatpage template tag retrieve prefixed flatpages for an authenticated user"
+ me = User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages '/location/' for me as location_flatpages %}"
+ "{% for page in location_flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context({
+ 'me': me
+ }))
+ self.assertEqual(out, "A Nested Flatpage,Sekrit Nested Flatpage,")
+
+ def test_get_flatpages_with_variable_prefix(self):
+ "The prefix for the flatpage template tag can be a template variable"
+ out = Template(
+ "{% load flatpages %}"
+ "{% get_flatpages location_prefix as location_flatpages %}"
+ "{% for page in location_flatpages %}"
+ "{{ page.title }},"
+ "{% endfor %}"
+ ).render(Context({
+ 'location_prefix': '/location/'
+ }))
+ self.assertEqual(out, "A Nested Flatpage,")
+
+ def test_parsing_errors(self):
+ "There are various ways that the flatpages template tag won't parse"
+ render = lambda t: Template(t).render(Context())
+
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages as %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages cheesecake flatpages %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages as flatpages asdf %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages cheesecake user as flatpages %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages for user as flatpages asdf %}")
+ self.assertRaises(TemplateSyntaxError, render,
+ "{% load flatpages %}{% get_flatpages prefix for user as flatpages asdf %}")
diff --git a/tests/flatpages_tests/test_views.py b/tests/flatpages_tests/test_views.py
new file mode 100644
index 0000000000..7582a7284a
--- /dev/null
+++ b/tests/flatpages_tests/test_views.py
@@ -0,0 +1,125 @@
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.flatpages.models import FlatPage
+from django.test import TestCase, modify_settings, override_settings
+
+from .settings import FLATPAGES_TEMPLATES
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ LOGIN_URL='/accounts/login/',
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ # no 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageViewTests(TestCase):
+ fixtures = ['sample_flatpages', 'example_site']
+
+ def test_view_flatpage(self):
+ "A flatpage can be served through a view"
+ response = self.client.get('/flatpage_root/flatpage/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it flat!</p>")
+
+ def test_view_non_existent_flatpage(self):
+ "A non-existent flatpage raises 404 when served through a view"
+ response = self.client.get('/flatpage_root/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_view_authenticated_flatpage(self):
+ "A flatpage served through a view can require authentication"
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
+ User.objects.create_user('testuser', 'test@example.com', 's3krit')
+ self.client.login(username='testuser', password='s3krit')
+ response = self.client.get('/flatpage_root/sekrit/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it sekrit!</p>")
+
+ def test_fallback_flatpage(self):
+ "A fallback flatpage won't be served if the middleware is disabled"
+ response = self.client.get('/flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_fallback_non_existent_flatpage(self):
+ "A non-existent flatpage won't be served if the fallback middleware is disabled"
+ response = self.client.get('/no_such_flatpage/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_view_flatpage_special_chars(self):
+ "A flatpage with special chars in the URL can be served through a view"
+ fp = FlatPage.objects.create(
+ url="/some.very_special~chars-here/",
+ title="A very special page",
+ content="Isn't it special!",
+ enable_comments=False,
+ registration_required=False,
+ )
+ fp.sites.add(settings.SITE_ID)
+
+ response = self.client.get('/flatpage_root/some.very_special~chars-here/')
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "<p>Isn't it special!</p>")
+
+
+@modify_settings(INSTALLED_APPS={'append': 'django.contrib.flatpages'})
+@override_settings(
+ APPEND_SLASH=True,
+ LOGIN_URL='/accounts/login/',
+ MIDDLEWARE_CLASSES=[
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ # no 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
+ ],
+ ROOT_URLCONF='flatpages_tests.urls',
+ TEMPLATES=FLATPAGES_TEMPLATES,
+ SITE_ID=1,
+)
+class FlatpageViewAppendSlashTests(TestCase):
+ fixtures = ['sample_flatpages', 'example_site']
+
+ def test_redirect_view_flatpage(self):
+ "A flatpage can be served through a view and should add a slash"
+ response = self.client.get('/flatpage_root/flatpage')
+ self.assertRedirects(response, '/flatpage_root/flatpage/', status_code=301)
+
+ def test_redirect_view_non_existent_flatpage(self):
+ "A non-existent flatpage raises 404 when served through a view and should not add a slash"
+ response = self.client.get('/flatpage_root/no_such_flatpage')
+ self.assertEqual(response.status_code, 404)
+
+ def test_redirect_fallback_flatpage(self):
+ "A fallback flatpage won't be served if the middleware is disabled and should not add a slash"
+ response = self.client.get('/flatpage')
+ self.assertEqual(response.status_code, 404)
+
+ def test_redirect_fallback_non_existent_flatpage(self):
+ "A non-existent flatpage won't be served if the fallback middleware is disabled and should not add a slash"
+ response = self.client.get('/no_such_flatpage')
+ self.assertEqual(response.status_code, 404)
+
+ def test_redirect_view_flatpage_special_chars(self):
+ "A flatpage with special chars in the URL can be served through a view and should add a slash"
+ fp = FlatPage.objects.create(
+ url="/some.very_special~chars-here/",
+ title="A very special page",
+ content="Isn't it special!",
+ enable_comments=False,
+ registration_required=False,
+ )
+ fp.sites.add(settings.SITE_ID)
+
+ response = self.client.get('/flatpage_root/some.very_special~chars-here')
+ self.assertRedirects(response, '/flatpage_root/some.very_special~chars-here/', status_code=301)
diff --git a/tests/flatpages_tests/urls.py b/tests/flatpages_tests/urls.py
new file mode 100644
index 0000000000..5b2c576b14
--- /dev/null
+++ b/tests/flatpages_tests/urls.py
@@ -0,0 +1,13 @@
+from django.conf.urls import include, url
+from django.contrib.flatpages.sitemaps import FlatPageSitemap
+from django.contrib.sitemaps import views
+
+# special urls for flatpage test cases
+urlpatterns = [
+ url(r'^flatpages/sitemap\.xml$', views.sitemap,
+ {'sitemaps': {'flatpages': FlatPageSitemap}},
+ name='django.contrib.sitemaps.views.sitemap'),
+
+ url(r'^flatpage_root', include('django.contrib.flatpages.urls')),
+ url(r'^accounts/', include('django.contrib.auth.urls')),
+]