mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-24 19:32:53 +03:00
131 lines
3.8 KiB
Python
131 lines
3.8 KiB
Python
"""isort:skip_file."""
|
|
|
|
import sys
|
|
import html
|
|
|
|
import pytest
|
|
|
|
from django.conf import settings
|
|
from django.test import TestCase
|
|
|
|
from localized_fields.fields import LocalizedBleachField
|
|
from localized_fields.value import LocalizedValue
|
|
|
|
try:
|
|
import bleach
|
|
|
|
from django_bleach.utils import get_bleach_default_options
|
|
except ImportError:
|
|
if sys.version_info >= (3, 9):
|
|
pytest.skip("feature not ready for python 3.9", allow_module_level=True)
|
|
|
|
|
|
class ModelTest:
|
|
"""Used to declare a bleach-able field on."""
|
|
|
|
def __init__(self, value):
|
|
"""Initializes a new instance of :see:ModelTest.
|
|
|
|
Arguments:
|
|
The value to initialize with.
|
|
"""
|
|
|
|
self.value = value
|
|
|
|
|
|
class LocalizedBleachFieldTestCase(TestCase):
|
|
"""Tests the :see:LocalizedBleachField class."""
|
|
|
|
def test_pre_save(self):
|
|
"""Tests whether the :see:pre_save function bleaches all values in a
|
|
:see:LocalizedValue."""
|
|
|
|
value = self._get_test_value()
|
|
model, field = self._get_test_model(value)
|
|
|
|
bleached_value = field.pre_save(model, False)
|
|
self._validate(value, bleached_value)
|
|
|
|
def test_pre_save_none(self):
|
|
"""Tests whether the :see:pre_save function works properly when
|
|
specifying :see:None."""
|
|
|
|
model, field = self._get_test_model(None)
|
|
|
|
bleached_value = field.pre_save(model, False)
|
|
assert not bleached_value
|
|
|
|
def test_pre_save_none_values(self):
|
|
"""Tests whether the :see:pre_save function works properly when one of
|
|
the languages has no text and is None."""
|
|
|
|
value = self._get_test_value()
|
|
value.set(settings.LANGUAGE_CODE, None)
|
|
|
|
model, field = self._get_test_model(value)
|
|
|
|
bleached_value = field.pre_save(model, False)
|
|
self._validate(value, bleached_value)
|
|
|
|
def test_pre_save_do_not_escape(self):
|
|
"""Tests whether the :see:pre_save function works properly when field
|
|
escape argument is set to False."""
|
|
|
|
value = self._get_test_value()
|
|
model, field = self._get_test_model(value, escape=False)
|
|
|
|
bleached_value = field.pre_save(model, False)
|
|
self._validate(value, bleached_value, False)
|
|
|
|
@staticmethod
|
|
def _get_test_model(value, escape=True):
|
|
"""Gets a test model and an artificially constructed
|
|
:see:LocalizedBleachField instance to test with."""
|
|
|
|
model = ModelTest(value)
|
|
|
|
field = LocalizedBleachField(escape=escape)
|
|
field.attname = "value"
|
|
return model, field
|
|
|
|
@staticmethod
|
|
def _get_test_value():
|
|
"""Gets a :see:LocalizedValue instance for testing."""
|
|
|
|
value = LocalizedValue()
|
|
|
|
for lang_code, lang_name in settings.LANGUAGES:
|
|
value.set(lang_code, "<script>%s</script>" % lang_name)
|
|
|
|
return value
|
|
|
|
@staticmethod
|
|
def _validate(non_bleached_value, bleached_value, escaped_value=True):
|
|
"""Validates whether the specified non-bleached value ended up being
|
|
correctly bleached.
|
|
|
|
Arguments:
|
|
non_bleached_value:
|
|
The value before bleaching.
|
|
|
|
bleached_value:
|
|
The value after bleaching.
|
|
"""
|
|
for lang_code, _ in settings.LANGUAGES:
|
|
if not non_bleached_value.get(lang_code):
|
|
assert not bleached_value.get(lang_code)
|
|
continue
|
|
|
|
cleaned_value = bleach.clean(
|
|
non_bleached_value.get(lang_code)
|
|
if escaped_value
|
|
else html.unescape(non_bleached_value.get(lang_code)),
|
|
get_bleach_default_options(),
|
|
)
|
|
|
|
expected_value = (
|
|
cleaned_value if escaped_value else html.unescape(cleaned_value)
|
|
)
|
|
|
|
assert bleached_value.get(lang_code) == expected_value
|