mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-24 11:22:54 +03:00
225 lines
7.2 KiB
Python
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)
|