test_getting_dynamic_settings_values.py 6.3 KB

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