test_getting_dynamic_settings_values.py 6.3 KB

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