mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-25 11:42:54 +03:00
This will be a superior version of LocalizedAutoSlugField, but one that doesn't have concurrency issues and takes advantage of the new UNIQUE CONSTRAINTs.
159 lines
4.5 KiB
Python
159 lines
4.5 KiB
Python
from django import forms
|
|
from django.conf import settings
|
|
from django.test import TestCase
|
|
from django.utils.text import slugify
|
|
|
|
from localized_fields import LocalizedField, LocalizedAutoSlugField, LocalizedMagicSlugField
|
|
|
|
from .fake_model import get_fake_model
|
|
|
|
|
|
class LocalizedSlugFieldTestCase(TestCase):
|
|
"""Tests the localized slug classes."""
|
|
|
|
AutoSlugModel = None
|
|
MagicSlugModel = None
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
"""Creates the test models in the database."""
|
|
|
|
super(LocalizedSlugFieldTestCase, cls).setUpClass()
|
|
|
|
cls.AutoSlugModel = get_fake_model(
|
|
'LocalizedAutoSlugFieldTestModel',
|
|
{
|
|
'title': LocalizedField(),
|
|
'slug': LocalizedAutoSlugField(populate_from='title')
|
|
}
|
|
)
|
|
|
|
cls.MagicSlugModel = get_fake_model(
|
|
'LocalizedMagicSlugFieldTestModel',
|
|
{
|
|
'title': LocalizedField(),
|
|
'slug': LocalizedMagicSlugField(populate_from='title')
|
|
}
|
|
)
|
|
|
|
@classmethod
|
|
def test_populate_auto(cls):
|
|
cls._test_populate(cls.AutoSlugModel)
|
|
|
|
@classmethod
|
|
def test_populate_magic(cls):
|
|
cls._test_populate(cls.MagicSlugModel)
|
|
|
|
@classmethod
|
|
def test_populate_multiple_languages_auto(cls):
|
|
cls._test_populate_multiple_languages(cls.AutoSlugModel)
|
|
|
|
@classmethod
|
|
def test_populate_multiple_languages_magic(cls):
|
|
cls._test_populate_multiple_languages(cls.MagicSlugModel)
|
|
|
|
@classmethod
|
|
def test_unique_slug_auto(cls):
|
|
cls._test_unique_slug(cls.AutoSlugModel)
|
|
|
|
@classmethod
|
|
def test_unique_slug_magic(cls):
|
|
cls._test_unique_slug(cls.MagicSlugModel)
|
|
|
|
@classmethod
|
|
def test_unique_slug_utf_auto(cls):
|
|
cls._test_unique_slug_utf(cls.AutoSlugModel)
|
|
|
|
@classmethod
|
|
def test_unique_slug_utf_magic(cls):
|
|
cls._test_unique_slug_utf(cls.MagicSlugModel)
|
|
|
|
@classmethod
|
|
def test_deconstruct_auto(cls):
|
|
cls._test_deconstruct(LocalizedAutoSlugField)
|
|
cls._test_deconstruct(LocalizedMagicSlugField)
|
|
|
|
@classmethod
|
|
def test_deconstruct_magic(cls):
|
|
cls._test_deconstruct(LocalizedMagicSlugField)
|
|
|
|
@classmethod
|
|
def test_formfield_auto(cls):
|
|
cls._test_formfield(LocalizedAutoSlugField)
|
|
|
|
@classmethod
|
|
def test_formfield_magic(cls):
|
|
cls._test_formfield(LocalizedMagicSlugField)
|
|
|
|
@staticmethod
|
|
def _test_populate(model):
|
|
"""Tests whether the populating feature works correctly."""
|
|
|
|
obj = model()
|
|
obj.title.en = 'this is my title'
|
|
obj.save()
|
|
|
|
assert obj.slug.get('en') == slugify(obj.title.en)
|
|
|
|
@staticmethod
|
|
def _test_populate_multiple_languages(model):
|
|
"""Tests whether the populating feature correctly
|
|
works for all languages."""
|
|
|
|
obj = model()
|
|
for lang_code, lang_name in settings.LANGUAGES:
|
|
obj.title.set(lang_code, 'title %s' % lang_name)
|
|
|
|
obj.save()
|
|
|
|
for lang_code, lang_name in settings.LANGUAGES:
|
|
assert obj.slug.get(lang_code) == 'title-%s' % lang_name.lower()
|
|
|
|
@staticmethod
|
|
def _test_unique_slug(model):
|
|
"""Tests whether unique slugs are properly generated."""
|
|
|
|
obj = model()
|
|
obj.title.en = 'title'
|
|
obj.save()
|
|
|
|
another_obj = model()
|
|
another_obj.title.en = 'title'
|
|
another_obj.save()
|
|
|
|
assert another_obj.slug.en == 'title-1'
|
|
|
|
@staticmethod
|
|
def _test_unique_slug_utf(model):
|
|
"""Tests whether generating a slug works
|
|
when the value consists completely out
|
|
of non-ASCII characters."""
|
|
|
|
obj = model()
|
|
obj.title.en = 'مكاتب للايجار بشارع بورسعيد'
|
|
obj.save()
|
|
|
|
assert obj.slug.en == 'مكاتب-للايجار-بشارع-بورسعيد'
|
|
|
|
@staticmethod
|
|
def _test_deconstruct(field_type):
|
|
"""Tests whether the :see:deconstruct
|
|
function properly retains options
|
|
specified in the constructor."""
|
|
|
|
field = field_type(populate_from='title')
|
|
_, _, _, kwargs = field.deconstruct()
|
|
|
|
assert 'populate_from' in kwargs
|
|
assert kwargs['populate_from'] == field.populate_from
|
|
|
|
@staticmethod
|
|
def _test_formfield(field_type):
|
|
"""Tests whether the :see:formfield method
|
|
returns a valid form field that is hidden."""
|
|
|
|
form_field = field_type(populate_from='title').formfield()
|
|
|
|
assert isinstance(form_field, forms.CharField)
|
|
assert isinstance(form_field.widget, forms.HiddenInput)
|