From d3a725054fa260e84c788b240fd03cbd0ccc1151 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Mon, 9 Feb 2015 19:20:39 -0500 Subject: Moved contrib.flatpages tests out of contrib. --- MANIFEST.in | 2 - .../contrib/flatpages/fixtures/example_site.json | 11 -- .../flatpages/fixtures/sample_flatpages.json | 63 --------- django/contrib/flatpages/tests/__init__.py | 0 django/contrib/flatpages/tests/settings.py | 11 -- django/contrib/flatpages/tests/templates/404.html | 1 - .../tests/templates/flatpages/default.html | 9 -- .../tests/templates/registration/login.html | 0 django/contrib/flatpages/tests/test_csrf.py | 75 ---------- django/contrib/flatpages/tests/test_forms.py | 98 ------------- django/contrib/flatpages/tests/test_middleware.py | 152 --------------------- django/contrib/flatpages/tests/test_models.py | 22 --- django/contrib/flatpages/tests/test_sitemaps.py | 33 ----- .../contrib/flatpages/tests/test_templatetags.py | 133 ------------------ django/contrib/flatpages/tests/test_views.py | 125 ----------------- django/contrib/flatpages/tests/urls.py | 13 -- tests/flatpages_tests/__init__.py | 0 tests/flatpages_tests/fixtures/example_site.json | 11 ++ .../flatpages_tests/fixtures/sample_flatpages.json | 63 +++++++++ tests/flatpages_tests/settings.py | 11 ++ .../templates/flatpages/default.html | 9 ++ .../templates/registration/login.html | 0 tests/flatpages_tests/test_csrf.py | 74 ++++++++++ tests/flatpages_tests/test_forms.py | 103 ++++++++++++++ tests/flatpages_tests/test_middleware.py | 151 ++++++++++++++++++++ tests/flatpages_tests/test_models.py | 22 +++ tests/flatpages_tests/test_sitemaps.py | 37 +++++ tests/flatpages_tests/test_templatetags.py | 131 ++++++++++++++++++ tests/flatpages_tests/test_views.py | 125 +++++++++++++++++ tests/flatpages_tests/urls.py | 13 ++ tests/runtests.py | 12 ++ 31 files changed, 762 insertions(+), 748 deletions(-) delete mode 100644 django/contrib/flatpages/fixtures/example_site.json delete mode 100644 django/contrib/flatpages/fixtures/sample_flatpages.json delete mode 100644 django/contrib/flatpages/tests/__init__.py delete mode 100644 django/contrib/flatpages/tests/settings.py delete mode 100644 django/contrib/flatpages/tests/templates/404.html delete mode 100644 django/contrib/flatpages/tests/templates/flatpages/default.html delete mode 100644 django/contrib/flatpages/tests/templates/registration/login.html delete mode 100644 django/contrib/flatpages/tests/test_csrf.py delete mode 100644 django/contrib/flatpages/tests/test_forms.py delete mode 100644 django/contrib/flatpages/tests/test_middleware.py delete mode 100644 django/contrib/flatpages/tests/test_models.py delete mode 100644 django/contrib/flatpages/tests/test_sitemaps.py delete mode 100644 django/contrib/flatpages/tests/test_templatetags.py delete mode 100644 django/contrib/flatpages/tests/test_views.py delete mode 100644 django/contrib/flatpages/tests/urls.py create mode 100644 tests/flatpages_tests/__init__.py create mode 100644 tests/flatpages_tests/fixtures/example_site.json create mode 100644 tests/flatpages_tests/fixtures/sample_flatpages.json create mode 100644 tests/flatpages_tests/settings.py create mode 100644 tests/flatpages_tests/templates/flatpages/default.html create mode 100644 tests/flatpages_tests/templates/registration/login.html create mode 100644 tests/flatpages_tests/test_csrf.py create mode 100644 tests/flatpages_tests/test_forms.py create mode 100644 tests/flatpages_tests/test_middleware.py create mode 100644 tests/flatpages_tests/test_models.py create mode 100644 tests/flatpages_tests/test_sitemaps.py create mode 100644 tests/flatpages_tests/test_templatetags.py create mode 100644 tests/flatpages_tests/test_views.py create mode 100644 tests/flatpages_tests/urls.py diff --git a/MANIFEST.in b/MANIFEST.in index be49755e0f..03464ceff1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -21,8 +21,6 @@ recursive-include django/contrib/admindocs/templates * recursive-include django/contrib/auth/fixtures * recursive-include django/contrib/auth/templates * recursive-include django/contrib/auth/tests/templates * -recursive-include django/contrib/flatpages/fixtures * -recursive-include django/contrib/flatpages/tests/templates * recursive-include django/contrib/gis/gdal/tests/data * recursive-include django/contrib/gis/static * recursive-include django/contrib/gis/templates * diff --git a/django/contrib/flatpages/fixtures/example_site.json b/django/contrib/flatpages/fixtures/example_site.json deleted file mode 100644 index 71aa84de12..0000000000 --- a/django/contrib/flatpages/fixtures/example_site.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "pk": 1, - "model": "sites.site", - "fields": { - "domain": "example.com", - "name": "example.com" - } - } -] - diff --git a/django/contrib/flatpages/fixtures/sample_flatpages.json b/django/contrib/flatpages/fixtures/sample_flatpages.json deleted file mode 100644 index 885af1eb60..0000000000 --- a/django/contrib/flatpages/fixtures/sample_flatpages.json +++ /dev/null @@ -1,63 +0,0 @@ -[ - { - "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/django/contrib/flatpages/tests/__init__.py b/django/contrib/flatpages/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/django/contrib/flatpages/tests/settings.py b/django/contrib/flatpages/tests/settings.py deleted file mode 100644 index ad888f9d95..0000000000 --- a/django/contrib/flatpages/tests/settings.py +++ /dev/null @@ -1,11 +0,0 @@ -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/django/contrib/flatpages/tests/templates/404.html b/django/contrib/flatpages/tests/templates/404.html deleted file mode 100644 index cbfff0cf2f..0000000000 --- a/django/contrib/flatpages/tests/templates/404.html +++ /dev/null @@ -1 +0,0 @@ -

Oh Noes!

diff --git a/django/contrib/flatpages/tests/templates/flatpages/default.html b/django/contrib/flatpages/tests/templates/flatpages/default.html deleted file mode 100644 index 559e3f710f..0000000000 --- a/django/contrib/flatpages/tests/templates/flatpages/default.html +++ /dev/null @@ -1,9 +0,0 @@ - - - -{{ flatpage.title }} - - -

{{ flatpage.content }}

- - diff --git a/django/contrib/flatpages/tests/templates/registration/login.html b/django/contrib/flatpages/tests/templates/registration/login.html deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/django/contrib/flatpages/tests/test_csrf.py b/django/contrib/flatpages/tests/test_csrf.py deleted file mode 100644 index f8616b3913..0000000000 --- a/django/contrib/flatpages/tests/test_csrf.py +++ /dev/null @@ -1,75 +0,0 @@ -from django.contrib.auth.models import User -from django.contrib.auth.tests.utils import skipIfCustomUser -from django.test import Client, TestCase, override_settings - -from .settings import FLATPAGES_TEMPLATES - - -@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='django.contrib.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, "

Isn't it flat!

") - - 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) - - @skipIfCustomUser - 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, "

Isn't it sekrit!

") - - 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, "

Isn't it flat!

") - - 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/django/contrib/flatpages/tests/test_forms.py b/django/contrib/flatpages/tests/test_forms.py deleted file mode 100644 index 09f500c6ae..0000000000 --- a/django/contrib/flatpages/tests/test_forms.py +++ /dev/null @@ -1,98 +0,0 @@ -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.test import TestCase, override_settings -from django.utils import translation - - -@override_settings(SITE_ID=1) -class FlatpageAdminFormTests(TestCase): - fixtures = ['example_site'] - - def setUp(self): - 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/django/contrib/flatpages/tests/test_middleware.py b/django/contrib/flatpages/tests/test_middleware.py deleted file mode 100644 index f132aa07ac..0000000000 --- a/django/contrib/flatpages/tests/test_middleware.py +++ /dev/null @@ -1,152 +0,0 @@ -from django.conf import settings -from django.contrib.auth.models import User -from django.contrib.auth.tests.utils import skipIfCustomUser -from django.contrib.flatpages.models import FlatPage -from django.test import TestCase, override_settings - -from .settings import FLATPAGES_TEMPLATES - - -@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='django.contrib.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, "

Isn't it flat!

") - - 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) - - @skipIfCustomUser - 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, "

Isn't it sekrit!

") - - 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, "

Isn't it flat!

") - - 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) - - @skipIfCustomUser - 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, "

Isn't it sekrit!

") - - 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, "

Isn't it special!

") - - -@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='django.contrib.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, "

Root

") diff --git a/django/contrib/flatpages/tests/test_models.py b/django/contrib/flatpages/tests/test_models.py deleted file mode 100644 index c48dc38637..0000000000 --- a/django/contrib/flatpages/tests/test_models.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- 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/django/contrib/flatpages/tests/test_sitemaps.py b/django/contrib/flatpages/tests/test_sitemaps.py deleted file mode 100644 index dcfbef4e29..0000000000 --- a/django/contrib/flatpages/tests/test_sitemaps.py +++ /dev/null @@ -1,33 +0,0 @@ -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='django.contrib.flatpages.tests.urls', - SITE_ID=1, -) -@modify_settings(INSTALLED_APPS={'append': ['django.contrib.sitemaps']},) -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'http://example.com/foo/', response.getvalue()) - self.assertNotIn(b'http://example.com/private-foo/', response.getvalue()) diff --git a/django/contrib/flatpages/tests/test_templatetags.py b/django/contrib/flatpages/tests/test_templatetags.py deleted file mode 100644 index 209332b79c..0000000000 --- a/django/contrib/flatpages/tests/test_templatetags.py +++ /dev/null @@ -1,133 +0,0 @@ -from django.contrib.auth.models import AnonymousUser, User -from django.contrib.auth.tests.utils import skipIfCustomUser -from django.template import Context, Template, TemplateSyntaxError -from django.test import TestCase, override_settings - -from .settings import FLATPAGES_TEMPLATES - - -@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='django.contrib.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,") - - @skipIfCustomUser - 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,") - - @skipIfCustomUser - 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/django/contrib/flatpages/tests/test_views.py b/django/contrib/flatpages/tests/test_views.py deleted file mode 100644 index 26c071c311..0000000000 --- a/django/contrib/flatpages/tests/test_views.py +++ /dev/null @@ -1,125 +0,0 @@ -from django.conf import settings -from django.contrib.auth.models import User -from django.contrib.auth.tests.utils import skipIfCustomUser -from django.contrib.flatpages.models import FlatPage -from django.test import TestCase, override_settings - -from .settings import FLATPAGES_TEMPLATES - - -@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='django.contrib.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, "

Isn't it flat!

") - - 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) - - @skipIfCustomUser - 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, "

Isn't it sekrit!

") - - 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, "

Isn't it special!

") - - -@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='django.contrib.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/django/contrib/flatpages/tests/urls.py b/django/contrib/flatpages/tests/urls.py deleted file mode 100644 index 5b2c576b14..0000000000 --- a/django/contrib/flatpages/tests/urls.py +++ /dev/null @@ -1,13 +0,0 @@ -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')), -] diff --git a/tests/flatpages_tests/__init__.py b/tests/flatpages_tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 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 @@ + + + +{{ flatpage.title }} + + +

{{ flatpage.content }}

+ + 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 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, "

Isn't it flat!

") + + 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, "

Isn't it sekrit!

") + + 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, "

Isn't it flat!

") + + 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, "

Isn't it flat!

") + + 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, "

Isn't it sekrit!

") + + 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, "

Isn't it flat!

") + + 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, "

Isn't it sekrit!

") + + 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, "

Isn't it special!

") + + +@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, "

Root

") 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'http://example.com/foo/', response.getvalue()) + self.assertNotIn(b'http://example.com/private-foo/', 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, "

Isn't it flat!

") + + 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, "

Isn't it sekrit!

") + + 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, "

Isn't it special!

") + + +@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')), +] diff --git a/tests/runtests.py b/tests/runtests.py index fe3049dfa4..1bb3c5699e 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -60,6 +60,14 @@ ALWAYS_MIDDLEWARE_CLASSES = [ 'django.contrib.messages.middleware.MessageMiddleware', ] +# Need to add the associated contrib app to INSTALLED_APPS in some cases to +# avoid "RuntimeError: Model class X doesn't declare an explicit app_label +# and either isn't in an application in INSTALLED_APPS or else was imported +# before its application was loaded." +CONTRIB_TESTS_TO_APPS = { + 'flatpages_tests': 'django.contrib.flatpages', +} + def get_test_modules(): modules = [] @@ -140,6 +148,7 @@ def setup(verbosity, test_labels): # us skip creating migrations for the test models. 'auth': 'django.contrib.auth.tests.migrations', 'contenttypes': 'django.contrib.contenttypes.tests.migrations', + 'flatpages_tests': 'django.contrib.flatpages.migrations', } if verbosity > 0: @@ -189,6 +198,9 @@ def setup(verbosity, test_labels): module_label == label or module_label.startswith(label + '.') for label in test_labels_set) + if module_name in CONTRIB_TESTS_TO_APPS and module_found_in_labels: + settings.INSTALLED_APPS.append(CONTRIB_TESTS_TO_APPS[module_name]) + if module_found_in_labels and module_label not in installed_app_names: if verbosity >= 2: print("Importing application %s" % module_name) -- cgit v1.2.1