Fix Django integration tests for modern Django versions.
Update test models to specify the required on_delete argument and
replace MIDDLEWARE_CLASSES with MIDDLEWARE. Migrate URL imports to
django.urls and replace manual settings backup and restoration with
Django's override_settings() to ensure proper test isolation.
--- ../tests/contrib/django_util/models.py	2026-10-16 14:26:47.364403611 +0300
+++ ../tests/contrib/django_util/models.py	2026-10-16 14:27:01.469317603 +0300
@@ -21,5 +21,5 @@
 
 
 class CredentialsModel(models.Model):
-    user_id = models.OneToOneField(User)
+    user_id = models.OneToOneField(User, on_delete=models.CASCADE)
     credentials = CredentialsField()
--- ../tests/contrib/django_util/settings.py	2026-10-16 14:20:20.647191244 +0300
+++ ../tests/contrib/django_util/settings.py	2026-10-16 14:20:50.924458853 +0300
@@ -34,7 +34,7 @@
         'NAME': os.path.join('.', 'db.sqlite3'),
     }
 }
-MIDDLEWARE_CLASSES = (
+MIDDLEWARE = (
     'django.contrib.sessions.middleware.SessionMiddleware'
 )
 
--- ../tests/contrib/django_util/test_decorators.py	2026-10-16 14:51:04.559997955 +0300
+++ ../tests/contrib/django_util/test_decorators.py	2026-10-16 17:09:54.529516427 +0300
@@ -14,7 +14,7 @@
 
 """Tests for the django_util decorators."""
 
-import copy
+from django.test import override_settings
 
 from django import http
 import django.conf
@@ -33,7 +33,9 @@
 
     def setUp(self):
         super(OAuth2EnabledDecoratorTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
 
         # OAuth2 Settings gets configured based on Django settings
         # at import time, so in order for us to reload the settings
@@ -44,7 +46,6 @@
 
     def tearDown(self):
         super(OAuth2EnabledDecoratorTest, self).tearDown()
-        django.conf.settings = copy.deepcopy(self.save_settings)
 
     def test_no_credentials_without_credentials(self):
         request = self.factory.get('/test')
@@ -110,16 +111,14 @@
 
     def setUp(self):
         super(OAuth2RequiredDecoratorTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
 
         reload_module(oauth2client.contrib.django_util)
         self.user = django_models.User.objects.create_user(
             username='bill', email='bill@example.com', password='hunter2')
 
-    def tearDown(self):
-        super(OAuth2RequiredDecoratorTest, self).tearDown()
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     def test_redirects_without_credentials(self):
         request = self.factory.get('/test')
         request.session = self.session
@@ -200,7 +199,9 @@
 
     def setUp(self):
         super(OAuth2RequiredDecoratorStorageModelTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
 
         STORAGE_MODEL = {
             'model': 'tests.contrib.django_util.models.CredentialsModel',
@@ -213,10 +214,6 @@
         self.user = django_models.User.objects.create_user(
             username='bill', email='bill@example.com', password='hunter2')
 
-    def tearDown(self):
-        super(OAuth2RequiredDecoratorStorageModelTest, self).tearDown()
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     def test_redirects_anonymous_to_login(self):
         request = self.factory.get('/test')
         request.session = self.session
--- ../tests/contrib/django_util?test_django_util.py	2026-10-16 14:31:20.416171943 +0300
+++ ../tests/contrib/django_util/test_django_util.py	2026-10-16 17:13:56.775017290 +0300
@@ -14,11 +14,11 @@
 
 """Tests the initialization logic of django_util."""
 
-import copy
 import unittest
+from django.test import override_settings
 
 import django.conf
-from django.conf.urls import include, url
+from django.urls import include, re_path as url
 from django.contrib.auth import models as django_models
 from django.core import exceptions
 import mock
@@ -38,15 +38,14 @@
 class OAuth2SetupTest(unittest.TestCase):
 
     def setUp(self):
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
         # OAuth2 Settings gets configured based on Django settings
         # at import time, so in order for us to reload the settings
         # we need to reload the module
         reload_module(oauth2client.contrib.django_util)
 
-    def tearDown(self):
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     @mock.patch("oauth2client.contrib.django_util.clientsecrets")
     def test_settings_initialize(self, clientsecrets):
         django.conf.settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON = 'file.json'
@@ -93,26 +92,24 @@
 
     @mock.patch("oauth2client.contrib.django_util.clientsecrets")
     def test_no_session_middleware(self, clientsecrets):
-        django.conf.settings.MIDDLEWARE_CLASSES = ()
-
-        with self.assertRaises(exceptions.ImproperlyConfigured):
-            django_util.OAuth2Settings.__init__(
-                object.__new__(django_util.OAuth2Settings),
-                django.conf.settings)
+        with override_settings(MIDDLEWARE=()):
+            with self.assertRaises(exceptions.ImproperlyConfigured):
+                django_util.OAuth2Settings.__init__(
+                    object.__new__(django_util.OAuth2Settings),
+                    django.conf.settings)
 
     def test_no_middleware(self):
-        django.conf.settings.MIDDLEWARE_CLASSES = None
-        with self.assertRaises(exceptions.ImproperlyConfigured):
-            django_util.OAuth2Settings.__init__(
-                object.__new__(django_util.OAuth2Settings),
-                django.conf.settings)
+        with override_settings(MIDDLEWARE=None):
+            with self.assertRaises(exceptions.ImproperlyConfigured):
+                django_util.OAuth2Settings.__init__(
+                    object.__new__(django_util.OAuth2Settings),
+                    django.conf.settings)
 
     def test_middleware_no_classes(self):
-        django.conf.settings.MIDDLEWARE = (
-            django.conf.settings.MIDDLEWARE_CLASSES)
-        django.conf.settings.MIDDLEWARE_CLASSES = None
-        # primarily testing this doesn't raise an exception
-        django_util.OAuth2Settings(django.conf.settings)
+        with override_settings(
+                MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware']):
+            # primarily testing this doesn't raise an exception
+            django_util.OAuth2Settings(django.conf.settings)
 
     def test_storage_model(self):
         STORAGE_MODEL = {
@@ -138,12 +135,13 @@
 
     def setUp(self):
         super(SessionStorageTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
         reload_module(oauth2client.contrib.django_util)
 
     def tearDown(self):
         super(SessionStorageTest, self).tearDown()
-        django.conf.settings = copy.deepcopy(self.save_settings)
 
     def test_session_delete(self):
         self.session[django_util._CREDENTIALS_KEY] = "test_val"
@@ -162,7 +160,9 @@
 
     def setUp(self):
         super(TestUserOAuth2Object, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
         STORAGE_MODEL = {
             'model': 'tests.contrib.django_util.models.CredentialsModel',
             'user_property': 'user_id',
@@ -171,11 +171,6 @@
         django.conf.settings.GOOGLE_OAUTH2_STORAGE_MODEL = STORAGE_MODEL
         reload_module(oauth2client.contrib.django_util)
 
-    def tearDown(self):
-        super(TestUserOAuth2Object, self).tearDown()
-        import django.conf
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     def test_get_credentials_anon_user(self):
         request = self.factory.get('oauth2/oauth2authorize',
                                    data={'return_url': '/return_endpoint'})
--- ../tests/contrib/django_util/test_views.py	2026-10-16 16:59:10.787747027 +0300
+++ ../tests/contrib/django_util/test_views.py	2026-10-16 17:09:25.650206082 +0300
@@ -14,7 +14,7 @@
 
 """Unit test for django_util views"""
 
-import copy
+from django.test import override_settings
 import json
 
 import django
@@ -35,14 +35,13 @@
 
     def setUp(self):
         super(OAuth2AuthorizeTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
         reload_module(oauth2client.contrib.django_util)
         self.user = django_models.User.objects.create_user(
             username='bill', email='bill@example.com', password='hunter2')
 
-    def tearDown(self):
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     def test_authorize_works(self):
         request = self.factory.get('oauth2/oauth2authorize')
         request.session = self.session
@@ -71,7 +70,9 @@
 
     def setUp(self):
         super(Oauth2AuthorizeStorageModelTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
 
         STORAGE_MODEL = {
             'model': 'tests.contrib.django_util.models.CredentialsModel',
@@ -87,9 +88,6 @@
         self.user = django_models.User.objects.create_user(
             username='bill', email='bill@example.com', password='hunter2')
 
-    def tearDown(self):
-        django.conf.settings = copy.deepcopy(self.save_settings)
-
     def test_authorize_works(self):
         request = self.factory.get('oauth2/oauth2authorize')
         request.session = self.session
@@ -166,7 +164,10 @@
 
     def setUp(self):
         super(Oauth2CallbackTest, self).setUp()
-        self.save_settings = copy.deepcopy(django.conf.settings)
+        self.settings_override = override_settings()
+        self.settings_override.enable()
+        self.addCleanup(self.settings_override.disable)
+
         reload_module(oauth2client.contrib.django_util)
 
         self.CSRF_TOKEN = 'token'
