test_avatars.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 misago.users.avatars import store, dynamic, gallery, gravatar, uploaded
  8. from misago.users.avatars.paths import AVATARS_STORE
  9. class AvatarsStoreTests(TestCase):
  10. def test_store(self):
  11. """store successfully stores and deletes avatar"""
  12. User = get_user_model()
  13. test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
  14. test_image = Image.new("RGBA", (100, 100), 0)
  15. store.store_avatar(test_user, test_image)
  16. # Assert that avatar was stored
  17. avatar_dir = store.get_existing_avatars_dir(test_user)
  18. for size in settings.MISAGO_AVATARS_SIZES:
  19. avatar = path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  20. self.assertTrue(avatar.exists())
  21. self.assertTrue(avatar.isfile())
  22. # Delete avatar and assert its gone
  23. store.delete_avatar(test_user)
  24. for size in settings.MISAGO_AVATARS_SIZES:
  25. avatar = path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  26. self.assertFalse(avatar.exists())
  27. # Override new avatar and test that it was changed
  28. store.store_avatar(test_user, test_image)
  29. store.store_new_avatar(test_user, test_image)
  30. for size in settings.MISAGO_AVATARS_SIZES:
  31. avatar = path('%s/%s_%s.png' % (avatar_dir, test_user.pk, size))
  32. self.assertTrue(avatar.exists())
  33. self.assertTrue(avatar.isfile())
  34. # Delete avatar
  35. store.delete_avatar(test_user)
  36. class AvatarSetterTests(TestCase):
  37. def setUp(self):
  38. User = get_user_model()
  39. self.user = User.objects.create_user(
  40. 'Bob', 'kontakt@rpiton.com', 'pass123')
  41. store.delete_avatar(self.user)
  42. def tearDown(self):
  43. store.delete_avatar(self.user)
  44. def assertNoAvatarIsSet(self):
  45. avatar_dir = store.get_existing_avatars_dir(self.user)
  46. for size in settings.MISAGO_AVATARS_SIZES:
  47. avatar = path('%s/%s_%s.png' % (avatar_dir, self.user.pk, size))
  48. self.assertFalse(avatar.exists())
  49. def assertAvatarWasSet(self):
  50. avatar_dir = store.get_existing_avatars_dir(self.user)
  51. for size in settings.MISAGO_AVATARS_SIZES:
  52. avatar = path('%s/%s_%s.png' % (avatar_dir, self.user.pk, size))
  53. self.assertTrue(avatar.exists())
  54. self.assertTrue(avatar.isfile())
  55. def test_dynamic_avatar(self):
  56. """dynamic avatar gets created"""
  57. self.assertNoAvatarIsSet()
  58. dynamic.set_avatar(self.user)
  59. self.assertAvatarWasSet()
  60. def test_random_gallery_avatar(self):
  61. """dynamic avatar gets created"""
  62. self.assertNoAvatarIsSet()
  63. gallery.set_random_avatar(self.user)
  64. self.assertAvatarWasSet()
  65. def test_selected_gallery_avatar(self):
  66. """dynamic avatar gets created"""
  67. self.assertNoAvatarIsSet()
  68. gallery.set_avatar(self.user, 'avatars/Nature/serval.jpg')
  69. self.assertAvatarWasSet()
  70. def test_gravatar(self):
  71. """dynamic avatar gets created"""
  72. self.assertNoAvatarIsSet()
  73. gravatar.set_avatar(self.user)
  74. self.assertAvatarWasSet()
  75. class MockAvatarFile(object):
  76. def __init__(self, size=None, name=None, mime=None):
  77. self.size = size
  78. self.name = name
  79. self.content_type = mime
  80. class UploadedAvatarTests(TestCase):
  81. def test_crop(self):
  82. """crop validation and clear"""
  83. image = Image.new("RGBA", (200, 200), 0)
  84. with self.assertRaises(ValidationError):
  85. uploaded.crop_string_to_dict(image, "abc")
  86. with self.assertRaises(ValidationError):
  87. uploaded.crop_string_to_dict(image, "2,2,4,a")
  88. with self.assertRaises(ValidationError):
  89. uploaded.crop_string_to_dict(image, "300,300,400,400,0,0,10,10")
  90. uploaded.crop_string_to_dict(image, "200,200,90,90,0,0,90,90")
  91. def test_uploaded_image_size_validation(self):
  92. """uploaded image size is validated"""
  93. image = MockAvatarFile(size=settings.avatar_upload_limit * 2024)
  94. with self.assertRaises(ValidationError):
  95. uploaded.validate_file_size(image)
  96. image = MockAvatarFile(size=settings.avatar_upload_limit * 1000)
  97. uploaded.validate_file_size(image)
  98. def test_uploaded_image_extension_validation(self):
  99. """uploaded image extension is validated"""
  100. for invalid_extension in ('.txt', '.zip', '.py', '.tiff'):
  101. with self.assertRaises(ValidationError):
  102. image = MockAvatarFile(name='test%s' % invalid_extension)
  103. uploaded.validate_extension(image)
  104. for valid_extension in uploaded.ALLOWED_EXTENSIONS:
  105. image = MockAvatarFile(name='test%s' % valid_extension)
  106. uploaded.validate_extension(image)
  107. def test_uploaded_image_mime_validation(self):
  108. """uploaded image mime type is validated"""
  109. image = MockAvatarFile(mime='fake/mime')
  110. with self.assertRaises(ValidationError):
  111. uploaded.validate_mime(image)
  112. for valid_mime in uploaded.ALLOWED_MIME_TYPES:
  113. image = MockAvatarFile(mime=valid_mime)
  114. uploaded.validate_mime(image)