funkwhale/api/tests/common/test_preferences.py

91 wiersze
2.6 KiB
Python

import pytest
from dynamic_preferences import types
from dynamic_preferences.registries import global_preferences_registry
from rest_framework import serializers
from funkwhale_api.common import preferences as common_preferences
@pytest.fixture
def string_list_pref(preferences):
@global_preferences_registry.register
class P(common_preferences.StringListPreference):
default = ["hello"]
section = "test"
name = "string_list"
yield
del global_preferences_registry["test"]["string_list"]
@pytest.mark.parametrize(
"input,output",
[
(["a", "b", "c"], "a,b,c"),
(["a", "c", "b"], "a,b,c"),
(("a", "c", "b"), "a,b,c"),
([], None),
],
)
def test_string_list_serializer_to_db(input, output):
common_preferences.StringListSerializer.to_db(input) == output
@pytest.mark.parametrize(
"input,output", [("a,b,c", ["a", "b", "c"]), (None, []), ("", [])]
)
def test_string_list_serializer_to_python(input, output):
common_preferences.StringListSerializer.to_python(input) == output
def test_string_list_pref_default(string_list_pref, preferences):
assert preferences["test__string_list"] == ["hello"]
def test_string_list_pref_set(string_list_pref, preferences):
preferences["test__string_list"] = ["world", "hello"]
assert preferences["test__string_list"] == ["hello", "world"]
class PreferenceDataSerializer(serializers.Serializer):
name = serializers.CharField()
optional = serializers.BooleanField(required=False)
@pytest.fixture
def serialized_preference(db):
@global_preferences_registry.register
class TestSerialized(common_preferences.SerializedPreference):
section = types.Section("test")
name = "serialized"
data_serializer_class = PreferenceDataSerializer
default = None
required = False
yield
del global_preferences_registry["test"]["serialized"]
@pytest.mark.parametrize(
"value", [{"name": "hello"}, {"name": "hello", "optional": True}]
)
def test_get_serialized_preference(value, preferences, serialized_preference):
pref_id = "test__serialized"
# default value
assert preferences[pref_id] is None
preferences[pref_id] = value
assert preferences[pref_id] == value
@pytest.mark.parametrize(
"value", [{"noop": "hello"}, {"name": "hello", "optional": None}, "noop"]
)
def test_get_serialized_preference_error(value, preferences, serialized_preference):
pref_id = "test__serialized"
with pytest.raises(common_preferences.JSONSerializer.exception):
preferences[pref_id] = value