2021-03-22 07:47:00 +02:00

225 lines
7.2 KiB
Python

from django.conf import settings
from django.db.models import F
from django.test import TestCase, override_settings
from django.utils import translation
from localized_fields.value import LocalizedValue
from .data import get_init_values
class LocalizedValueTestCase(TestCase):
"""Tests the :see:LocalizedValue class."""
@staticmethod
def tearDown():
"""Assures that the current language is set back to the default."""
translation.activate(settings.LANGUAGE_CODE)
@staticmethod
def test_init():
"""Tests whether the __init__ function of the :see:LocalizedValue class
works as expected."""
keys = get_init_values()
value = LocalizedValue(keys)
for lang_code, _ in settings.LANGUAGES:
assert getattr(value, lang_code, None) == keys[lang_code]
@staticmethod
def test_init_default_values():
"""Tests whether the __init__ function of the :see:LocalizedValue
accepts the default value or an empty dict properly."""
value = LocalizedValue()
for lang_code, _ in settings.LANGUAGES:
assert getattr(value, lang_code) is None
@staticmethod
def test_is_empty():
"""Tests whether a newly constructed :see:LocalizedValue without any
content is considered "empty"."""
value = LocalizedValue()
assert value.is_empty()
value.set(settings.LANGUAGE_CODE, "my value")
assert not value.is_empty()
@staticmethod
def test_init_array():
"""Tests whether the __init__ function of :see:LocalizedValue properly
handles an array.
Arrays can be passed to LocalizedValue as a result of a ArrayAgg
operation.
"""
value = LocalizedValue(["my value"])
assert value.get(settings.LANGUAGE_CODE) == "my value"
@staticmethod
def test_get_explicit():
"""Tests whether the the :see:LocalizedValue class's :see:get function
works properly when specifying an explicit value."""
keys = get_init_values()
localized_value = LocalizedValue(keys)
for language, value in keys.items():
assert localized_value.get(language) == value
@staticmethod
def test_get_default_language():
"""Tests whether the :see:LocalizedValue class's see:get function
properly gets the value in the default language."""
keys = get_init_values()
localized_value = LocalizedValue(keys)
for language, _ in keys.items():
translation.activate(language)
assert localized_value.get() == keys[settings.LANGUAGE_CODE]
@staticmethod
def test_set():
"""Tests whether the :see:LocalizedValue class's see:set function works
properly."""
localized_value = LocalizedValue()
for language, value in get_init_values():
localized_value.set(language, value)
assert localized_value.get(language) == value
assert getattr(localized_value, language) == value
@staticmethod
def test_eq():
"""Tests whether the __eq__ operator of :see:LocalizedValue works
properly."""
a = LocalizedValue({"en": "a", "ar": "b"})
b = LocalizedValue({"en": "a", "ar": "b"})
assert a == b
b.en = "b"
assert a != b
@staticmethod
def test_translate():
"""Tests whether the :see:LocalizedValue class's __str__ works
properly."""
keys = get_init_values()
localized_value = LocalizedValue(keys)
for language, value in keys.items():
translation.activate(language)
assert localized_value.translate() == value
@staticmethod
def test_translate_fallback():
"""Tests whether the :see:LocalizedValue class's translate()'s fallback
functionality works properly."""
test_value = "myvalue"
localized_value = LocalizedValue({settings.LANGUAGE_CODE: test_value})
other_language = settings.LANGUAGES[-1][0]
# make sure that, by default it returns
# the value in the default language
assert localized_value.translate() == test_value
# make sure that it falls back to the
# primary language when there's no value
# available in the current language
translation.activate(other_language)
assert localized_value.translate() == test_value
# make sure that it's just __str__ falling
# back and that for the other language
# there's no actual value
assert localized_value.get(other_language) != test_value
@staticmethod
def test_translate_none():
"""Tests whether the :see:LocalizedValue class's translate() method
properly returns None when there is no value."""
# with no value, we always expect it to return None
localized_value = LocalizedValue()
assert localized_value.translate() is None
assert str(localized_value) == ""
# with no value for the default language, the default
# behavior is to return None, unless a custom fallback
# chain is configured, which there is not for this test
other_language = settings.LANGUAGES[-1][0]
localized_value = LocalizedValue({other_language: "hey"})
translation.activate(settings.LANGUAGE_CODE)
assert localized_value.translate() is None
assert str(localized_value) == ""
@staticmethod
def test_translate_fallback_custom_fallback():
"""Tests whether the :see:LocalizedValue class's translate()'s fallback
functionality properly respects the LOCALIZED_FIELDS_FALLBACKS
setting."""
fallbacks = {"nl": ["ro"]}
localized_value = LocalizedValue(
{settings.LANGUAGE_CODE: settings.LANGUAGE_CODE, "ro": "ro"}
)
with override_settings(LOCALIZED_FIELDS_FALLBACKS=fallbacks):
with translation.override("nl"):
assert localized_value.translate() == "ro"
@staticmethod
def test_translate_custom_language():
"""Tests whether the :see:LocalizedValue class's translate() ignores
the active language when one is specified explicitely."""
localized_value = LocalizedValue(
{settings.LANGUAGE_CODE: settings.LANGUAGE_CODE, "ro": "ro"}
)
with translation.override("en"):
assert localized_value.translate("ro") == "ro"
@staticmethod
def test_deconstruct():
"""Tests whether the :see:LocalizedValue class's :see:deconstruct
function works properly."""
keys = get_init_values()
value = LocalizedValue(keys)
path, args, kwargs = value.deconstruct()
assert args[0] == keys
@staticmethod
def test_construct_string():
"""Tests whether the :see:LocalizedValue's constructor assumes the
primary language when passing a single string."""
value = LocalizedValue("beer")
assert value.get(settings.LANGUAGE_CODE) == "beer"
@staticmethod
def test_construct_expression():
"""Tests whether passing expressions as values works properly and are
not converted to string."""
value = LocalizedValue(dict(en=F("other")))
assert isinstance(value.en, F)