test_avatars.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from path import Path
  2. from PIL import Image
  3. from django.contrib.auth import get_user_model
  4. from django.core.exceptions import ValidationError
  5. from django.test import TestCase
  6. from misago.conf import settings
  7. from ..avatars import dynamic, gallery, gravatar, store, uploaded
  8. class AvatarsStoreTests(TestCase):
  9. def test_store(self):
  10. """store successfully stores and deletes avatar"""
  11. User = get_user_model()
  12. test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
  13. test_image = Image.new("RGBA", (100, 100), 0)
  14. store.store_avatar(test_user, test_image)
  15. # Assert that avatar was stored
  16. avatar_dir = store.get_existing_avatars_dir(test_user)
  17. for size in settings.MISAGO_AVATARS_SIZES:
  18. avatar = Path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  19. self.assertTrue(avatar.exists())
  20. self.assertTrue(avatar.isfile())
  21. # Delete avatar and assert its gone
  22. store.delete_avatar(test_user)
  23. for size in settings.MISAGO_AVATARS_SIZES:
  24. avatar = Path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  25. self.assertFalse(avatar.exists())
  26. # Override new avatar and test that it was changed
  27. store.store_avatar(test_user, test_image)
  28. store.store_new_avatar(test_user, test_image)
  29. for size in settings.MISAGO_AVATARS_SIZES:
  30. avatar = Path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  31. self.assertTrue(avatar.exists())
  32. self.assertTrue(avatar.isfile())
  33. # Compute avatar hash
  34. test_user.avatar_hash = store.get_avatar_hash(test_user)
  35. self.assertEqual(len(test_user.avatar_hash), 8)
  36. test_user.save(update_fields=['avatar_hash'])
  37. # Get avatar tokens
  38. tokens = store.get_user_avatar_tokens(test_user)
  39. self.assertEqual(tokens[tokens['org']], 'org')
  40. self.assertEqual(tokens[tokens['tmp']], 'tmp')
  41. # Delete avatar
  42. store.delete_avatar(test_user)
  43. for size in settings.MISAGO_AVATARS_SIZES:
  44. avatar = Path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  45. self.assertFalse(avatar.exists())
  46. class AvatarSetterTests(TestCase):
  47. def setUp(self):
  48. User = get_user_model()
  49. self.user = User.objects.create_user(
  50. 'Bob', 'kontakt@rpiton.com', 'pass123')
  51. store.delete_avatar(self.user)
  52. def tearDown(self):
  53. store.delete_avatar(self.user)
  54. def assertNoAvatarIsSet(self):
  55. avatar_dir = store.get_existing_avatars_dir(self.user)
  56. for size in settings.MISAGO_AVATARS_SIZES:
  57. avatar = Path('%s/%s_%s.png' % (avatar_dir, self.user.pk, size))
  58. self.assertFalse(avatar.exists())
  59. def assertAvatarWasSet(self):
  60. avatar_dir = store.get_existing_avatars_dir(self.user)
  61. for size in settings.MISAGO_AVATARS_SIZES:
  62. avatar = Path('%s/%s_%s.png' % (avatar_dir, self.user.pk, size))
  63. self.assertTrue(avatar.exists())
  64. self.assertTrue(avatar.isfile())
  65. def test_dynamic_avatar(self):
  66. """dynamic avatar gets created"""
  67. self.assertNoAvatarIsSet()
  68. dynamic.set_avatar(self.user)
  69. self.assertAvatarWasSet()
  70. def test_random_gallery_avatar(self):
  71. """dynamic avatar gets created"""
  72. self.assertNoAvatarIsSet()
  73. gallery.set_random_avatar(self.user)
  74. self.assertAvatarWasSet()
  75. def test_selected_gallery_avatar(self):
  76. """dynamic avatar gets created"""
  77. self.assertNoAvatarIsSet()
  78. gallery.set_avatar(self.user, 'avatars/Nature/serval.jpg')
  79. self.assertAvatarWasSet()
  80. def test_gravatar(self):
  81. """dynamic avatar gets created"""
  82. self.assertNoAvatarIsSet()
  83. gravatar.set_avatar(self.user)
  84. self.assertAvatarWasSet()
  85. class MockAvatarFile(object):
  86. def __init__(self, size=None, name=None, mime=None):
  87. self.size = size
  88. self.name = name
  89. self.content_type = mime
  90. class UploadedAvatarTests(TestCase):
  91. def test_clean_crop(self):
  92. """crop validation and cleaning"""
  93. image = Image.new("RGBA", (200, 200), 0)
  94. with self.assertRaises(ValidationError):
  95. uploaded.clean_crop(image, "abc")
  96. with self.assertRaises(ValidationError):
  97. uploaded.clean_crop(image, {})
  98. with self.assertRaises(ValidationError):
  99. uploaded.clean_crop(image, {'offset': {'x': 'ugabuga'}})
  100. with self.assertRaises(ValidationError):
  101. uploaded.clean_crop(image, {
  102. 'offset': {
  103. 'x': 0,
  104. 'y': 0,
  105. },
  106. 'zoom': -2
  107. })
  108. with self.assertRaises(ValidationError):
  109. uploaded.clean_crop(image, {
  110. 'offset': {
  111. 'x': 0,
  112. 'y': 0,
  113. },
  114. 'zoom': 2
  115. })
  116. uploaded.clean_crop(image, {
  117. 'offset': {
  118. 'x': 0,
  119. 'y': 0,
  120. },
  121. 'zoom': 0
  122. })
  123. def test_uploaded_image_size_validation(self):
  124. """uploaded image size is validated"""
  125. image = MockAvatarFile(size=settings.avatar_upload_limit * 2024)
  126. with self.assertRaises(ValidationError):
  127. uploaded.validate_file_size(image)
  128. image = MockAvatarFile(size=settings.avatar_upload_limit * 1000)
  129. uploaded.validate_file_size(image)
  130. def test_uploaded_image_extension_validation(self):
  131. """uploaded image extension is validated"""
  132. for invalid_extension in ('.txt', '.zip', '.py', '.tiff'):
  133. with self.assertRaises(ValidationError):
  134. image = MockAvatarFile(name='test%s' % invalid_extension)
  135. uploaded.validate_extension(image)
  136. for valid_extension in uploaded.ALLOWED_EXTENSIONS:
  137. image = MockAvatarFile(name='test%s' % valid_extension)
  138. uploaded.validate_extension(image)
  139. def test_uploaded_image_mime_validation(self):
  140. """uploaded image mime type is validated"""
  141. image = MockAvatarFile(mime='fake/mime')
  142. with self.assertRaises(ValidationError):
  143. uploaded.validate_mime(image)
  144. for valid_mime in uploaded.ALLOWED_MIME_TYPES:
  145. image = MockAvatarFile(mime=valid_mime)
  146. uploaded.validate_mime(image)