import json from django.conf import settings from django.db.utils import IntegrityError from django.test import TestCase from localized_fields.fields import LocalizedField from localized_fields.forms import LocalizedFieldForm from localized_fields.value import LocalizedValue from .data import get_init_values class LocalizedFieldTestCase(TestCase): """Tests the :see:LocalizedField class.""" @staticmethod def test_from_db_value(): """Tests whether the :see:from_db_value function produces the expected :see:LocalizedValue.""" input_data = get_init_values() localized_value = LocalizedField().from_db_value(input_data) for lang_code, _ in settings.LANGUAGES: assert getattr(localized_value, lang_code) == input_data[lang_code] @staticmethod def test_from_db_value_none(): """Tests whether the :see:from_db_value function correctly handles None values.""" localized_value = LocalizedField().from_db_value(None) for lang_code, _ in settings.LANGUAGES: assert localized_value.get(lang_code) is None def test_from_db_value_none_return_none(self): """Tests whether the :see:from_db_value function correctly handles None values when LOCALIZED_FIELDS_EXPERIMENTAL is set to True.""" with self.settings(LOCALIZED_FIELDS_EXPERIMENTAL=True): localized_value = LocalizedField.from_db_value(None) assert localized_value is None @staticmethod def test_to_python(): """Tests whether the :see:to_python function produces the expected :see:LocalizedValue.""" input_data = get_init_values() localized_value = LocalizedField().to_python(input_data) for language, value in input_data.items(): assert localized_value.get(language) == value @staticmethod def test_to_python_non_json(): """Tests whether the :see:to_python function properly handles a string that is not JSON.""" localized_value = LocalizedField().to_python('my value') assert localized_value.get() == 'my value' @staticmethod def test_to_python_none(): """Tests whether the :see:to_python function produces the expected :see:LocalizedValue instance when it is passes None.""" localized_value = LocalizedField().to_python(None) assert localized_value for lang_code, _ in settings.LANGUAGES: assert localized_value.get(lang_code) is None @staticmethod def test_to_python_non_dict(): """Tests whether the :see:to_python function produces the expected :see:LocalizedValue when it is passed a non-dictionary value.""" localized_value = LocalizedField().to_python(list()) assert localized_value for lang_code, _ in settings.LANGUAGES: assert localized_value.get(lang_code) is None @staticmethod def test_to_python_str(): """Tests whether the :see:to_python function produces the expected :see:LocalizedValue when it is passed serialized string value.""" serialized_str = json.dumps(get_init_values()) localized_value = LocalizedField().to_python(serialized_str) assert isinstance(localized_value, LocalizedValue) for language, value in get_init_values().items(): assert localized_value.get(language) == value assert getattr(localized_value, language) == value @staticmethod def test_get_prep_value(): """"Tests whether the :see:get_prep_value function produces the expected dictionary.""" input_data = get_init_values() localized_value = LocalizedValue(input_data) output_data = LocalizedField().get_prep_value(localized_value) for language, value in input_data.items(): assert language in output_data assert output_data.get(language) == value @staticmethod def test_get_prep_value_none(): """Tests whether the :see:get_prep_value function produces the expected output when it is passed None.""" output_data = LocalizedField().get_prep_value(None) assert not output_data @staticmethod def test_get_prep_value_no_localized_value(): """Tests whether the :see:get_prep_value function produces the expected output when it is passed a non-LocalizedValue value.""" output_data = LocalizedField().get_prep_value(['huh']) assert not output_data def test_get_prep_value_clean(self): """Tests whether the :see:get_prep_value produces None as the output when it is passed an empty, but valid LocalizedValue value but, only when null=True.""" localized_value = LocalizedValue() with self.assertRaises(IntegrityError): LocalizedField(null=False).get_prep_value(localized_value) assert not LocalizedField(null=True).get_prep_value(localized_value) assert not LocalizedField().clean(None) assert not LocalizedField().clean(['huh']) @staticmethod def test_formfield(): """Tests whether the :see:formfield function correctly returns a valid form.""" assert isinstance( LocalizedField().formfield(), LocalizedFieldForm )