summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2010-02-23 22:39:22 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2010-02-23 22:39:22 +0000
commit5366aa96fef0ce55fc425cf273c7debe74d99305 (patch)
treeaf4e584bfc0fcdc4b7bb8e86d1f398e41e01d169 /tests
parent43b47a87d3ae075937b7dc181f8284576e5d73ac (diff)
Fixed #10258: handle duplicate file names better.
Instead of just continually appending "_" to duplicate file names, Django's default storage now appends `_1`, `_2`, `_3`, etc. Thanks to ianschenck and Thilo. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12552 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/files/models.py23
-rw-r--r--tests/regressiontests/file_storage/tests.py8
2 files changed, 21 insertions, 10 deletions
diff --git a/tests/modeltests/files/models.py b/tests/modeltests/files/models.py
index beea97e808..271fd8de9e 100644
--- a/tests/modeltests/files/models.py
+++ b/tests/modeltests/files/models.py
@@ -5,14 +5,11 @@
and where files should be stored.
"""
-import shutil
import random
import tempfile
from django.db import models
from django.core.files.base import ContentFile
-from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.files.storage import FileSystemStorage
-from django.core.cache import cache
temp_storage_location = tempfile.mkdtemp()
temp_storage = FileSystemStorage(location=temp_storage_location)
@@ -64,6 +61,7 @@ ValueError: The 'normal' attribute has no file associated with it.
# File objects can be assigned to FileField attributes, but shouldn't get
# committed until the model it's attached to is saved.
+>>> from django.core.files.uploadedfile import SimpleUploadedFile
>>> obj1.normal = SimpleUploadedFile('assignment.txt', 'content')
>>> dirs, files = temp_storage.listdir('tests')
>>> dirs
@@ -93,16 +91,17 @@ ValueError: The 'normal' attribute has no file associated with it.
>>> obj2 = Storage()
>>> obj2.normal.save('django_test.txt', ContentFile('more content'))
>>> obj2.normal
-<FieldFile: tests/django_test_.txt>
+<FieldFile: tests/django_test_1.txt>
>>> obj2.normal.size
12
# Push the objects into the cache to make sure they pickle properly
+>>> from django.core.cache import cache
>>> cache.set('obj1', obj1)
>>> cache.set('obj2', obj2)
>>> cache.get('obj2').normal
-<FieldFile: tests/django_test_.txt>
+<FieldFile: tests/django_test_1.txt>
# Deleting an object deletes the file it uses, if there are no other objects
# still using that file.
@@ -110,7 +109,17 @@ ValueError: The 'normal' attribute has no file associated with it.
>>> obj2.delete()
>>> obj2.normal.save('django_test.txt', ContentFile('more content'))
>>> obj2.normal
-<FieldFile: tests/django_test_.txt>
+<FieldFile: tests/django_test_1.txt>
+
+# Multiple files with the same name get _N appended to them.
+
+>>> objs = [Storage() for i in range(3)]
+>>> for o in objs:
+... o.normal.save('multiple_files.txt', ContentFile('Same Content'))
+>>> [o.normal for o in objs]
+[<FieldFile: tests/multiple_files.txt>, <FieldFile: tests/multiple_files_1.txt>, <FieldFile: tests/multiple_files_2.txt>]
+>>> for o in objs:
+... o.delete()
# Default values allow an object to access a single file.
@@ -139,5 +148,7 @@ ValueError: The 'normal' attribute has no file associated with it.
>>> obj2.normal.delete()
>>> obj3.default.delete()
>>> obj4.random.delete()
+
+>>> import shutil
>>> shutil.rmtree(temp_storage_location)
"""}
diff --git a/tests/regressiontests/file_storage/tests.py b/tests/regressiontests/file_storage/tests.py
index 81ea48950c..b1e31d1811 100644
--- a/tests/regressiontests/file_storage/tests.py
+++ b/tests/regressiontests/file_storage/tests.py
@@ -126,9 +126,9 @@ class FileSaveRaceConditionTest(TestCase):
name = self.save_file('conflict')
self.thread.join()
self.assert_(self.storage.exists('conflict'))
- self.assert_(self.storage.exists('conflict_'))
+ self.assert_(self.storage.exists('conflict_1'))
self.storage.delete('conflict')
- self.storage.delete('conflict_')
+ self.storage.delete('conflict_1')
class FileStoragePermissions(TestCase):
def setUp(self):
@@ -167,7 +167,7 @@ class FileStoragePathParsing(TestCase):
self.failIf(os.path.exists(os.path.join(self.storage_dir, 'dotted_.path')))
self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test')))
- self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test_')))
+ self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test_1')))
def test_first_character_dot(self):
"""
@@ -183,7 +183,7 @@ class FileStoragePathParsing(TestCase):
if sys.version_info < (2, 6):
self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/_.test')))
else:
- self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/.test_')))
+ self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/.test_1')))
if Image is not None:
class DimensionClosingBug(TestCase):