From 65131911dba08dcc1451d71ae4d5101724d722f6 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 27 Nov 2013 19:45:20 +0000 Subject: [PATCH] Fixed #21518 -- Made override_settings(ROOT_URLCONF) clear the resolver cache. Thanks Aymeric Augustin and Simon Charette for reviews. --- django/test/signals.py | 7 +++++++ tests/test_utils/tests.py | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/django/test/signals.py b/django/test/signals.py index 5cfc9f38452..600255ef61d 100644 --- a/django/test/signals.py +++ b/django/test/signals.py @@ -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() diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py index 999b59faeaa..365341d50f6 100644 --- a/tests/test_utils/tests.py +++ b/tests/test_utils/tests.py @@ -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')