|
@@ -1,167 +1,131 @@
|
|
|
-from unittest.mock import patch
|
|
|
-
|
|
|
-from django.test import TestCase
|
|
|
+import pytest
|
|
|
|
|
|
from misago.conf import SETTINGS_CACHE
|
|
|
from misago.conf.dynamicsettings import DynamicSettings
|
|
|
-from misago.conf.models import Setting, SettingsGroup
|
|
|
-from misago.conftest import get_cache_versions
|
|
|
-
|
|
|
-cache_versions = get_cache_versions()
|
|
|
|
|
|
|
|
|
-class GettingSettingValueTests(TestCase):
|
|
|
- @patch('django.core.cache.cache.set')
|
|
|
- @patch('django.core.cache.cache.get', return_value=None)
|
|
|
- def test_settings_are_loaded_from_database_if_cache_is_not_available(self, cache_get, _):
|
|
|
- with self.assertNumQueries(1):
|
|
|
- DynamicSettings(cache_versions)
|
|
|
+def test_settings_are_loaded_from_database_if_cache_is_not_available(
|
|
|
+ db, mocker, cache_versions, django_assert_num_queries
|
|
|
+):
|
|
|
+ mocker.patch('django.core.cache.cache.set')
|
|
|
+ mocker.patch('django.core.cache.cache.get', return_value=None)
|
|
|
+ with django_assert_num_queries(1):
|
|
|
+ DynamicSettings(cache_versions)
|
|
|
|
|
|
- @patch('django.core.cache.cache.set')
|
|
|
- @patch('django.core.cache.cache.get', return_value={})
|
|
|
- def test_settings_are_loaded_from_cache_if_it_is_not_none(self, cache_get, _):
|
|
|
- with self.assertNumQueries(0):
|
|
|
- DynamicSettings(cache_versions)
|
|
|
- cache_get.assert_called_once()
|
|
|
|
|
|
- @patch('django.core.cache.cache.set')
|
|
|
- @patch('django.core.cache.cache.get', return_value=None)
|
|
|
- def test_settings_cache_is_set_if_none_exists(self, _, cache_set):
|
|
|
+def test_settings_are_loaded_from_cache_if_it_is_not_none(
|
|
|
+ db, mocker, cache_versions, django_assert_num_queries
|
|
|
+):
|
|
|
+ mocker.patch('django.core.cache.cache.set')
|
|
|
+ cache_get = mocker.patch('django.core.cache.cache.get', return_value={})
|
|
|
+ with django_assert_num_queries(0):
|
|
|
DynamicSettings(cache_versions)
|
|
|
- cache_set.assert_called_once()
|
|
|
-
|
|
|
- @patch('django.core.cache.cache.set')
|
|
|
- @patch('django.core.cache.cache.get', return_value={})
|
|
|
- def test_settings_cache_is_not_set_if_it_already_exists(self, _, cache_set):
|
|
|
- with self.assertNumQueries(0):
|
|
|
- DynamicSettings(cache_versions)
|
|
|
- cache_set.assert_not_called()
|
|
|
-
|
|
|
- @patch('django.core.cache.cache.set')
|
|
|
- @patch('django.core.cache.cache.get', return_value=None)
|
|
|
- def test_settings_cache_key_includes_cache_name_and_version(self, _, cache_set):
|
|
|
+ cache_get.assert_called_once()
|
|
|
+
|
|
|
+
|
|
|
+def test_settings_cache_is_set_if_none_exists(db, mocker, cache_versions):
|
|
|
+ cache_set = mocker.patch('django.core.cache.cache.set')
|
|
|
+ mocker.patch('django.core.cache.cache.get', return_value=None)
|
|
|
+
|
|
|
+ DynamicSettings(cache_versions)
|
|
|
+ cache_set.assert_called_once()
|
|
|
+
|
|
|
+
|
|
|
+def test_settings_cache_is_not_set_if_it_already_exists(
|
|
|
+ db, mocker, cache_versions, django_assert_num_queries
|
|
|
+):
|
|
|
+ cache_set = mocker.patch('django.core.cache.cache.set')
|
|
|
+ mocker.patch('django.core.cache.cache.get', return_value={})
|
|
|
+ with django_assert_num_queries(0):
|
|
|
DynamicSettings(cache_versions)
|
|
|
- cache_key = cache_set.call_args[0][0]
|
|
|
- assert SETTINGS_CACHE in cache_key
|
|
|
- assert cache_versions[SETTINGS_CACHE] in cache_key
|
|
|
-
|
|
|
- def test_accessing_attr_returns_setting_value(self):
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- assert settings.forum_name == "Misago"
|
|
|
-
|
|
|
- def test_accessing_attr_for_undefined_setting_raises_error(self):
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- with self.assertRaises(KeyError):
|
|
|
- settings.not_existing
|
|
|
-
|
|
|
- def test_accessing_attr_for_lazy_setting_without_value_returns_none(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="lazy_setting",
|
|
|
- name="Lazy setting",
|
|
|
- is_lazy=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- assert settings.lazy_setting is None
|
|
|
-
|
|
|
- def test_accessing_attr_for_lazy_setting_with_value_returns_true(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="lazy_setting",
|
|
|
- name="Lazy setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_lazy=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- assert settings.lazy_setting is True
|
|
|
-
|
|
|
- def test_lazy_setting_getter_for_lazy_setting_with_value_returns_real_value(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="lazy_setting",
|
|
|
- name="Lazy setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_lazy=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- assert settings.get_lazy_setting_value("lazy_setting") == "Hello"
|
|
|
-
|
|
|
- def test_lazy_setting_getter_for_lazy_setting_makes_db_query(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="lazy_setting",
|
|
|
- name="Lazy setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_lazy=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- with self.assertNumQueries(1):
|
|
|
- settings.get_lazy_setting_value("lazy_setting")
|
|
|
-
|
|
|
- def test_lazy_setting_getter_for_lazy_setting_is_reusing_query_result(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="lazy_setting",
|
|
|
- name="Lazy setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_lazy=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
+ cache_set.assert_not_called()
|
|
|
+
|
|
|
+
|
|
|
+def test_settings_cache_key_includes_cache_name_and_version(db, mocker, cache_versions):
|
|
|
+ cache_set = mocker.patch('django.core.cache.cache.set')
|
|
|
+ mocker.patch('django.core.cache.cache.get', return_value=None)
|
|
|
+ DynamicSettings(cache_versions)
|
|
|
+ cache_key = cache_set.call_args[0][0]
|
|
|
+ assert SETTINGS_CACHE in cache_key
|
|
|
+ assert cache_versions[SETTINGS_CACHE] in cache_key
|
|
|
+
|
|
|
+
|
|
|
+def test_accessing_attr_returns_setting_value(db, cache_versions):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ assert settings.forum_name == "Misago"
|
|
|
+
|
|
|
+
|
|
|
+def test_accessing_attr_for_undefined_setting_raises_attribute_error(db, cache_versions):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ with pytest.raises(AttributeError):
|
|
|
+ settings.not_existing
|
|
|
+
|
|
|
+
|
|
|
+def test_accessing_attr_for_lazy_setting_with_value_returns_true(
|
|
|
+ cache_versions, lazy_setting
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ assert settings.lazy_setting is True
|
|
|
+
|
|
|
+
|
|
|
+def test_lazy_setting_getter_for_lazy_setting_with_value_returns_real_value(
|
|
|
+ cache_versions, lazy_setting
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ assert settings.get_lazy_setting_value("lazy_setting") == lazy_setting.value
|
|
|
+
|
|
|
+
|
|
|
+def test_lazy_setting_getter_for_lazy_setting_makes_db_query(
|
|
|
+ cache_versions, lazy_setting, django_assert_num_queries
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ with django_assert_num_queries(1):
|
|
|
+ settings.get_lazy_setting_value("lazy_setting")
|
|
|
+
|
|
|
+
|
|
|
+def test_accessing_attr_for_lazy_setting_without_value_returns_none(
|
|
|
+ cache_versions, lazy_setting_without_value
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ assert settings.lazy_setting is None
|
|
|
+
|
|
|
+
|
|
|
+def test_lazy_setting_getter_for_lazy_setting_is_reusing_query_result(
|
|
|
+ cache_versions, lazy_setting, django_assert_num_queries
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ settings.get_lazy_setting_value("lazy_setting")
|
|
|
+ with django_assert_num_queries(0):
|
|
|
settings.get_lazy_setting_value("lazy_setting")
|
|
|
- with self.assertNumQueries(0):
|
|
|
- settings.get_lazy_setting_value("lazy_setting")
|
|
|
-
|
|
|
- def test_lazy_setting_getter_for_undefined_setting_raises_attribute_error(self):
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- with self.assertRaises(AttributeError):
|
|
|
- settings.get_lazy_setting_value("undefined")
|
|
|
-
|
|
|
- def test_lazy_setting_getter_for_not_lazy_setting_raises_value_error(self):
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- with self.assertRaises(ValueError):
|
|
|
- settings.get_lazy_setting_value("forum_name")
|
|
|
-
|
|
|
- def test_public_settings_getter_returns_dict_with_public_settings(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="public_setting",
|
|
|
- name="Public setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_public=True,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- public_settings = settings.get_public_settings()
|
|
|
- assert public_settings["public_setting"] == "Hello"
|
|
|
-
|
|
|
- def test_public_settings_getter_excludes_private_settings_from_dict(self):
|
|
|
- settings_group = SettingsGroup.objects.create(key="test", name="Test")
|
|
|
- Setting.objects.create(
|
|
|
- group=settings_group,
|
|
|
- setting="private_setting",
|
|
|
- name="Private setting",
|
|
|
- dry_value="Hello",
|
|
|
- is_public=False,
|
|
|
- field_extra={},
|
|
|
- )
|
|
|
-
|
|
|
- settings = DynamicSettings(cache_versions)
|
|
|
- public_settings = settings.get_public_settings()
|
|
|
- assert "private_setting" not in public_settings
|
|
|
+
|
|
|
+
|
|
|
+def test_lazy_setting_getter_for_undefined_setting_raises_attribute_error(
|
|
|
+ db, cache_versions
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ with pytest.raises(AttributeError):
|
|
|
+ settings.get_lazy_setting_value("undefined")
|
|
|
+
|
|
|
+
|
|
|
+def test_lazy_setting_getter_for_not_lazy_setting_raises_value_error(
|
|
|
+ db, cache_versions
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ with pytest.raises(ValueError):
|
|
|
+ settings.get_lazy_setting_value("forum_name")
|
|
|
+
|
|
|
+
|
|
|
+def test_public_settings_getter_returns_dict_with_public_settings(
|
|
|
+ cache_versions, public_setting
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ public_settings = settings.get_public_settings()
|
|
|
+ assert public_settings["public_setting"] == "Hello"
|
|
|
+
|
|
|
+
|
|
|
+def test_public_settings_getter_excludes_private_settings_from_dict(
|
|
|
+ cache_versions, private_setting
|
|
|
+):
|
|
|
+ settings = DynamicSettings(cache_versions)
|
|
|
+ public_settings = settings.get_public_settings()
|
|
|
+ assert "private_setting" not in public_settings
|