test_password_reset_timeout_days.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import sys
  2. from datetime import datetime, timedelta
  3. from types import ModuleType
  4. from django.conf import (
  5. PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, Settings, settings,
  6. )
  7. from django.contrib.auth.models import User
  8. from django.contrib.auth.tokens import PasswordResetTokenGenerator
  9. from django.core.exceptions import ImproperlyConfigured
  10. from django.test import TestCase, ignore_warnings
  11. from django.utils.deprecation import RemovedInDjango40Warning
  12. class DeprecationTests(TestCase):
  13. msg = PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG
  14. @ignore_warnings(category=RemovedInDjango40Warning)
  15. def test_timeout(self):
  16. """The token is valid after n days, but no greater."""
  17. # Uses a mocked version of PasswordResetTokenGenerator so we can change
  18. # the value of 'now'.
  19. class Mocked(PasswordResetTokenGenerator):
  20. def __init__(self, now):
  21. self._now_val = now
  22. super().__init__()
  23. def _now(self):
  24. return self._now_val
  25. user = User.objects.create_user('tokentestuser', 'test2@example.com', 'testpw')
  26. p0 = PasswordResetTokenGenerator()
  27. tk1 = p0.make_token(user)
  28. p1 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
  29. self.assertIs(p1.check_token(user, tk1), True)
  30. p2 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
  31. self.assertIs(p2.check_token(user, tk1), False)
  32. with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=1):
  33. self.assertEqual(settings.PASSWORD_RESET_TIMEOUT, 60 * 60 * 24)
  34. p3 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
  35. self.assertIs(p3.check_token(user, tk1), True)
  36. p4 = Mocked(datetime.now() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
  37. self.assertIs(p4.check_token(user, tk1), False)
  38. def test_override_settings_warning(self):
  39. with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
  40. with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=2):
  41. pass
  42. def test_settings_init_warning(self):
  43. settings_module = ModuleType('fake_settings_module')
  44. settings_module.SECRET_KEY = 'foo'
  45. settings_module.PASSWORD_RESET_TIMEOUT_DAYS = 2
  46. sys.modules['fake_settings_module'] = settings_module
  47. try:
  48. with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
  49. Settings('fake_settings_module')
  50. finally:
  51. del sys.modules['fake_settings_module']
  52. def test_access_warning(self):
  53. with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
  54. settings.PASSWORD_RESET_TIMEOUT_DAYS
  55. # Works a second time.
  56. with self.assertRaisesMessage(RemovedInDjango40Warning, self.msg):
  57. settings.PASSWORD_RESET_TIMEOUT_DAYS
  58. @ignore_warnings(category=RemovedInDjango40Warning)
  59. def test_access(self):
  60. with self.settings(PASSWORD_RESET_TIMEOUT_DAYS=2):
  61. self.assertEqual(settings.PASSWORD_RESET_TIMEOUT_DAYS, 2)
  62. # Works a second time.
  63. self.assertEqual(settings.PASSWORD_RESET_TIMEOUT_DAYS, 2)
  64. def test_use_both_settings_init_error(self):
  65. msg = (
  66. 'PASSWORD_RESET_TIMEOUT_DAYS/PASSWORD_RESET_TIMEOUT are '
  67. 'mutually exclusive.'
  68. )
  69. settings_module = ModuleType('fake_settings_module')
  70. settings_module.SECRET_KEY = 'foo'
  71. settings_module.PASSWORD_RESET_TIMEOUT_DAYS = 2
  72. settings_module.PASSWORD_RESET_TIMEOUT = 2000
  73. sys.modules['fake_settings_module'] = settings_module
  74. try:
  75. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  76. Settings('fake_settings_module')
  77. finally:
  78. del sys.modules['fake_settings_module']