1
0
mirror of https://github.com/django/django.git synced 2025-03-31 19:46:42 +00:00

test: for utils.archive, utils._os

This commit is contained in:
Sun 2023-06-08 12:21:25 +08:00
parent 5f2308710b
commit 57aabaf0a5
4 changed files with 138 additions and 1 deletions

View File

@ -0,0 +1 @@
I'm created to test unsupported format of `utils/archive.py`.

View File

@ -3,10 +3,12 @@ import stat
import sys import sys
import tempfile import tempfile
import unittest import unittest
from unittest.mock import Mock
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import SuspiciousOperation
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.utils import archive from django.utils import archive
from django.utils.archive import BaseArchive, TarArchive, UnrecognizedArchiveFormat
try: try:
import bz2 # NOQA import bz2 # NOQA
@ -78,6 +80,55 @@ class TestArchive(unittest.TestCase):
filepath = os.path.join(tmpdir, "no_permissions") filepath = os.path.join(tmpdir, "no_permissions")
self.assertEqual(os.stat(filepath).st_mode & mask, 0o666 & ~umask) self.assertEqual(os.stat(filepath).st_mode & mask, 0o666 & ~umask)
def test_extract_not_supported_format(self):
test_file_path = os.path.join(
os.path.dirname(__file__), "files", "archive_unsupported.txt"
)
with tempfile.TemporaryDirectory() as tmpdir:
with self.assertRaises(UnrecognizedArchiveFormat) as context:
archive.extract(test_file_path, tmpdir)
self.assertEqual(
"Path not a recognized archive format: %s" % test_file_path,
str(context.exception),
)
def test_extract_supported_extension_followed_by_unsupported_extension(self):
test_file_path = os.path.join(
os.path.dirname(__file__), "files", "archive_weird_extension.zip.txt"
)
with tempfile.TemporaryDirectory() as tmpdir:
archive.extract(test_file_path, tmpdir)
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "2")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "2")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "bar", "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "bar", "2")))
def test_extract_function_with_unsupported_instance(self):
with tempfile.TemporaryDirectory() as tmpdir:
with self.assertRaises(UnrecognizedArchiveFormat) as context:
# Accessing any attribute not in the spec will raise AttributeError.
file = Mock(spec=[])
archive.extract(file, tmpdir)
self.assertEqual(
"File object not a recognized archive format.",
str(context.exception),
)
def test_extract_function_with_file_instance(self):
test_file_path = os.path.join(
os.path.dirname(__file__), "archives", "foobar.tar"
)
with tempfile.TemporaryDirectory() as tmpdir:
archive.extract(test_file_path, tmpdir)
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "2")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "2")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "bar", "1")))
self.assertTrue(os.path.isfile(os.path.join(tmpdir, "foo", "bar", "2")))
class TestArchiveInvalid(SimpleTestCase): class TestArchiveInvalid(SimpleTestCase):
def test_extract_function_traversal(self): def test_extract_function_traversal(self):
@ -96,3 +147,73 @@ class TestArchiveInvalid(SimpleTestCase):
with self.subTest(entry), tempfile.TemporaryDirectory() as tmpdir: with self.subTest(entry), tempfile.TemporaryDirectory() as tmpdir:
with self.assertRaisesMessage(SuspiciousOperation, msg % invalid_path): with self.assertRaisesMessage(SuspiciousOperation, msg % invalid_path):
archive.extract(os.path.join(archives_dir, entry), tmpdir) archive.extract(os.path.join(archives_dir, entry), tmpdir)
class TestBaseArchive(unittest.TestCase):
def test_split_leading_dir_windows_style(self):
self.assertEqual(
["C:", "Documents\\Newsletters\\Summer2018.pdf"],
BaseArchive().split_leading_dir(
"C:\\Documents\\Newsletters\\Summer2018.pdf"
),
)
self.assertEqual(
["Documents", "Newsletters\\Summer2018.pdf"],
BaseArchive().split_leading_dir("\\Documents\\Newsletters\\Summer2018.pdf"),
)
self.assertEqual(
["C:Documents", "Newsletters\\Summer2018.pdf"],
BaseArchive().split_leading_dir("C:Documents\\Newsletters\\Summer2018.pdf"),
)
self.assertEqual(
["..", "Publications\\TravelBrochure.pdf"],
BaseArchive().split_leading_dir("..\\Publications\\TravelBrochure.pdf"),
)
self.assertEqual(
["Publications", "TravelBrochure.pdf"],
BaseArchive().split_leading_dir("Publications\\TravelBrochure.pdf"),
)
def test_has_leading_dir_has_no_prefix(self):
self.assertFalse(BaseArchive().has_leading_dir(["/\\/foo.pdf"]))
def test_extract(self):
with self.assertRaises(NotImplementedError) as context:
BaseArchive().extract()
self.assertEqual(
"subclasses of BaseArchive must provide an extract() method",
str(context.exception),
)
def test_list(self):
with self.assertRaises(NotImplementedError) as context:
BaseArchive().list()
self.assertEqual(
"subclasses of BaseArchive must provide a list() method",
str(context.exception),
)
class TestTarArchive(unittest.TestCase):
def test_extract_with_corrupt_file(self):
test_file_path = os.path.join(
os.path.dirname(__file__), "archives", "foobar.tar"
)
with tempfile.TemporaryDirectory() as tmpdir:
tar_archive = TarArchive(test_file_path)
tar_archive._archive.extractfile = Mock(side_effect=KeyError())
with self.assertRaises(
UnboundLocalError
): # this is possible bug, need to be changed when fixed
tar_archive.extract(tmpdir)
tar_archive._archive.extractfile = Mock(side_effect=AttributeError())
with self.assertRaises(
UnboundLocalError
): # this is possible bug, need to be changed when fixed
tar_archive.extract(tmpdir)
tar_archive.close()

View File

@ -1,9 +1,10 @@
import os import os
import unittest import unittest
from pathlib import Path from pathlib import Path
from unittest.mock import Mock
from django.core.exceptions import SuspiciousFileOperation from django.core.exceptions import SuspiciousFileOperation
from django.utils._os import safe_join, to_path from django.utils._os import safe_join, symlinks_supported, to_path
class SafeJoinTests(unittest.TestCase): class SafeJoinTests(unittest.TestCase):
@ -38,3 +39,17 @@ class ToPathTests(unittest.TestCase):
def test_to_path_invalid_value(self): def test_to_path_invalid_value(self):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
to_path(42) to_path(42)
class SymlinksSupportedTests(unittest.TestCase):
def test_supported(self):
os.symlink = Mock()
self.assertTrue(symlinks_supported())
def test_os_error(self):
os.symlink = Mock(side_effect=OSError("os_failed"))
self.assertFalse(symlinks_supported())
def test_not_implemented_error(self):
os.symlink = Mock(side_effect=NotImplementedError("not_implemented"))
self.assertFalse(symlinks_supported())