test_models.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from datetime import timedelta
  2. from django.core.exceptions import ValidationError
  3. from django.test import TestCase
  4. from django.utils import timezone
  5. from users.models import User, Token
  6. from utilities.testing import create_test_user
  7. class TokenTest(TestCase):
  8. """
  9. Test class for testing the functionality of the Token model.
  10. """
  11. @classmethod
  12. def setUpTestData(cls):
  13. """
  14. Set up test data for the Token model.
  15. """
  16. cls.user = create_test_user('User 1')
  17. def test_is_expired(self):
  18. """
  19. Test the is_expired property.
  20. """
  21. # Token with no expiration
  22. token = Token(user=self.user, expires=None)
  23. self.assertFalse(token.is_expired)
  24. # Token with future expiration
  25. token.expires = timezone.now() + timedelta(days=1)
  26. self.assertFalse(token.is_expired)
  27. # Token with past expiration
  28. token.expires = timezone.now() - timedelta(days=1)
  29. self.assertTrue(token.is_expired)
  30. def test_cannot_create_token_with_past_expiration(self):
  31. """
  32. Test that creating a token with an expiration date in the past raises a ValidationError.
  33. """
  34. past_date = timezone.now() - timedelta(days=1)
  35. token = Token(user=self.user, expires=past_date)
  36. with self.assertRaises(ValidationError) as cm:
  37. token.clean()
  38. self.assertIn('expires', cm.exception.error_dict)
  39. def test_can_update_existing_expired_token(self):
  40. """
  41. Test that updating an already expired token does NOT raise a ValidationError.
  42. """
  43. # Create a valid token first with an expiration date in the past
  44. # bypasses the clean() method
  45. token = Token.objects.create(user=self.user)
  46. token.expires = timezone.now() - timedelta(days=1)
  47. token.save()
  48. # Try to update the description
  49. token.description = 'New Description'
  50. try:
  51. token.clean()
  52. token.save()
  53. except ValidationError:
  54. self.fail('Updating an expired token should not raise ValidationError')
  55. token.refresh_from_db()
  56. self.assertEqual(token.description, 'New Description')
  57. class UserConfigTest(TestCase):
  58. @classmethod
  59. def setUpTestData(cls):
  60. user = User.objects.create_user(username='testuser')
  61. user.config.data = {
  62. 'a': True,
  63. 'b': {
  64. 'foo': 101,
  65. 'bar': 102,
  66. },
  67. 'c': {
  68. 'foo': {
  69. 'x': 201,
  70. },
  71. 'bar': {
  72. 'y': 202,
  73. },
  74. 'baz': {
  75. 'z': 203,
  76. }
  77. }
  78. }
  79. user.config.save()
  80. def test_get(self):
  81. userconfig = User.objects.get(username='testuser').config
  82. # Retrieve root and nested values
  83. self.assertEqual(userconfig.get('a'), True)
  84. self.assertEqual(userconfig.get('b.foo'), 101)
  85. self.assertEqual(userconfig.get('c.baz.z'), 203)
  86. # Invalid values should return None
  87. self.assertIsNone(userconfig.get('invalid'))
  88. self.assertIsNone(userconfig.get('a.invalid'))
  89. self.assertIsNone(userconfig.get('b.foo.invalid'))
  90. self.assertIsNone(userconfig.get('b.foo.x.invalid'))
  91. # Invalid values with a provided default should return the default
  92. self.assertEqual(userconfig.get('invalid', 'DEFAULT'), 'DEFAULT')
  93. self.assertEqual(userconfig.get('a.invalid', 'DEFAULT'), 'DEFAULT')
  94. self.assertEqual(userconfig.get('b.foo.invalid', 'DEFAULT'), 'DEFAULT')
  95. self.assertEqual(userconfig.get('b.foo.x.invalid', 'DEFAULT'), 'DEFAULT')
  96. def test_all(self):
  97. userconfig = User.objects.get(username='testuser').config
  98. flattened_data = {
  99. 'a': True,
  100. 'b.foo': 101,
  101. 'b.bar': 102,
  102. 'c.foo.x': 201,
  103. 'c.bar.y': 202,
  104. 'c.baz.z': 203,
  105. }
  106. # Retrieve a flattened dictionary containing all config data
  107. self.assertEqual(userconfig.all(), flattened_data)
  108. def test_set(self):
  109. userconfig = User.objects.get(username='testuser').config
  110. # Overwrite existing values
  111. userconfig.set('a', 'abc')
  112. userconfig.set('c.foo.x', 'abc')
  113. self.assertEqual(userconfig.data['a'], 'abc')
  114. self.assertEqual(userconfig.data['c']['foo']['x'], 'abc')
  115. # Create new values
  116. userconfig.set('d', 'abc')
  117. userconfig.set('b.baz', 'abc')
  118. self.assertEqual(userconfig.data['d'], 'abc')
  119. self.assertEqual(userconfig.data['b']['baz'], 'abc')
  120. # Set a value and commit to the database
  121. userconfig.set('a', 'def', commit=True)
  122. userconfig.refresh_from_db()
  123. self.assertEqual(userconfig.data['a'], 'def')
  124. # Attempt to change a branch node to a leaf node
  125. with self.assertRaises(TypeError):
  126. userconfig.set('b', 1)
  127. # Attempt to change a leaf node to a branch node
  128. with self.assertRaises(TypeError):
  129. userconfig.set('a.x', 1)
  130. def test_clear(self):
  131. userconfig = User.objects.get(username='testuser').config
  132. # Clear existing values
  133. userconfig.clear('a')
  134. userconfig.clear('b.foo')
  135. self.assertTrue('a' not in userconfig.data)
  136. self.assertTrue('foo' not in userconfig.data['b'])
  137. self.assertEqual(userconfig.data['b']['bar'], 102)
  138. # Clear a non-existing value; should fail silently
  139. userconfig.clear('invalid')