1. from django.contrib.auth.middleware import AuthenticationMiddleware
    
  2. from django.contrib.auth.models import User
    
  3. from django.core.exceptions import ImproperlyConfigured
    
  4. from django.http import HttpRequest, HttpResponse
    
  5. from django.test import TestCase
    
  6. 
    
  7. 
    
  8. class TestAuthenticationMiddleware(TestCase):
    
  9.     @classmethod
    
  10.     def setUpTestData(cls):
    
  11.         cls.user = User.objects.create_user(
    
  12.             "test_user", "[email protected]", "test_password"
    
  13.         )
    
  14. 
    
  15.     def setUp(self):
    
  16.         self.middleware = AuthenticationMiddleware(lambda req: HttpResponse())
    
  17.         self.client.force_login(self.user)
    
  18.         self.request = HttpRequest()
    
  19.         self.request.session = self.client.session
    
  20. 
    
  21.     def test_no_password_change_doesnt_invalidate_session(self):
    
  22.         self.request.session = self.client.session
    
  23.         self.middleware(self.request)
    
  24.         self.assertIsNotNone(self.request.user)
    
  25.         self.assertFalse(self.request.user.is_anonymous)
    
  26. 
    
  27.     def test_changed_password_invalidates_session(self):
    
  28.         # After password change, user should be anonymous
    
  29.         self.user.set_password("new_password")
    
  30.         self.user.save()
    
  31.         self.middleware(self.request)
    
  32.         self.assertIsNotNone(self.request.user)
    
  33.         self.assertTrue(self.request.user.is_anonymous)
    
  34.         # session should be flushed
    
  35.         self.assertIsNone(self.request.session.session_key)
    
  36. 
    
  37.     def test_no_session(self):
    
  38.         msg = (
    
  39.             "The Django authentication middleware requires session middleware "
    
  40.             "to be installed. Edit your MIDDLEWARE setting to insert "
    
  41.             "'django.contrib.sessions.middleware.SessionMiddleware' before "
    
  42.             "'django.contrib.auth.middleware.AuthenticationMiddleware'."
    
  43.         )
    
  44.         with self.assertRaisesMessage(ImproperlyConfigured, msg):
    
  45.             self.middleware(HttpRequest())