changeset 1237:f2f94d58b03b modernize

Add unit tests for core middleware.
author Brian Neal <bgneal@gmail.com>
date Sun, 08 Jun 2025 15:14:11 -0500
parents df3473a1ee8c
children db7a0f69e29a
files core/tests/test_middleware.py
diffstat 1 files changed, 136 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/test_middleware.py	Sun Jun 08 15:14:11 2025 -0500
@@ -0,0 +1,136 @@
+from django.conf import settings
+from django.contrib.auth.models import AnonymousUser, User
+from django.test import TestCase, RequestFactory
+from mock import patch, Mock
+
+from core.middleware import InactiveUserMiddleware, WhosOnline
+
+
+class InactiveUserMiddlewareTestCase(TestCase):
+    def setUp(self):
+        factory = RequestFactory()
+        self.request = factory.get('/contact')
+        self.user = User.objects.create_user(username='pjmoto',
+                                             email='pjmoto@pjmoto.com',
+                                             password='secret')
+        self.middleware = InactiveUserMiddleware()
+
+    @patch('core.middleware.logout')
+    def test_does_nothing_for_unauthed_user(self, mock_logout):
+        self.request.user = AnonymousUser()
+        self.middleware.process_view(self.request, lambda x: None, None, None)
+        mock_logout.assert_not_called()
+
+    @patch('core.middleware.logout')
+    def test_does_nothing_for_active_user(self, mock_logout):
+        self.user.is_active = True
+        self.request.user = self.user
+        self.middleware.process_view(self.request, lambda x: None, None, None)
+        mock_logout.assert_not_called()
+
+    @patch('core.middleware.logout')
+    def test_logs_out_inactive_user(self, mock_logout):
+        self.user.is_active = False
+        self.request.user = self.user
+        self.middleware.process_view(self.request, lambda x: None, None, None)
+        mock_logout.assert_called_once_with(self.request)
+
+
+class WhosOnlineMiddlewareTestCase(TestCase):
+    def setUp(self):
+        self.factory = RequestFactory()
+        self.request = self.factory.get('/contact')
+        self.user = User.objects.create_user(username='pjmoto',
+                                             email='pjmoto@pjmoto.com',
+                                             password='secret')
+        self.middleware = WhosOnline()
+        self.response = Mock()
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_does_nothing_when_no_user(self, mock_report_user,
+                                       mock_report_visitor):
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.assert_not_called()
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_not_called()
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_does_nothing_when_ajax(self, mock_report_user,
+                                    mock_report_visitor):
+        ajax_request = self.factory.get('/', HTTP_X_REQUESTED_WITH='XMLHttpRequest')
+        ajax_request.user = self.user
+        result = self.middleware.process_response(ajax_request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.assert_not_called()
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_not_called()
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_does_nothing_when_user_has_cookie(self, mock_report_user,
+                                               mock_report_visitor):
+        self.request.user = self.user
+        self.request.COOKIES['sg101_online'] = 1
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.assert_not_called()
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_not_called()
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_reports_user(self, mock_report_user, mock_report_visitor):
+        self.request.user = self.user
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.set_cookie.assert_called_once_with(
+                'sg101_online', '1', max_age=300)
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_called_once_with('pjmoto')
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_does_nothing_when_visitor_no_cookies(self, mock_report_user,
+                                                  mock_report_visitor):
+        self.request.user = AnonymousUser()
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.assert_not_called()
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_not_called()
+
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_does_nothing_when_visitor_with_online_cookie(
+            self, mock_report_user, mock_report_visitor):
+        self.request.user = AnonymousUser()
+        self.request.COOKIES = {
+            settings.CSRF_COOKIE_NAME: 'deadbeef',
+            'sg101_online': '1',
+        }
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.assert_not_called()
+        mock_report_visitor.assert_not_called()
+        mock_report_user.assert_not_called()
+
+    @patch('core.middleware.get_ip')
+    @patch('core.middleware.report_visitor')
+    @patch('core.middleware.report_user')
+    def test_reports_visitor(self, mock_report_user, mock_report_visitor,
+                             mock_get_ip):
+        self.request.user = AnonymousUser()
+        self.request.COOKIES = {
+            settings.CSRF_COOKIE_NAME: 'deadbeef',
+        }
+        mock_get_ip.return_value = '127.0.0.1'
+        result = self.middleware.process_response(self.request, self.response)
+        self.assertEqual(result, self.response)
+        self.response.set_cookie.assert_called_once('sg101_online', '1',
+                                                    max_age=300)
+        mock_report_visitor.assert_called_once_with('127.0.0.1')
+        mock_report_user.assert_not_called()
+        mock_get_ip.assert_called_once_with(self.request)