test_middleware.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import os
  2. from django.conf import settings
  3. from django.contrib.auth.models import User
  4. from django.contrib.auth.tests.utils import skipIfCustomUser
  5. from django.contrib.flatpages.models import FlatPage
  6. from django.test import TestCase, override_settings
  7. @override_settings(
  8. LOGIN_URL='/accounts/login/',
  9. MIDDLEWARE_CLASSES=(
  10. 'django.middleware.common.CommonMiddleware',
  11. 'django.contrib.sessions.middleware.SessionMiddleware',
  12. 'django.middleware.csrf.CsrfViewMiddleware',
  13. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  14. 'django.contrib.messages.middleware.MessageMiddleware',
  15. 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
  16. ),
  17. TEMPLATE_DIRS=(
  18. os.path.join(os.path.dirname(__file__), 'templates'),
  19. ),
  20. SITE_ID=1,
  21. )
  22. class FlatpageMiddlewareTests(TestCase):
  23. fixtures = ['sample_flatpages', 'example_site']
  24. urls = 'django.contrib.flatpages.tests.urls'
  25. def test_view_flatpage(self):
  26. "A flatpage can be served through a view, even when the middleware is in use"
  27. response = self.client.get('/flatpage_root/flatpage/')
  28. self.assertEqual(response.status_code, 200)
  29. self.assertContains(response, "<p>Isn't it flat!</p>")
  30. def test_view_non_existent_flatpage(self):
  31. "A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
  32. response = self.client.get('/flatpage_root/no_such_flatpage/')
  33. self.assertEqual(response.status_code, 404)
  34. @skipIfCustomUser
  35. def test_view_authenticated_flatpage(self):
  36. "A flatpage served through a view can require authentication"
  37. response = self.client.get('/flatpage_root/sekrit/')
  38. self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
  39. User.objects.create_user('testuser', 'test@example.com', 's3krit')
  40. self.client.login(username='testuser', password='s3krit')
  41. response = self.client.get('/flatpage_root/sekrit/')
  42. self.assertEqual(response.status_code, 200)
  43. self.assertContains(response, "<p>Isn't it sekrit!</p>")
  44. def test_fallback_flatpage(self):
  45. "A flatpage can be served by the fallback middleware"
  46. response = self.client.get('/flatpage/')
  47. self.assertEqual(response.status_code, 200)
  48. self.assertContains(response, "<p>Isn't it flat!</p>")
  49. def test_fallback_non_existent_flatpage(self):
  50. "A non-existent flatpage raises a 404 when served by the fallback middleware"
  51. response = self.client.get('/no_such_flatpage/')
  52. self.assertEqual(response.status_code, 404)
  53. @skipIfCustomUser
  54. def test_fallback_authenticated_flatpage(self):
  55. "A flatpage served by the middleware can require authentication"
  56. response = self.client.get('/sekrit/')
  57. self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
  58. User.objects.create_user('testuser', 'test@example.com', 's3krit')
  59. self.client.login(username='testuser', password='s3krit')
  60. response = self.client.get('/sekrit/')
  61. self.assertEqual(response.status_code, 200)
  62. self.assertContains(response, "<p>Isn't it sekrit!</p>")
  63. def test_fallback_flatpage_special_chars(self):
  64. "A flatpage with special chars in the URL can be served by the fallback middleware"
  65. fp = FlatPage.objects.create(
  66. url="/some.very_special~chars-here/",
  67. title="A very special page",
  68. content="Isn't it special!",
  69. enable_comments=False,
  70. registration_required=False,
  71. )
  72. fp.sites.add(settings.SITE_ID)
  73. response = self.client.get('/some.very_special~chars-here/')
  74. self.assertEqual(response.status_code, 200)
  75. self.assertContains(response, "<p>Isn't it special!</p>")
  76. @override_settings(
  77. APPEND_SLASH=True,
  78. LOGIN_URL='/accounts/login/',
  79. MIDDLEWARE_CLASSES=(
  80. 'django.middleware.common.CommonMiddleware',
  81. 'django.contrib.sessions.middleware.SessionMiddleware',
  82. 'django.middleware.csrf.CsrfViewMiddleware',
  83. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  84. 'django.contrib.messages.middleware.MessageMiddleware',
  85. 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
  86. ),
  87. TEMPLATE_DIRS=(
  88. os.path.join(os.path.dirname(__file__), 'templates'),
  89. ),
  90. SITE_ID=1,
  91. )
  92. class FlatpageMiddlewareAppendSlashTests(TestCase):
  93. fixtures = ['sample_flatpages', 'example_site']
  94. urls = 'django.contrib.flatpages.tests.urls'
  95. def test_redirect_view_flatpage(self):
  96. "A flatpage can be served through a view and should add a slash"
  97. response = self.client.get('/flatpage_root/flatpage')
  98. self.assertRedirects(response, '/flatpage_root/flatpage/', status_code=301)
  99. def test_redirect_view_non_existent_flatpage(self):
  100. "A non-existent flatpage raises 404 when served through a view and should not add a slash"
  101. response = self.client.get('/flatpage_root/no_such_flatpage')
  102. self.assertEqual(response.status_code, 404)
  103. def test_redirect_fallback_flatpage(self):
  104. "A flatpage can be served by the fallback middleware and should add a slash"
  105. response = self.client.get('/flatpage')
  106. self.assertRedirects(response, '/flatpage/', status_code=301)
  107. def test_redirect_fallback_non_existent_flatpage(self):
  108. "A non-existent flatpage raises a 404 when served by the fallback middleware and should not add a slash"
  109. response = self.client.get('/no_such_flatpage')
  110. self.assertEqual(response.status_code, 404)
  111. def test_redirect_fallback_flatpage_special_chars(self):
  112. "A flatpage with special chars in the URL can be served by the fallback middleware and should add a slash"
  113. fp = FlatPage.objects.create(
  114. url="/some.very_special~chars-here/",
  115. title="A very special page",
  116. content="Isn't it special!",
  117. enable_comments=False,
  118. registration_required=False,
  119. )
  120. fp.sites.add(settings.SITE_ID)
  121. response = self.client.get('/some.very_special~chars-here')
  122. self.assertRedirects(response, '/some.very_special~chars-here/', status_code=301)
  123. def test_redirect_fallback_flatpage_root(self):
  124. "A flatpage at / should not cause a redirect loop when APPEND_SLASH is set"
  125. fp = FlatPage.objects.create(
  126. url="/",
  127. title="Root",
  128. content="Root",
  129. enable_comments=False,
  130. registration_required=False,
  131. )
  132. fp.sites.add(settings.SITE_ID)
  133. response = self.client.get('/')
  134. self.assertEqual(response.status_code, 200)
  135. self.assertContains(response, "<p>Root</p>")