diff --git a/avatar/tests.py b/avatar/tests.py index db291fa..cc0cbdd 100644 --- a/avatar/tests.py +++ b/avatar/tests.py @@ -7,15 +7,24 @@ from django.conf import settings from django.contrib.auth.models import User -from avatar import AVATAR_DEFAULT_URL +from avatar import AVATAR_DEFAULT_URL, AVATAR_MAX_AVATARS_PER_USER from avatar.util import get_primary_avatar +from avatar.models import Avatar try: from PIL import Image dir(Image) # Placate PyFlakes except ImportError: import Image + +def upload_helper(o, filename): + f = open(os.path.join(o.testdatapath, filename), "rb") + response = o.client.post(reverse('avatar_add'), { + 'avatar': f, + }) + f.close() + return response class AvatarUploadTests(TestCase): @@ -28,49 +37,32 @@ class AvatarUploadTests(TestCase): Image.init() def testNonImageUpload(self): - f = open(os.path.join(self.testdatapath, "nonimagefile"), "rb") - response = self.client.post(reverse('avatar_add'), { - 'avatar': f, - }) - f.close() + response = upload_helper(self, "nonimagefile") self.failUnlessEqual(response.status_code, 200) self.failIfEqual(response.context['upload_avatar_form'].errors, {}) def testNormalImageUpload(self): - f = open(os.path.join(self.testdatapath,"test.png"), "rb") - response = self.client.post(reverse('avatar_add'), { - 'avatar': f, - }) - f.close() + response = upload_helper(self, "test.png") self.failUnlessEqual(response.status_code, 200) self.failUnlessEqual(response.context['upload_avatar_form'].errors, {}) avatar = get_primary_avatar(self.user) self.failIfEqual(avatar, None) def testImageWithoutExtension(self): - f = open(os.path.join(self.testdatapath,"imagefilewithoutext"), "rb") - response = self.client.post(reverse('avatar_add'), { - 'avatar': f, - }) - f.close() + # use with AVATAR_ALLOWED_FILE_EXTS = ('.jpg', '.png') + response = upload_helper(self, "imagefilewithoutext") self.failUnlessEqual(response.status_code, 200) - self.failUnlessEqual(response.context['upload_avatar_form'].errors, {}) + self.failIfEqual(response.context['upload_avatar_form'].errors, {}) def testImageWithWrongExtension(self): - f = open(os.path.join(self.testdatapath,"imagefilewithwrongext.ogg"), "rb") - response = self.client.post(reverse('avatar_add'), { - 'avatar': f, - }) - f.close() + # use with AVATAR_ALLOWED_FILE_EXTS = ('.jpg', '.png') + response = upload_helper(self, "imagefilewithwrongext.ogg") self.failUnlessEqual(response.status_code, 200) - self.failUnlessEqual(response.context['upload_avatar_form'].errors, {}) + self.failIfEqual(response.context['upload_avatar_form'].errors, {}) def testImageTooBig(self): - f = open(os.path.join(self.testdatapath,"testbig.png"), "rb") - response = self.client.post(reverse('avatar_add'), { - 'avatar': f, - }) - f.close() + # use with AVATAR_MAX_SIZE = 1024 * 1024 + response = upload_helper(self, "testbig.png") self.failUnlessEqual(response.status_code, 200) self.failIfEqual(response.context['upload_avatar_form'].errors, {}) @@ -89,11 +81,48 @@ class AvatarUploadTests(TestCase): def testNonExistingUser(self): a = get_primary_avatar("nonexistinguser") self.failUnlessEqual(a, None) + + def testThereCanBeOnlyOnePrimaryAvatar(self): + for i in range(1, 10): + self.testNormalImageUpload() + count = Avatar.objects.filter(user=self.user, primary=True).count() + self.failUnlessEqual(count, 1) + + def testDeleteAvatar(self): + self.testNormalImageUpload() + avatar = Avatar.objects.filter(user=self.user) + self.failUnlessEqual(len(avatar), 1) + response = self.client.post(reverse('avatar_delete'), { + 'choices': [avatar[0].id], + }) + self.failUnlessEqual(response.status_code, 302) + count = Avatar.objects.filter(user=self.user).count() + self.failUnlessEqual(count, 0) + + def testDeletePrimaryAvatarAndNewPrimary(self): + self.testThereCanBeOnlyOnePrimaryAvatar() + primary = get_primary_avatar(self.user) + oid = primary.id + response = self.client.post(reverse('avatar_delete'), { + 'choices': [oid], + }) + primaries = Avatar.objects.filter(user=self.user, primary=True) + self.failUnlessEqual(len(primaries), 1) + self.failIfEqual(oid, primaries[0].id) + avatars = Avatar.objects.filter(user=self.user) + self.failUnlessEqual(avatars[0].id, primaries[0].id) + + def testTooManyAvatars(self): + for i in range(0, AVATAR_MAX_AVATARS_PER_USER): + self.testNormalImageUpload() + count_before = Avatar.objects.filter(user=self.user).count() + response = upload_helper(self, "test.png") + count_after = Avatar.objects.filter(user=self.user).count() + self.failUnlessEqual(response.status_code, 200) + self.failIfEqual(response.context['upload_avatar_form'].errors, {}) + self.failUnlessEqual(count_before, count_after) - # def testDeleteAvatar - # def testDeletePrimaryAvatarAndNewPrimary # def testAvatarOrder - # def testTooManyAvatars # def testReplaceAvatarWhenMaxIsOne # def testHashFileName # def testHashUserName diff --git a/tests/settings.py b/tests/settings.py index 20e95b2..dbcd576 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -24,9 +24,13 @@ TEMPLATE_LOADERS = ( 'django.template.loaders.app_directories.load_template_source', ) +AVATAR_ALLOWED_FILE_EXTS = ('.jpg', '.png') +AVATAR_MAX_SIZE = 1024 * 1024 +AVATAR_MAX_AVATARS_PER_USER = 20 + urlpatterns = patterns('', (r'^avatar/', include('avatar.urls')), ) def __exported_functionality__(): - return (handler500, handler404) \ No newline at end of file + return (handler500, handler404)