Commit 192b0659 authored by Tim Graham's avatar Tim Graham
Browse files

[1.9.x] Fixed #26428 -- Added support for relative path redirects in assertRedirects().

Thanks Trac alias master for the report and review.

Backport of d2569f89 from master
parent be1ac003
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ from django.utils.deprecation import (
)
from django.utils.encoding import force_text
from django.utils.six.moves.urllib.parse import (
    unquote, urlparse, urlsplit, urlunsplit,
    unquote, urljoin, urlparse, urlsplit, urlunsplit,
)
from django.utils.six.moves.urllib.request import url2pathname
from django.views.static import serve
@@ -317,6 +317,11 @@ class SimpleTestCase(unittest.TestCase):
            url = response.url
            scheme, netloc, path, query, fragment = urlsplit(url)

            # Prepend the request path to handle relative path redirects.
            if not path.startswith('/'):
                url = urljoin(response.request['PATH_INFO'], url)
                path = urljoin(response.request['PATH_INFO'], path)

            if fetch_redirect_response:
                redirect_response = response.client.get(path, QueryDict(query),
                                                        secure=(scheme == 'https'))
+3 −1
Original line number Diff line number Diff line
@@ -9,4 +9,6 @@ Django 1.9.6 fixes several bugs in 1.9.5.
Bugfixes
========

* ...
* Added support for relative path redirects to
  ``SimpleTestCase.assertRedirects()`` because Django 1.9 no longer converts
  redirects to absolute URIs (:ticket:`26428`).
+8 −0
Original line number Diff line number Diff line
@@ -632,6 +632,14 @@ class ClientTest(TestCase):
        # Check some response details
        self.assertContains(response, 'This is a test')

    def test_relative_redirect(self):
        response = self.client.get('/accounts/')
        self.assertRedirects(response, '/accounts/login/')

    def test_relative_redirect_no_trailing_slash(self):
        response = self.client.get('/accounts/no_trailing_slash')
        self.assertRedirects(response, '/accounts/login/')

    def test_mass_mail_sending(self):
        "Test that mass mail is redirected to a dummy outbox during test setup"

+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ urlpatterns = [
    url(r'^nesting_exception_view/$', views.nesting_exception_view),
    url(r'^django_project_redirect/$', views.django_project_redirect),

    url(r'^accounts/$', RedirectView.as_view(url='login/')),
    url(r'^accounts/no_trailing_slash$', RedirectView.as_view(url='login/')),
    url(r'^accounts/login/$', auth_views.login, {'template_name': 'login.html'}),
    url(r'^accounts/logout/$', auth_views.logout),
]