Browse Source

Tests harness for avatar upload

Rafał Pitoń 11 years ago
parent
commit
63a0ecf884

+ 1 - 1
misago/users/avatars/uploaded.py

@@ -41,7 +41,7 @@ def validate_dimensions(uploaded_file):
         message = _("Uploaded image should be at "
                     "least 100 pixels tall and wide.")
         raise ValidationError(message)
-    image = Image.open(uploaded_file)
+
     if image.size[0] * image.size[1] > 2000 * 3000:
         message = _("Uploaded image is too big.")
         raise ValidationError(message)

+ 55 - 1
misago/users/tests/test_avatars.py

@@ -2,11 +2,12 @@ from path import path
 from PIL import Image
 
 from django.contrib.auth import get_user_model
+from django.core.exceptions import ValidationError
 from django.test import TestCase
 
 from misago.conf import settings
 
-from misago.users.avatars import store, dynamic, gallery, gravatar
+from misago.users.avatars import store, dynamic, gallery, gravatar, uploaded
 from misago.users.avatars.paths import AVATARS_STORE
 
 
@@ -90,3 +91,56 @@ class AvatarSetterTests(TestCase):
         self.assertNoAvatarIsSet()
         gravatar.set_avatar(self.user)
         self.assertAvatarWasSet()
+
+
+class MockAvatarFile(object):
+    def __init__(self, size=None, name=None, mime=None):
+        self.size = size
+        self.name = name
+        self.content_type = mime
+
+
+class UploadedAvatarTests(TestCase):
+    def test_crop(self):
+        """crop validation and clear"""
+        image = Image.new("RGBA", (200, 200), 0)
+        with self.assertRaises(ValidationError):
+            uploaded.crop_string_to_dict(image, "abc")
+        with self.assertRaises(ValidationError):
+            uploaded.crop_string_to_dict(image, "2,2,4,a")
+        with self.assertRaises(ValidationError):
+            uploaded.crop_string_to_dict(image, "300,300,400,400,0,0,10,10")
+
+        uploaded.crop_string_to_dict(image, "200,200,90,90,0,0,90,90")
+
+    def test_uploaded_image_size_validation(self):
+        """uploaded image size is validated"""
+        image = MockAvatarFile(size=settings.avatar_upload_limit * 2024)
+        with self.assertRaises(ValidationError):
+            uploaded.validate_file_size(image)
+
+        image = MockAvatarFile(size=settings.avatar_upload_limit * 1000)
+        uploaded.validate_file_size(image)
+
+    def test_uploaded_image_extension_validation(self):
+        """uploaded image extension is validated"""
+        for invalid_extension in ('.txt', '.zip', '.py', '.tiff'):
+            with self.assertRaises(ValidationError):
+                image = MockAvatarFile(name='test%s' % invalid_extension)
+                uploaded.validate_extension(image)
+
+        for valid_extension in uploaded.ALLOWED_EXTENSIONS:
+            image = MockAvatarFile(name='test%s' % valid_extension)
+            uploaded.validate_extension(image)
+
+    def test_uploaded_image_mime_validation(self):
+        """uploaded image mime type is validated"""
+        image = MockAvatarFile(mime='fake/mime')
+        with self.assertRaises(ValidationError):
+            uploaded.validate_mime(image)
+
+        for valid_mime in uploaded.ALLOWED_MIME_TYPES:
+            image = MockAvatarFile(mime=valid_mime)
+            uploaded.validate_mime(image)
+
+

+ 72 - 1
misago/users/tests/test_usercp_views.py

@@ -1,11 +1,15 @@
+from path import path
+
 from django.contrib.auth import get_user_model
 from django.core import mail
 from django.core.urlresolvers import reverse
 
 from misago.admin.testutils import AdminTestCase
-
+from misago.conf import settings
 from misago.core import threadstore
 
+from misago.users.avatars import store
+
 
 class ChangeForumOptionsTests(AdminTestCase):
     def setUp(self):
@@ -84,6 +88,73 @@ class ChangeAvatarTests(AdminTestCase):
         self.assertIn('New avatar based', response.content)
 
 
+class AvatarUploadTests(AdminTestCase):
+    def setUp(self):
+        super(AvatarUploadTests, self).setUp()
+        store.delete_avatar(self.test_admin)
+
+    def tearDown(self):
+        store.delete_avatar(self.test_admin)
+
+    def test_upload_form_view(self):
+        """upload view renders on get"""
+        response = self.client.get(reverse('misago:usercp_upload_avatar'))
+        self.assertEqual(response.status_code, 200)
+        self.assertIn('Upload avatar', response.content)
+
+    def test_upload_view(self):
+        """upload view renders on get"""
+        handler_link = reverse('misago:usercp_upload_avatar_handler')
+
+        response = self.client.get(handler_link)
+        self.assertEqual(response.status_code, 405)
+
+        ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+        response = self.client.post(handler_link,
+                                    data={'baww': 'nope'},
+                                    **ajax_header)
+
+        self.assertEqual(response.status_code, 406)
+        self.assertIn('No file was sent.', response.content)
+
+        with open('%s/%s' % (settings.MEDIA_ROOT, 'misago.png')) as avatar:
+            response = self.client.post(handler_link,
+                                        data={'new-avatar': avatar},
+                                        **ajax_header)
+            self.assertEqual(response.status_code, 200)
+
+            avatar_dir = store.get_existing_avatars_dir(self.test_admin)
+            avatar = path('%s/%s_tmp.png' % (avatar_dir, self.test_admin.pk))
+            self.assertTrue(avatar.exists())
+            self.assertTrue(avatar.isfile())
+
+    def test_crop_view(self):
+        """avatar gets cropped"""
+        with open('%s/%s' % (settings.MEDIA_ROOT, 'misago.png')) as avatar:
+            handler_link = reverse('misago:usercp_upload_avatar_handler')
+            ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+            response = self.client.post(handler_link,
+                                        data={'new-avatar': avatar},
+                                        **ajax_header)
+            self.assertEqual(response.status_code, 200)
+
+            crop_link = reverse('misago:usercp_crop_new_avatar')
+            response = self.client.post(crop_link, data={'crop': '1245'})
+            self.assertEqual(response.status_code, 200)
+
+            test_crop = '619,201,150,150,0,0,150,150'
+            response = self.client.post(crop_link, data={'crop': test_crop})
+            self.assertEqual(response.status_code, 302)
+
+            avatar_dir = store.get_existing_avatars_dir(self.test_admin)
+            avatar = path('%s/%s_tmp.png' % (avatar_dir, self.test_admin.pk))
+            self.assertFalse(avatar.exists())
+
+            avatar = path('%s/%s_org.png' % (avatar_dir, self.test_admin.pk))
+            self.assertTrue(avatar.exists())
+            self.assertTrue(avatar.isfile())
+
+
 class AvatarGalleryTests(AdminTestCase):
     def setUp(self):
         super(AvatarGalleryTests, self).setUp()