Commit 65131911 authored by Chris Wilson's avatar Chris Wilson Committed by Tim Graham
Browse files

Fixed #21518 -- Made override_settings(ROOT_URLCONF) clear the resolver cache.

Thanks Aymeric Augustin and Simon Charette for reviews.
parent 43510cff
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -124,3 +124,10 @@ def complex_setting_changed(**kwargs):
        # stacklevel=5 shows the line containing the override_settings call.
        warnings.warn("Overriding setting %s can lead to unexpected behaviour."
                      % kwargs['setting'], stacklevel=5)


@receiver(setting_changed)
def root_urlconf_changed(**kwargs):
    if kwargs['setting'] == 'ROOT_URLCONF':
        from django.core.urlresolvers import clear_url_caches
        clear_url_caches()
+33 −1
Original line number Diff line number Diff line
@@ -3,13 +3,16 @@ from __future__ import unicode_literals

import unittest

from django.conf.urls import patterns, url
from django.core.urlresolvers import reverse
from django.db import connection
from django.forms import EmailField, IntegerField
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.test import SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.test.html import HTMLParseError, parse_html
from django.test.utils import CaptureQueriesContext, IgnoreAllDeprecationWarningsMixin
from django.test.utils import (CaptureQueriesContext,
    IgnoreAllDeprecationWarningsMixin, override_settings)
from django.utils import six

from .models import Person
@@ -627,3 +630,32 @@ class DoctestNormalizerTest(IgnoreAllDeprecationWarningsMixin, SimpleTestCase):
        suite = make_doctest("test_utils.doctest_output")
        failures = unittest.TextTestRunner(stream=six.StringIO()).run(suite)
        self.assertEqual(failures.failures, [])


# for OverrideSettingsTests
def fake_view(request):
    pass


class FirstUrls:
    urlpatterns = patterns('', url(r'first/$', fake_view, name='first'))


class SecondUrls:
    urlpatterns = patterns('', url(r'second/$', fake_view, name='second'))


class OverrideSettingsTests(TestCase):
    """
    #21518 -- If neither override_settings nor a settings_changed receiver
    clears the URL cache between tests, then one of these two test methods will
    fail.
    """

    @override_settings(ROOT_URLCONF=FirstUrls)
    def test_first(self):
        reverse('first')

    @override_settings(ROOT_URLCONF=SecondUrls)
    def test_second(self):
        reverse('second')