# -*- coding: utf-8 -*- from django.conf import settings from django.http import HttpRequest from django.middleware.common import CommonMiddleware from django.test import TestCase class CommonMiddlewareTest(TestCase): def setUp(self): self.slash = settings.APPEND_SLASH self.www = settings.PREPEND_WWW def tearDown(self): settings.APPEND_SLASH = self.slash settings.PREPEND_WWW = self.www def _get_request(self, path): request = HttpRequest() request.META = { 'SERVER_NAME': 'testserver', 'SERVER_PORT': 80, } request.path = request.path_info = "/middleware/%s" % path return request def test_append_slash_have_slash(self): """ Tests that URLs with slashes go unmolested. """ settings.APPEND_SLASH = True request = self._get_request('slash/') self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_slashless_resource(self): """ Tests that matches to explicit slashless URLs go unmolested. """ settings.APPEND_SLASH = True request = self._get_request('noslash') self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_slashless_unknown(self): """ Tests that APPEND_SLASH doesn't redirect to unknown resources. """ settings.APPEND_SLASH = True request = self._get_request('unknown') self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_redirect(self): """ Tests that APPEND_SLASH redirects slashless URLs to a valid pattern. """ settings.APPEND_SLASH = True request = self._get_request('slash') r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://testserver/middleware/slash/') def test_append_slash_no_redirect_on_POST_in_DEBUG(self): """ Tests that while in debug mode, an exception is raised with a warning when a failed attempt is made to POST to an URL which would normally be redirected to a slashed version. """ settings.APPEND_SLASH = True settings.DEBUG = True request = self._get_request('slash') request.method = 'POST' self.assertRaises( RuntimeError, CommonMiddleware().process_request, request) try: CommonMiddleware().process_request(request) except RuntimeError, e: self.assertTrue('end in a slash' in str(e)) settings.DEBUG = False def test_append_slash_disabled(self): """ Tests disabling append slash functionality. """ settings.APPEND_SLASH = False request = self._get_request('slash') self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_quoted(self): """ Tests that URLs which require quoting are redirected to their slash version ok. """ settings.APPEND_SLASH = True request = self._get_request('needsquoting#') r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals( r['Location'], 'http://testserver/middleware/needsquoting%23/') def test_prepend_www(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = False request = self._get_request('path/') r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals( r['Location'], 'http://www.testserver/middleware/path/') def test_prepend_www_append_slash_have_slash(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = True request = self._get_request('slash/') r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://www.testserver/middleware/slash/') def test_prepend_www_append_slash_slashless(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = True request = self._get_request('slash') r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://www.testserver/middleware/slash/') # The following tests examine expected behavior given a custom urlconf that # overrides the default one through the request object. def test_append_slash_have_slash_custom_urlconf(self): """ Tests that URLs with slashes go unmolested. """ settings.APPEND_SLASH = True request = self._get_request('customurlconf/slash/') request.urlconf = 'regressiontests.middleware.extra_urls' self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_slashless_resource_custom_urlconf(self): """ Tests that matches to explicit slashless URLs go unmolested. """ settings.APPEND_SLASH = True request = self._get_request('customurlconf/noslash') request.urlconf = 'regressiontests.middleware.extra_urls' self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_slashless_unknown_custom_urlconf(self): """ Tests that APPEND_SLASH doesn't redirect to unknown resources. """ settings.APPEND_SLASH = True request = self._get_request('customurlconf/unknown') request.urlconf = 'regressiontests.middleware.extra_urls' self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_redirect_custom_urlconf(self): """ Tests that APPEND_SLASH redirects slashless URLs to a valid pattern. """ settings.APPEND_SLASH = True request = self._get_request('customurlconf/slash') request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertFalse(r is None, "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf") self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://testserver/middleware/customurlconf/slash/') def test_append_slash_no_redirect_on_POST_in_DEBUG_custom_urlconf(self): """ Tests that while in debug mode, an exception is raised with a warning when a failed attempt is made to POST to an URL which would normally be redirected to a slashed version. """ settings.APPEND_SLASH = True settings.DEBUG = True request = self._get_request('customurlconf/slash') request.urlconf = 'regressiontests.middleware.extra_urls' request.method = 'POST' self.assertRaises( RuntimeError, CommonMiddleware().process_request, request) try: CommonMiddleware().process_request(request) except RuntimeError, e: self.assertTrue('end in a slash' in str(e)) settings.DEBUG = False def test_append_slash_disabled_custom_urlconf(self): """ Tests disabling append slash functionality. """ settings.APPEND_SLASH = False request = self._get_request('customurlconf/slash') request.urlconf = 'regressiontests.middleware.extra_urls' self.assertEquals(CommonMiddleware().process_request(request), None) def test_append_slash_quoted_custom_urlconf(self): """ Tests that URLs which require quoting are redirected to their slash version ok. """ settings.APPEND_SLASH = True request = self._get_request('customurlconf/needsquoting#') request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertFalse(r is None, "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf") self.assertEquals(r.status_code, 301) self.assertEquals( r['Location'], 'http://testserver/middleware/customurlconf/needsquoting%23/') def test_prepend_www_custom_urlconf(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = False request = self._get_request('customurlconf/path/') request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals( r['Location'], 'http://www.testserver/middleware/customurlconf/path/') def test_prepend_www_append_slash_have_slash_custom_urlconf(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = True request = self._get_request('customurlconf/slash/') request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://www.testserver/middleware/customurlconf/slash/') def test_prepend_www_append_slash_slashless_custom_urlconf(self): settings.PREPEND_WWW = True settings.APPEND_SLASH = True request = self._get_request('customurlconf/slash') request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertEquals(r.status_code, 301) self.assertEquals(r['Location'], 'http://www.testserver/middleware/customurlconf/slash/')