from django.test import RequestFactory, TestCase from apps.users.models import LoginAttempt, User from apps.users.utils import _get_ip, record_login_attempt class UserUtilsTests(TestCase): @classmethod def setUpTestData(cls): cls.user = User.objects.create_user(mobile="09120000051", password="secret123") def setUp(self): self.factory = RequestFactory() def test_get_ip_returns_none_without_request(self): self.assertIsNone(_get_ip(None)) def test_get_ip_prefers_forwarded_header(self): request = self.factory.get("/", HTTP_X_FORWARDED_FOR="1.1.1.1, 2.2.2.2") self.assertEqual(_get_ip(request), "1.1.1.1") def test_get_ip_falls_back_to_remote_addr(self): request = self.factory.get("/", REMOTE_ADDR="3.3.3.3") self.assertEqual(_get_ip(request), "3.3.3.3") def test_record_login_attempt_persists_attempt(self): request = self.factory.get("/", REMOTE_ADDR="4.4.4.4") record_login_attempt(request, user=self.user, status=LoginAttempt.StatusType.SUCCESS) attempt = LoginAttempt.objects.get() self.assertEqual(attempt.user, self.user) self.assertEqual(attempt.status, LoginAttempt.StatusType.SUCCESS) self.assertEqual(attempt.ip_address, "4.4.4.4")