parts/django/tests/regressiontests/middleware/tests.py
changeset 307 c6bca38c1cbf
equal deleted inserted replaced
306:5ff1fc726848 307:c6bca38c1cbf
       
     1 # -*- coding: utf-8 -*-
       
     2 
       
     3 from django.conf import settings
       
     4 from django.http import HttpRequest
       
     5 from django.middleware.common import CommonMiddleware
       
     6 from django.test import TestCase
       
     7 
       
     8 
       
     9 class CommonMiddlewareTest(TestCase):
       
    10     def setUp(self):
       
    11         self.slash = settings.APPEND_SLASH
       
    12         self.www = settings.PREPEND_WWW
       
    13 
       
    14     def tearDown(self):
       
    15         settings.APPEND_SLASH = self.slash
       
    16         settings.PREPEND_WWW = self.www
       
    17 
       
    18     def _get_request(self, path):
       
    19         request = HttpRequest()
       
    20         request.META = {
       
    21             'SERVER_NAME': 'testserver',
       
    22             'SERVER_PORT': 80,
       
    23         }
       
    24         request.path = request.path_info = "/middleware/%s" % path
       
    25         return request
       
    26 
       
    27     def test_append_slash_have_slash(self):
       
    28         """
       
    29         Tests that URLs with slashes go unmolested.
       
    30         """
       
    31         settings.APPEND_SLASH = True
       
    32         request = self._get_request('slash/')
       
    33         self.assertEquals(CommonMiddleware().process_request(request), None)
       
    34 
       
    35     def test_append_slash_slashless_resource(self):
       
    36         """
       
    37         Tests that matches to explicit slashless URLs go unmolested.
       
    38         """
       
    39         settings.APPEND_SLASH = True
       
    40         request = self._get_request('noslash')
       
    41         self.assertEquals(CommonMiddleware().process_request(request), None)
       
    42 
       
    43     def test_append_slash_slashless_unknown(self):
       
    44         """
       
    45         Tests that APPEND_SLASH doesn't redirect to unknown resources.
       
    46         """
       
    47         settings.APPEND_SLASH = True
       
    48         request = self._get_request('unknown')
       
    49         self.assertEquals(CommonMiddleware().process_request(request), None)
       
    50 
       
    51     def test_append_slash_redirect(self):
       
    52         """
       
    53         Tests that APPEND_SLASH redirects slashless URLs to a valid pattern.
       
    54         """
       
    55         settings.APPEND_SLASH = True
       
    56         request = self._get_request('slash')
       
    57         r = CommonMiddleware().process_request(request)
       
    58         self.assertEquals(r.status_code, 301)
       
    59         self.assertEquals(r['Location'], 'http://testserver/middleware/slash/')
       
    60 
       
    61     def test_append_slash_no_redirect_on_POST_in_DEBUG(self):
       
    62         """
       
    63         Tests that while in debug mode, an exception is raised with a warning
       
    64         when a failed attempt is made to POST to an URL which would normally be
       
    65         redirected to a slashed version.
       
    66         """
       
    67         settings.APPEND_SLASH = True
       
    68         settings.DEBUG = True
       
    69         request = self._get_request('slash')
       
    70         request.method = 'POST'
       
    71         self.assertRaises(
       
    72             RuntimeError,
       
    73             CommonMiddleware().process_request,
       
    74             request)
       
    75         try:
       
    76             CommonMiddleware().process_request(request)
       
    77         except RuntimeError, e:
       
    78             self.assertTrue('end in a slash' in str(e))
       
    79         settings.DEBUG = False
       
    80 
       
    81     def test_append_slash_disabled(self):
       
    82         """
       
    83         Tests disabling append slash functionality.
       
    84         """
       
    85         settings.APPEND_SLASH = False
       
    86         request = self._get_request('slash')
       
    87         self.assertEquals(CommonMiddleware().process_request(request), None)
       
    88 
       
    89     def test_append_slash_quoted(self):
       
    90         """
       
    91         Tests that URLs which require quoting are redirected to their slash
       
    92         version ok.
       
    93         """
       
    94         settings.APPEND_SLASH = True
       
    95         request = self._get_request('needsquoting#')
       
    96         r = CommonMiddleware().process_request(request)
       
    97         self.assertEquals(r.status_code, 301)
       
    98         self.assertEquals(
       
    99             r['Location'],
       
   100             'http://testserver/middleware/needsquoting%23/')
       
   101 
       
   102     def test_prepend_www(self):
       
   103         settings.PREPEND_WWW = True
       
   104         settings.APPEND_SLASH = False
       
   105         request = self._get_request('path/')
       
   106         r = CommonMiddleware().process_request(request)
       
   107         self.assertEquals(r.status_code, 301)
       
   108         self.assertEquals(
       
   109             r['Location'],
       
   110             'http://www.testserver/middleware/path/')
       
   111 
       
   112     def test_prepend_www_append_slash_have_slash(self):
       
   113         settings.PREPEND_WWW = True
       
   114         settings.APPEND_SLASH = True
       
   115         request = self._get_request('slash/')
       
   116         r = CommonMiddleware().process_request(request)
       
   117         self.assertEquals(r.status_code, 301)
       
   118         self.assertEquals(r['Location'],
       
   119                           'http://www.testserver/middleware/slash/')
       
   120 
       
   121     def test_prepend_www_append_slash_slashless(self):
       
   122         settings.PREPEND_WWW = True
       
   123         settings.APPEND_SLASH = True
       
   124         request = self._get_request('slash')
       
   125         r = CommonMiddleware().process_request(request)
       
   126         self.assertEquals(r.status_code, 301)
       
   127         self.assertEquals(r['Location'],
       
   128                           'http://www.testserver/middleware/slash/')
       
   129 
       
   130 
       
   131     # The following tests examine expected behavior given a custom urlconf that
       
   132     # overrides the default one through the request object.
       
   133 
       
   134     def test_append_slash_have_slash_custom_urlconf(self):
       
   135       """
       
   136       Tests that URLs with slashes go unmolested.
       
   137       """
       
   138       settings.APPEND_SLASH = True
       
   139       request = self._get_request('customurlconf/slash/')
       
   140       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   141       self.assertEquals(CommonMiddleware().process_request(request), None)
       
   142 
       
   143     def test_append_slash_slashless_resource_custom_urlconf(self):
       
   144       """
       
   145       Tests that matches to explicit slashless URLs go unmolested.
       
   146       """
       
   147       settings.APPEND_SLASH = True
       
   148       request = self._get_request('customurlconf/noslash')
       
   149       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   150       self.assertEquals(CommonMiddleware().process_request(request), None)
       
   151 
       
   152     def test_append_slash_slashless_unknown_custom_urlconf(self):
       
   153       """
       
   154       Tests that APPEND_SLASH doesn't redirect to unknown resources.
       
   155       """
       
   156       settings.APPEND_SLASH = True
       
   157       request = self._get_request('customurlconf/unknown')
       
   158       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   159       self.assertEquals(CommonMiddleware().process_request(request), None)
       
   160 
       
   161     def test_append_slash_redirect_custom_urlconf(self):
       
   162       """
       
   163       Tests that APPEND_SLASH redirects slashless URLs to a valid pattern.
       
   164       """
       
   165       settings.APPEND_SLASH = True
       
   166       request = self._get_request('customurlconf/slash')
       
   167       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   168       r = CommonMiddleware().process_request(request)
       
   169       self.assertFalse(r is None,
       
   170           "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf")
       
   171       self.assertEquals(r.status_code, 301)
       
   172       self.assertEquals(r['Location'], 'http://testserver/middleware/customurlconf/slash/')
       
   173 
       
   174     def test_append_slash_no_redirect_on_POST_in_DEBUG_custom_urlconf(self):
       
   175       """
       
   176       Tests that while in debug mode, an exception is raised with a warning
       
   177       when a failed attempt is made to POST to an URL which would normally be
       
   178       redirected to a slashed version.
       
   179       """
       
   180       settings.APPEND_SLASH = True
       
   181       settings.DEBUG = True
       
   182       request = self._get_request('customurlconf/slash')
       
   183       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   184       request.method = 'POST'
       
   185       self.assertRaises(
       
   186           RuntimeError,
       
   187           CommonMiddleware().process_request,
       
   188           request)
       
   189       try:
       
   190           CommonMiddleware().process_request(request)
       
   191       except RuntimeError, e:
       
   192           self.assertTrue('end in a slash' in str(e))
       
   193       settings.DEBUG = False
       
   194 
       
   195     def test_append_slash_disabled_custom_urlconf(self):
       
   196       """
       
   197       Tests disabling append slash functionality.
       
   198       """
       
   199       settings.APPEND_SLASH = False
       
   200       request = self._get_request('customurlconf/slash')
       
   201       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   202       self.assertEquals(CommonMiddleware().process_request(request), None)
       
   203 
       
   204     def test_append_slash_quoted_custom_urlconf(self):
       
   205       """
       
   206       Tests that URLs which require quoting are redirected to their slash
       
   207       version ok.
       
   208       """
       
   209       settings.APPEND_SLASH = True
       
   210       request = self._get_request('customurlconf/needsquoting#')
       
   211       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   212       r = CommonMiddleware().process_request(request)
       
   213       self.assertFalse(r is None,
       
   214           "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf")
       
   215       self.assertEquals(r.status_code, 301)
       
   216       self.assertEquals(
       
   217           r['Location'],
       
   218           'http://testserver/middleware/customurlconf/needsquoting%23/')
       
   219 
       
   220     def test_prepend_www_custom_urlconf(self):
       
   221       settings.PREPEND_WWW = True
       
   222       settings.APPEND_SLASH = False
       
   223       request = self._get_request('customurlconf/path/')
       
   224       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   225       r = CommonMiddleware().process_request(request)
       
   226       self.assertEquals(r.status_code, 301)
       
   227       self.assertEquals(
       
   228           r['Location'],
       
   229           'http://www.testserver/middleware/customurlconf/path/')
       
   230 
       
   231     def test_prepend_www_append_slash_have_slash_custom_urlconf(self):
       
   232       settings.PREPEND_WWW = True
       
   233       settings.APPEND_SLASH = True
       
   234       request = self._get_request('customurlconf/slash/')
       
   235       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   236       r = CommonMiddleware().process_request(request)
       
   237       self.assertEquals(r.status_code, 301)
       
   238       self.assertEquals(r['Location'],
       
   239                         'http://www.testserver/middleware/customurlconf/slash/')
       
   240 
       
   241     def test_prepend_www_append_slash_slashless_custom_urlconf(self):
       
   242       settings.PREPEND_WWW = True
       
   243       settings.APPEND_SLASH = True
       
   244       request = self._get_request('customurlconf/slash')
       
   245       request.urlconf = 'regressiontests.middleware.extra_urls'
       
   246       r = CommonMiddleware().process_request(request)
       
   247       self.assertEquals(r.status_code, 301)
       
   248       self.assertEquals(r['Location'],
       
   249                         'http://www.testserver/middleware/customurlconf/slash/')