diff --git a/tests/bug639/__init__.py b/tests/admin_autodiscover/__init__.py similarity index 100% rename from tests/bug639/__init__.py rename to tests/admin_autodiscover/__init__.py diff --git a/tests/bug8245/admin.py b/tests/admin_autodiscover/admin.py similarity index 100% rename from tests/bug8245/admin.py rename to tests/admin_autodiscover/admin.py diff --git a/tests/bug8245/models.py b/tests/admin_autodiscover/models.py similarity index 100% rename from tests/bug8245/models.py rename to tests/admin_autodiscover/models.py diff --git a/tests/bug8245/tests.py b/tests/admin_autodiscover/tests.py similarity index 89% rename from tests/bug8245/tests.py rename to tests/admin_autodiscover/tests.py index 7a91d04af1..af5aebcd7f 100644 --- a/tests/bug8245/tests.py +++ b/tests/admin_autodiscover/tests.py @@ -3,12 +3,12 @@ from unittest import TestCase from django.contrib import admin -class Bug8245Test(TestCase): +class AdminAutoDiscoverTests(TestCase): """ Test for bug #8245 - don't raise an AlreadyRegistered exception when using autodiscover() and an admin.py module contains an error. """ - def test_bug_8245(self): + def test_double_call_autodiscover(self): # The first time autodiscover is called, we should get our real error. with self.assertRaises(Exception) as cm: admin.autodiscover() diff --git a/tests/bug639/models.py b/tests/bug639/models.py deleted file mode 100644 index db34532025..0000000000 --- a/tests/bug639/models.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -import tempfile - -from django.core.files.storage import FileSystemStorage -from django.db import models -from django.forms import ModelForm - - -temp_storage_dir = tempfile.mkdtemp(dir=os.environ['DJANGO_TEST_TEMP_DIR']) -temp_storage = FileSystemStorage(temp_storage_dir) - - -class Photo(models.Model): - title = models.CharField(max_length=30) - image = models.FileField(storage=temp_storage, upload_to='tests') - - # Support code for the tests; this keeps track of how many times save() - # gets called on each instance. - def __init__(self, *args, **kwargs): - super(Photo, self).__init__(*args, **kwargs) - self._savecount = 0 - - def save(self, force_insert=False, force_update=False): - super(Photo, self).save(force_insert, force_update) - self._savecount += 1 - - -class PhotoForm(ModelForm): - class Meta: - model = Photo - fields = '__all__' diff --git a/tests/bug639/test.jpg b/tests/bug639/test.jpg deleted file mode 100644 index 391b57a0f3..0000000000 Binary files a/tests/bug639/test.jpg and /dev/null differ diff --git a/tests/bug639/tests.py b/tests/bug639/tests.py deleted file mode 100644 index 26e172ab50..0000000000 --- a/tests/bug639/tests.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Tests for file field behavior, and specifically #639, in which Model.save() -gets called *again* for each FileField. This test will fail if calling a -ModelForm's save() method causes Model.save() to be called more than once. -""" - -import os -import shutil -import unittest - -from django.core.files.uploadedfile import SimpleUploadedFile -from django.utils._os import upath - -from .models import Photo, PhotoForm, temp_storage_dir - - -class Bug639Test(unittest.TestCase): - - def test_bug_639(self): - """ - Simulate a file upload and check how many times Model.save() gets - called. - """ - # Grab an image for testing. - filename = os.path.join(os.path.dirname(upath(__file__)), "test.jpg") - with open(filename, "rb") as fp: - img = fp.read() - - # Fake a POST QueryDict and FILES MultiValueDict. - data = {'title': 'Testing'} - files = {"image": SimpleUploadedFile('test.jpg', img, 'image/jpeg')} - - form = PhotoForm(data=data, files=files) - p = form.save() - - # Check the savecount stored on the object (see the model). - self.assertEqual(p._savecount, 1) - - def tearDown(self): - """ - Make sure to delete the "uploaded" file to avoid clogging /tmp. - """ - p = Photo.objects.get() - p.image.delete(save=False) - shutil.rmtree(temp_storage_dir) diff --git a/tests/bug8245/__init__.py b/tests/bug8245/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py index d327a5f074..1b5ae90b07 100644 --- a/tests/model_forms/models.py +++ b/tests/model_forms/models.py @@ -407,3 +407,19 @@ class StumpJoke(models.Model): class Student(models.Model): character = models.ForeignKey(Character) study = models.CharField(max_length=30) + + +# Model for #639 +class Photo(models.Model): + title = models.CharField(max_length=30) + image = models.FileField(storage=temp_storage, upload_to='tests') + + # Support code for the tests; this keeps track of how many times save() + # gets called on each instance. + def __init__(self, *args, **kwargs): + super(Photo, self).__init__(*args, **kwargs) + self._savecount = 0 + + def save(self, force_insert=False, force_update=False): + super(Photo, self).save(force_insert, force_update) + self._savecount += 1 diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 783a0316f7..03a498c4cd 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -20,7 +20,7 @@ from django.utils import six from .models import (Article, ArticleStatus, Author, Author1, BetterWriter, BigInt, Book, Category, CommaSeparatedInteger, CustomFF, CustomFieldForExclusionModel, DerivedBook, DerivedPost, Document, ExplicitPK, FilePathModel, FlexibleDatePost, Homepage, - ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Person, Post, Price, + ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Person, Photo, Post, Price, Product, Publication, TextFile, Triple, Writer, WriterProfile, Colour, ColourfulItem, DateTimePost, CustomErrorMessage, test_images, StumpJoke, Character, Student) @@ -1856,6 +1856,36 @@ class FileAndImageFieldTests(TestCase): form = CFFForm(data={'f': None}) form.save() + def test_file_field_multiple_save(self): + """ + Simulate a file upload and check how many times Model.save() gets + called. Test for bug #639. + """ + class PhotoForm(forms.ModelForm): + class Meta: + model = Photo + fields = '__all__' + + # Grab an image for testing. + filename = os.path.join(os.path.dirname(upath(__file__)), "test.png") + with open(filename, "rb") as fp: + img = fp.read() + + # Fake a POST QueryDict and FILES MultiValueDict. + data = {'title': 'Testing'} + files = {"image": SimpleUploadedFile('test.png', img, 'image/png')} + + form = PhotoForm(data=data, files=files) + p = form.save() + + try: + # Check the savecount stored on the object (see the model). + self.assertEqual(p._savecount, 1) + finally: + # Delete the "uploaded" file to avoid clogging /tmp. + p = Photo.objects.get() + p.image.delete(save=False) + def test_file_path_field_blank(self): """ Regression test for #8842: FilePathField(blank=True)