From 65131911dba08dcc1451d71ae4d5101724d722f6 Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris+github@qwirx.com>
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 5cfc9f3845..600255ef61 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 999b59faea..365341d50f 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')