1
0
mirror of https://github.com/django/django.git synced 2024-12-31 21:46:05 +00:00
django/tests/forms_tests/field_tests/test_filepathfield.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

114 lines
4.2 KiB
Python
Raw Normal View History

import os.path
from django.core.exceptions import ValidationError
from django.forms import FilePathField
from django.test import SimpleTestCase
PATH = os.path.dirname(os.path.abspath(__file__))
def fix_os_paths(x):
if isinstance(x, str):
return x.removeprefix(PATH).replace("\\", "/")
elif isinstance(x, tuple):
return tuple(fix_os_paths(list(x)))
elif isinstance(x, list):
return [fix_os_paths(y) for y in x]
else:
return x
class FilePathFieldTest(SimpleTestCase):
expected_choices = [
("/filepathfield_test_dir/__init__.py", "__init__.py"),
("/filepathfield_test_dir/a.py", "a.py"),
("/filepathfield_test_dir/ab.py", "ab.py"),
("/filepathfield_test_dir/b.py", "b.py"),
("/filepathfield_test_dir/c/__init__.py", "__init__.py"),
("/filepathfield_test_dir/c/d.py", "d.py"),
("/filepathfield_test_dir/c/e.py", "e.py"),
("/filepathfield_test_dir/c/f/__init__.py", "__init__.py"),
("/filepathfield_test_dir/c/f/g.py", "g.py"),
("/filepathfield_test_dir/h/__init__.py", "__init__.py"),
("/filepathfield_test_dir/j/__init__.py", "__init__.py"),
]
path = os.path.join(PATH, "filepathfield_test_dir") + "/"
def assertChoices(self, field, expected_choices):
self.assertEqual(fix_os_paths(field.choices), expected_choices)
def test_fix_os_paths(self):
self.assertEqual(fix_os_paths(self.path), ("/filepathfield_test_dir/"))
def test_nonexistent_path(self):
with self.assertRaisesMessage(FileNotFoundError, "nonexistent"):
FilePathField(path="nonexistent")
def test_no_options(self):
f = FilePathField(path=self.path)
expected = [
("/filepathfield_test_dir/README", "README"),
] + self.expected_choices[:4]
self.assertChoices(f, expected)
def test_clean(self):
f = FilePathField(path=self.path)
msg = "'Select a valid choice. a.py is not one of the available choices.'"
with self.assertRaisesMessage(ValidationError, msg):
f.clean("a.py")
self.assertEqual(
fix_os_paths(f.clean(self.path + "a.py")), "/filepathfield_test_dir/a.py"
)
def test_match(self):
f = FilePathField(path=self.path, match=r"^.*?\.py$")
self.assertChoices(f, self.expected_choices[:4])
def test_recursive(self):
f = FilePathField(path=self.path, recursive=True, match=r"^.*?\.py$")
expected = [
("/filepathfield_test_dir/__init__.py", "__init__.py"),
("/filepathfield_test_dir/a.py", "a.py"),
("/filepathfield_test_dir/ab.py", "ab.py"),
("/filepathfield_test_dir/b.py", "b.py"),
("/filepathfield_test_dir/c/__init__.py", "c/__init__.py"),
("/filepathfield_test_dir/c/d.py", "c/d.py"),
("/filepathfield_test_dir/c/e.py", "c/e.py"),
("/filepathfield_test_dir/c/f/__init__.py", "c/f/__init__.py"),
("/filepathfield_test_dir/c/f/g.py", "c/f/g.py"),
("/filepathfield_test_dir/h/__init__.py", "h/__init__.py"),
("/filepathfield_test_dir/j/__init__.py", "j/__init__.py"),
]
self.assertChoices(f, expected)
def test_allow_folders(self):
f = FilePathField(path=self.path, allow_folders=True, allow_files=False)
self.assertChoices(
f,
[
("/filepathfield_test_dir/c", "c"),
("/filepathfield_test_dir/h", "h"),
("/filepathfield_test_dir/j", "j"),
],
)
def test_recursive_no_folders_or_files(self):
f = FilePathField(
path=self.path, recursive=True, allow_folders=False, allow_files=False
)
self.assertChoices(f, [])
def test_recursive_folders_without_files(self):
f = FilePathField(
path=self.path, recursive=True, allow_folders=True, allow_files=False
)
self.assertChoices(
f,
[
("/filepathfield_test_dir/c", "c"),
("/filepathfield_test_dir/h", "h"),
("/filepathfield_test_dir/j", "j"),
("/filepathfield_test_dir/c/f", "c/f"),
],
)