mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-24 19:32:53 +03:00
167 lines
6.0 KiB
Python
167 lines
6.0 KiB
Python
import json
|
|
import os
|
|
import pickle
|
|
import shutil
|
|
import tempfile as sys_tempfile
|
|
|
|
from django import forms
|
|
from django.core.files import temp as tempfile
|
|
from django.core.files.base import ContentFile, File
|
|
from django.test import TestCase, override_settings
|
|
|
|
from localized_fields.fields import LocalizedFileField
|
|
from localized_fields.fields.file_field import LocalizedFieldFile
|
|
from localized_fields.forms import LocalizedFileFieldForm
|
|
from localized_fields.value import LocalizedFileValue, LocalizedValue
|
|
from localized_fields.widgets import LocalizedFileWidget
|
|
|
|
from .fake_model import get_fake_model
|
|
|
|
MEDIA_ROOT = sys_tempfile.mkdtemp()
|
|
|
|
|
|
@override_settings(MEDIA_ROOT=MEDIA_ROOT)
|
|
class LocalizedFileFieldTestCase(TestCase):
|
|
"""Tests the localized slug classes."""
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
"""Creates the test models in the database."""
|
|
|
|
super().setUpClass()
|
|
|
|
cls.FileFieldModel = get_fake_model({"file": LocalizedFileField()})
|
|
if not os.path.isdir(MEDIA_ROOT):
|
|
os.makedirs(MEDIA_ROOT)
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super().tearDownClass()
|
|
shutil.rmtree(MEDIA_ROOT)
|
|
|
|
@classmethod
|
|
def test_assign(cls):
|
|
"""Tests whether the :see:LocalizedFileValueDescriptor works
|
|
properly."""
|
|
|
|
temp_file = tempfile.NamedTemporaryFile(dir=MEDIA_ROOT)
|
|
instance = cls.FileFieldModel()
|
|
instance.file = {"en": temp_file.name}
|
|
assert isinstance(instance.file.en, LocalizedFieldFile)
|
|
assert instance.file.en.name == temp_file.name
|
|
|
|
field_dump = pickle.dumps(instance.file)
|
|
instance = cls.FileFieldModel()
|
|
instance.file = pickle.loads(field_dump)
|
|
assert instance.file.en.field == instance._meta.get_field("file")
|
|
assert instance.file.en.instance == instance
|
|
assert isinstance(instance.file.en, LocalizedFieldFile)
|
|
|
|
instance = cls.FileFieldModel()
|
|
instance.file = {"en": ContentFile("test", "testfilename")}
|
|
assert isinstance(instance.file.en, LocalizedFieldFile)
|
|
assert instance.file.en.name == "testfilename"
|
|
|
|
another_instance = cls.FileFieldModel()
|
|
another_instance.file = {"ro": instance.file.en}
|
|
assert another_instance == another_instance.file.ro.instance
|
|
assert another_instance.file.ro.lang == "ro"
|
|
|
|
@classmethod
|
|
def test_save_form_data(cls):
|
|
"""Tests whether the :see:save_form_data function correctly set a valid
|
|
value."""
|
|
|
|
instance = cls.FileFieldModel()
|
|
data = LocalizedFileValue({"en": False})
|
|
instance._meta.get_field("file").save_form_data(instance, data)
|
|
assert instance.file.en == ""
|
|
|
|
@classmethod
|
|
def test_pre_save(cls):
|
|
"""Tests whether the :see:pre_save function works properly."""
|
|
|
|
instance = cls.FileFieldModel()
|
|
instance.file = {"en": ContentFile("test", "testfilename")}
|
|
instance._meta.get_field("file").pre_save(instance, False)
|
|
assert instance.file.en._committed is True
|
|
|
|
@classmethod
|
|
def test_file_methods(cls):
|
|
"""Tests whether the :see:LocalizedFieldFile.delete method works
|
|
correctly."""
|
|
|
|
temp_file = File(tempfile.NamedTemporaryFile())
|
|
instance = cls.FileFieldModel()
|
|
# Calling delete on an unset FileField should not call the file deletion
|
|
# process, but fail silently
|
|
instance.file.en.delete()
|
|
instance.file.en.save("testfilename", temp_file)
|
|
assert instance.file.en.name == "testfilename"
|
|
instance.file.en.delete()
|
|
assert instance.file.en.name is None
|
|
|
|
@classmethod
|
|
def test_generate_filename(cls):
|
|
"""Tests whether the :see:LocalizedFieldFile.generate_filename method
|
|
works correctly."""
|
|
|
|
instance = cls.FileFieldModel()
|
|
field = instance._meta.get_field("file")
|
|
field.upload_to = "{lang}/"
|
|
filename = field.generate_filename(instance, "test", "en")
|
|
assert filename == "en/test"
|
|
field.upload_to = lambda instance, filename, lang: "%s_%s" % (
|
|
lang,
|
|
filename,
|
|
)
|
|
filename = field.generate_filename(instance, "test", "en")
|
|
assert filename == "en_test"
|
|
|
|
@classmethod
|
|
@override_settings(LANGUAGES=(("en", "English"),))
|
|
def test_value_to_string(cls):
|
|
"""Tests whether the :see:LocalizedFileField class's
|
|
:see:value_to_string function works properly."""
|
|
|
|
temp_file = File(tempfile.NamedTemporaryFile())
|
|
instance = cls.FileFieldModel()
|
|
field = cls.FileFieldModel._meta.get_field("file")
|
|
field.upload_to = ""
|
|
instance.file.en.save("testfilename", temp_file)
|
|
expected_value_to_string = json.dumps({"en": "testfilename"})
|
|
assert field.value_to_string(instance) == expected_value_to_string
|
|
|
|
@staticmethod
|
|
def test_get_prep_value():
|
|
"""Tests whether the :see:get_prep_value function returns correctly
|
|
value."""
|
|
|
|
value = LocalizedValue({"en": None})
|
|
assert LocalizedFileField().get_prep_value(None) is None
|
|
assert isinstance(LocalizedFileField().get_prep_value(value), dict)
|
|
assert LocalizedFileField().get_prep_value(value)["en"] == ""
|
|
|
|
@staticmethod
|
|
def test_formfield():
|
|
"""Tests whether the :see:formfield function correctly returns a valid
|
|
form."""
|
|
|
|
form_field = LocalizedFileField().formfield()
|
|
assert isinstance(form_field, LocalizedFileFieldForm)
|
|
assert isinstance(form_field, forms.FileField)
|
|
assert isinstance(form_field.widget, LocalizedFileWidget)
|
|
|
|
@staticmethod
|
|
def test_deconstruct():
|
|
"""Tests whether the :see:LocalizedFileField class's :see:deconstruct
|
|
function works properly."""
|
|
|
|
name, path, args, kwargs = LocalizedFileField().deconstruct()
|
|
assert "upload_to" in kwargs
|
|
assert "storage" not in kwargs
|
|
name, path, args, kwargs = LocalizedFileField(
|
|
storage="test"
|
|
).deconstruct()
|
|
assert "storage" in kwargs
|