tests.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django import http
  2. from django.conf import settings
  3. from django.contrib.redirects.middleware import RedirectFallbackMiddleware
  4. from django.contrib.redirects.models import Redirect
  5. from django.contrib.sites.models import Site
  6. from django.core.exceptions import ImproperlyConfigured
  7. from django.test import TestCase, modify_settings, override_settings
  8. from django.utils import six
  9. @modify_settings(MIDDLEWARE={'append': 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'})
  10. @override_settings(APPEND_SLASH=False, SITE_ID=1)
  11. class RedirectTests(TestCase):
  12. def setUp(self):
  13. self.site = Site.objects.get(pk=settings.SITE_ID)
  14. def test_model(self):
  15. r1 = Redirect.objects.create(site=self.site, old_path='/initial', new_path='/new_target')
  16. self.assertEqual(six.text_type(r1), "/initial ---> /new_target")
  17. def test_redirect(self):
  18. Redirect.objects.create(site=self.site, old_path='/initial', new_path='/new_target')
  19. response = self.client.get('/initial')
  20. self.assertRedirects(response, '/new_target', status_code=301, target_status_code=404)
  21. @override_settings(APPEND_SLASH=True)
  22. def test_redirect_with_append_slash(self):
  23. Redirect.objects.create(site=self.site, old_path='/initial/', new_path='/new_target/')
  24. response = self.client.get('/initial')
  25. self.assertRedirects(response, '/new_target/', status_code=301, target_status_code=404)
  26. @override_settings(APPEND_SLASH=True)
  27. def test_redirect_with_append_slash_and_query_string(self):
  28. Redirect.objects.create(site=self.site, old_path='/initial/?foo', new_path='/new_target/')
  29. response = self.client.get('/initial?foo')
  30. self.assertRedirects(response, '/new_target/', status_code=301, target_status_code=404)
  31. def test_response_gone(self):
  32. """When the redirect target is '', return a 410"""
  33. Redirect.objects.create(site=self.site, old_path='/initial', new_path='')
  34. response = self.client.get('/initial')
  35. self.assertEqual(response.status_code, 410)
  36. @modify_settings(INSTALLED_APPS={'remove': 'django.contrib.sites'})
  37. def test_sites_not_installed(self):
  38. with self.assertRaises(ImproperlyConfigured):
  39. RedirectFallbackMiddleware()
  40. class OverriddenRedirectFallbackMiddleware(RedirectFallbackMiddleware):
  41. # Use HTTP responses different from the defaults
  42. response_gone_class = http.HttpResponseForbidden
  43. response_redirect_class = http.HttpResponseRedirect
  44. @modify_settings(MIDDLEWARE={'append': 'redirects_tests.tests.OverriddenRedirectFallbackMiddleware'})
  45. @override_settings(SITE_ID=1)
  46. class OverriddenRedirectMiddlewareTests(TestCase):
  47. def setUp(self):
  48. self.site = Site.objects.get(pk=settings.SITE_ID)
  49. def test_response_gone_class(self):
  50. Redirect.objects.create(site=self.site, old_path='/initial/', new_path='')
  51. response = self.client.get('/initial/')
  52. self.assertEqual(response.status_code, 403)
  53. def test_response_redirect_class(self):
  54. Redirect.objects.create(site=self.site, old_path='/initial/', new_path='/new_target/')
  55. response = self.client.get('/initial/')
  56. self.assertEqual(response.status_code, 302)