test_getting_dynamic_settings_values.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. from unittest.mock import patch
  2. from django.test import TestCase
  3. from misago.conf import CACHE_NAME
  4. from misago.conf.dynamicsettings import DynamicSettings
  5. from misago.conf.models import Setting, SettingsGroup
  6. from . import override_dynamic_settings
  7. cache_version = "abcdefgh"
  8. cache_versions = {CACHE_NAME: cache_version}
  9. class GettingSettingValueTests(TestCase):
  10. @patch('django.core.cache.cache.set')
  11. @patch('django.core.cache.cache.get', return_value=None)
  12. def test_settings_are_loaded_from_database_if_cache_is_not_available(self, cache_get, _):
  13. with self.assertNumQueries(1):
  14. DynamicSettings(cache_versions)
  15. @patch('django.core.cache.cache.set')
  16. @patch('django.core.cache.cache.get', return_value={})
  17. def test_settings_are_loaded_from_cache_if_it_is_not_none(self, cache_get, _):
  18. with self.assertNumQueries(0):
  19. DynamicSettings(cache_versions)
  20. cache_get.assert_called_once()
  21. @patch('django.core.cache.cache.set')
  22. @patch('django.core.cache.cache.get', return_value=None)
  23. def test_settings_cache_is_set_if_none_exists(self, _, cache_set):
  24. DynamicSettings(cache_versions)
  25. cache_set.assert_called_once()
  26. @patch('django.core.cache.cache.set')
  27. @patch('django.core.cache.cache.get', return_value={})
  28. def test_settings_cache_is_not_set_if_it_already_exists(self, _, cache_set):
  29. with self.assertNumQueries(0):
  30. DynamicSettings(cache_versions)
  31. cache_set.assert_not_called()
  32. @patch('django.core.cache.cache.set')
  33. @patch('django.core.cache.cache.get', return_value=None)
  34. def test_settings_cache_key_includes_cache_name_and_version(self, _, cache_set):
  35. DynamicSettings(cache_versions)
  36. cache_key = cache_set.call_args[0][0]
  37. assert CACHE_NAME in cache_key
  38. assert cache_version in cache_key
  39. def test_accessing_attr_returns_setting_value(self):
  40. settings = DynamicSettings(cache_versions)
  41. assert settings.forum_name == "Misago"
  42. def test_accessing_attr_for_undefined_setting_raises_error(self):
  43. settings = DynamicSettings(cache_versions)
  44. with self.assertRaises(KeyError):
  45. settings.not_existing
  46. def test_accessing_attr_for_lazy_setting_without_value_returns_none(self):
  47. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  48. Setting.objects.create(
  49. group=settings_group,
  50. setting="lazy_setting",
  51. name="Lazy setting",
  52. is_lazy=True,
  53. field_extra={},
  54. )
  55. settings = DynamicSettings(cache_versions)
  56. assert settings.lazy_setting is None
  57. def test_accessing_attr_for_lazy_setting_with_value_returns_true(self):
  58. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  59. Setting.objects.create(
  60. group=settings_group,
  61. setting="lazy_setting",
  62. name="Lazy setting",
  63. dry_value="Hello",
  64. is_lazy=True,
  65. field_extra={},
  66. )
  67. settings = DynamicSettings(cache_versions)
  68. assert settings.lazy_setting is True
  69. def test_lazy_setting_getter_for_lazy_setting_with_value_returns_real_value(self):
  70. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  71. Setting.objects.create(
  72. group=settings_group,
  73. setting="lazy_setting",
  74. name="Lazy setting",
  75. dry_value="Hello",
  76. is_lazy=True,
  77. field_extra={},
  78. )
  79. settings = DynamicSettings(cache_versions)
  80. assert settings.get_lazy_setting_value("lazy_setting") == "Hello"
  81. def test_lazy_setting_getter_for_lazy_setting_makes_db_query(self):
  82. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  83. Setting.objects.create(
  84. group=settings_group,
  85. setting="lazy_setting",
  86. name="Lazy setting",
  87. dry_value="Hello",
  88. is_lazy=True,
  89. field_extra={},
  90. )
  91. settings = DynamicSettings(cache_versions)
  92. with self.assertNumQueries(1):
  93. settings.get_lazy_setting_value("lazy_setting")
  94. def test_lazy_setting_getter_for_lazy_setting_is_reusing_query_result(self):
  95. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  96. Setting.objects.create(
  97. group=settings_group,
  98. setting="lazy_setting",
  99. name="Lazy setting",
  100. dry_value="Hello",
  101. is_lazy=True,
  102. field_extra={},
  103. )
  104. settings = DynamicSettings(cache_versions)
  105. settings.get_lazy_setting_value("lazy_setting")
  106. with self.assertNumQueries(0):
  107. settings.get_lazy_setting_value("lazy_setting")
  108. def test_lazy_setting_getter_for_undefined_setting_raises_attribute_error(self):
  109. settings = DynamicSettings(cache_versions)
  110. with self.assertRaises(AttributeError):
  111. settings.get_lazy_setting_value("undefined")
  112. def test_lazy_setting_getter_for_not_lazy_setting_raises_value_error(self):
  113. settings = DynamicSettings(cache_versions)
  114. with self.assertRaises(ValueError):
  115. settings.get_lazy_setting_value("forum_name")
  116. def test_public_settings_getter_returns_dict_with_public_settings(self):
  117. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  118. Setting.objects.create(
  119. group=settings_group,
  120. setting="public_setting",
  121. name="Public setting",
  122. dry_value="Hello",
  123. is_public=True,
  124. field_extra={},
  125. )
  126. settings = DynamicSettings(cache_versions)
  127. public_settings = settings.get_public_settings()
  128. assert public_settings["public_setting"] == "Hello"
  129. def test_public_settings_getter_excludes_private_settings_from_dict(self):
  130. settings_group = SettingsGroup.objects.create(key="test", name="Test")
  131. Setting.objects.create(
  132. group=settings_group,
  133. setting="private_setting",
  134. name="Private setting",
  135. dry_value="Hello",
  136. is_public=False,
  137. field_extra={},
  138. )
  139. settings = DynamicSettings(cache_versions)
  140. public_settings = settings.get_public_settings()
  141. assert "private_setting" not in public_settings