diff options
| author | Ben Cail <bcail@crossway.org> | 2024-03-26 11:25:29 -0400 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-05-21 07:28:12 +0200 |
| commit | 0b33a3abc2ca7d68a24f6d0772bc2b9fa603744e (patch) | |
| tree | e2e191d205a51a64ef9124e2eaa5a51c352f7eb6 /tests/file_storage | |
| parent | 6c48eed2383eb50191b59a64036b75cb46ae178e (diff) | |
Fixed #35326 -- Added allow_overwrite parameter to FileSystemStorage.
Diffstat (limited to 'tests/file_storage')
| -rw-r--r-- | tests/file_storage/tests.py | 100 |
1 files changed, 93 insertions, 7 deletions
diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py index 420314573d..fc3533ab7d 100644 --- a/tests/file_storage/tests.py +++ b/tests/file_storage/tests.py @@ -25,11 +25,18 @@ from django.core.files.uploadedfile import ( ) from django.db.models import FileField from django.db.models.fields.files import FileDescriptor -from django.test import LiveServerTestCase, SimpleTestCase, TestCase, override_settings +from django.test import ( + LiveServerTestCase, + SimpleTestCase, + TestCase, + ignore_warnings, + override_settings, +) from django.test.utils import requires_tz_support from django.urls import NoReverseMatch, reverse_lazy from django.utils import timezone from django.utils._os import symlinks_supported +from django.utils.deprecation import RemovedInDjango60Warning from .models import ( Storage, @@ -88,18 +95,18 @@ class FileStorageTests(SimpleTestCase): """ Standard file access options are available, and work as expected. """ - self.assertFalse(self.storage.exists("storage_test")) + self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "storage_test"))) f = self.storage.open("storage_test", "w") f.write("storage contents") f.close() - self.assertTrue(self.storage.exists("storage_test")) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "storage_test"))) f = self.storage.open("storage_test", "r") self.assertEqual(f.read(), "storage contents") f.close() self.storage.delete("storage_test") - self.assertFalse(self.storage.exists("storage_test")) + self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "storage_test"))) def _test_file_time_getter(self, getter): # Check for correct behavior under both USE_TZ=True and USE_TZ=False. @@ -268,10 +275,10 @@ class FileStorageTests(SimpleTestCase): """ Saving a pathname should create intermediate directories as necessary. """ - self.assertFalse(self.storage.exists("path/to")) + self.assertFalse(os.path.exists(os.path.join(self.temp_dir, "path/to"))) self.storage.save("path/to/test.file", ContentFile("file saved with path")) - self.assertTrue(self.storage.exists("path/to")) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "path/to"))) with self.storage.open("path/to/test.file") as f: self.assertEqual(f.read(), b"file saved with path") @@ -607,6 +614,7 @@ class CustomStorageTests(FileStorageTests): self.storage.delete(second) +# RemovedInDjango60Warning: Remove this class. class OverwritingStorage(FileSystemStorage): """ Overwrite existing files instead of appending a suffix to generate an @@ -621,7 +629,26 @@ class OverwritingStorage(FileSystemStorage): return name -class OverwritingStorageTests(FileStorageTests): +# RemovedInDjango60Warning: Remove this test class. +class OverwritingStorageOSOpenFlagsWarningTests(SimpleTestCase): + storage_class = OverwritingStorage + + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.temp_dir) + + def test_os_open_flags_deprecation_warning(self): + msg = "Overriding OS_OPEN_FLAGS is deprecated. Use the allow_overwrite " + msg += "parameter instead." + with self.assertWarnsMessage(RemovedInDjango60Warning, msg): + self.storage = self.storage_class( + location=self.temp_dir, base_url="/test_media_url/" + ) + + +# RemovedInDjango60Warning: Remove this test class. +@ignore_warnings(category=RemovedInDjango60Warning) +class OverwritingStorageOSOpenFlagsTests(FileStorageTests): storage_class = OverwritingStorage def test_save_overwrite_behavior(self): @@ -649,6 +676,65 @@ class OverwritingStorageTests(FileStorageTests): self.storage.delete(name) +class OverwritingStorageTests(FileStorageTests): + storage_class = FileSystemStorage + + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.temp_dir) + self.storage = self.storage_class( + location=self.temp_dir, base_url="/test_media_url/", allow_overwrite=True + ) + + def test_save_overwrite_behavior(self): + """Saving to same file name twice overwrites the first file.""" + name = "test.file" + self.assertFalse(self.storage.exists(name)) + content_1 = b"content one" + content_2 = b"second content" + f_1 = ContentFile(content_1) + f_2 = ContentFile(content_2) + stored_name_1 = self.storage.save(name, f_1) + try: + self.assertEqual(stored_name_1, name) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name))) + with self.storage.open(name) as fp: + self.assertEqual(fp.read(), content_1) + stored_name_2 = self.storage.save(name, f_2) + self.assertEqual(stored_name_2, name) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name))) + with self.storage.open(name) as fp: + self.assertEqual(fp.read(), content_2) + finally: + self.storage.delete(name) + + def test_save_overwrite_behavior_temp_file(self): + """Saving to same file name twice overwrites the first file.""" + name = "test.file" + self.assertFalse(self.storage.exists(name)) + content_1 = b"content one" + content_2 = b"second content" + f_1 = TemporaryUploadedFile("tmp1", "text/plain", 11, "utf8") + f_1.write(content_1) + f_1.seek(0) + f_2 = TemporaryUploadedFile("tmp2", "text/plain", 14, "utf8") + f_2.write(content_2) + f_2.seek(0) + stored_name_1 = self.storage.save(name, f_1) + try: + self.assertEqual(stored_name_1, name) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name))) + with self.storage.open(name) as fp: + self.assertEqual(fp.read(), content_1) + stored_name_2 = self.storage.save(name, f_2) + self.assertEqual(stored_name_2, name) + self.assertTrue(os.path.exists(os.path.join(self.temp_dir, name))) + with self.storage.open(name) as fp: + self.assertEqual(fp.read(), content_2) + finally: + self.storage.delete(name) + + class DiscardingFalseContentStorage(FileSystemStorage): def _save(self, name, content): if content: |
