summaryrefslogtreecommitdiff
path: root/tests/auth_tests/test_password_reset_timeout_days.py
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2019-08-23 17:14:07 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-09-20 13:52:04 +0200
commit226ebb17290b604ef29e82fb5c1fbac3594ac163 (patch)
tree6845abde1e47ec7f5d295ab609becce3c7f492a8 /tests/auth_tests/test_password_reset_timeout_days.py
parent0719edcd5fed56157ffb3323a8f634aa5e8f9a80 (diff)
Fixed #28622 -- Allowed specifying password reset link expiration in seconds and deprecated PASSWORD_RESET_TIMEOUT_DAYS.
Diffstat (limited to 'tests/auth_tests/test_password_reset_timeout_days.py')
-rw-r--r--tests/auth_tests/test_password_reset_timeout_days.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/tests/auth_tests/test_password_reset_timeout_days.py b/tests/auth_tests/test_password_reset_timeout_days.py
new file mode 100644
index 0000000000..db9aa62726
--- /dev/null
+++ b/tests/auth_tests/test_password_reset_timeout_days.py
@@ -0,0 +1,88 @@
+import sys
+from datetime import datetime, timedelta
+from types import ModuleType
+
+from django.conf import (
+ PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, Settings, settings,
+)
+from django.contrib.auth.models import User
+from django.contrib.auth.tokens import PasswordResetTokenGenerator
+from django.core.exceptions import ImproperlyConfigured
+from django.test import TestCase, ignore_warnings
+from django.utils.deprecation import RemovedInDjango40Warning
+
+
+class DeprecationTests(TestCase):
+ msg = PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG
+
+ @ignore_warnings(category=RemovedInDjango40Warning)
+ def test_timeout(self):
+ """The token is valid after n days, but no greater."""
+ # Uses a mocked version of PasswordResetTokenGenerator so we can change
+ # the value of 'now'.
+ class Mocked(PasswordResetTokenGenerator):
+ def __init__(self, now):
+ self._now_val = now
+
+ def _now(self):
+ return self._now_val
+
+ user = User.objects.create_user('tokentestuser', 'test2@example.com', 'testpw')
+ p0 = PasswordResetTokenGenerator()
+ tk1 = p0.make_token(user)
+ p1 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
+ self.assertTrue(p1.check_token(user, tk1))
+ p2 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
+ self.assertFalse(p2.check_token(user, tk1))
+ with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=1):
+ self.assertEqual(settings.PASSWORD_RESET_TIMEOUT, 60 * 60 * 24)
+ p3 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
+ self.assertTrue(p3.check_token(user, tk1))
+ p4 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
+ self.assertFalse(p4.check_token(user, tk1))
+
+ def test_override_settings_warning(self):
+ with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
+ with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=2):
+ pass
+
+ def test_settings_init_warning(self):
+ settings_module = ModuleType('fake_settings_module')
+ settings_module.SECRET_KEY = 'foo'
+ settings_module.PASSWORD_RESET_TIMEOUT_DAYS = 2
+ sys.modules['fake_settings_module'] = settings_module
+ try:
+ with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
+ Settings('fake_settings_module')
+ finally:
+ del sys.modules['fake_settings_module']
+
+ def test_access_warning(self):
+ with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
+ settings.PASSWORD_RESET_TIMEOUT_DAYS
+ # Works a second time.
+ with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
+ settings.PASSWORD_RESET_TIMEOUT_DAYS
+
+ @ignore_warnings(category=RemovedInDjango40Warning)
+ def test_access(self):
+ with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=2):
+ self.assertEqual(settings.PASSWORD_RESET_TIMEOUT_DAYS, 2)
+ # Works a second time.
+ self.assertEqual(settings.PASSWORD_RESET_TIMEOUT_DAYS, 2)
+
+ def test_use_both_settings_init_error(self):
+ msg = (
+ 'PASSWORD_RESET_TIMEOUT_DAYS/PASSWORD_RESET_TIMEOUT are '
+ 'mutually exclusive.'
+ )
+ settings_module = ModuleType('fake_settings_module')
+ settings_module.SECRET_KEY = 'foo'
+ settings_module.PASSWORD_RESET_TIMEOUT_DAYS = 2
+ settings_module.PASSWORD_RESET_TIMEOUT = 2000
+ sys.modules['fake_settings_module'] = settings_module
+ try:
+ with self.assertRaisesMessage(ImproperlyConfigured, msg):
+ Settings('fake_settings_module')
+ finally:
+ del sys.modules['fake_settings_module']