test_user_avatar_api.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import json
  2. from path import Path
  3. from django.contrib.auth import get_user_model
  4. from django.core.urlresolvers import reverse
  5. from misago.conf import settings
  6. from misago.users.avatars import store
  7. from misago.users.testutils import AuthenticatedUserTestCase
  8. class UserCreateTests(AuthenticatedUserTestCase):
  9. """
  10. tests for user avatar RPC (POST to /api/users/1/avatar)
  11. """
  12. def setUp(self):
  13. super(UserCreateTests, self).setUp()
  14. self.link = '/api/users/%s/avatar/' % self.user.pk
  15. def test_avatars_off(self):
  16. """custom avatars are not allowed"""
  17. with self.settings(allow_custom_avatars=False):
  18. response = self.client.get(self.link)
  19. self.assertEqual(response.status_code, 200)
  20. options = json.loads(response.content)
  21. self.assertTrue(options['generated'])
  22. self.assertFalse(options['gravatar'])
  23. self.assertFalse(options['crop_org'])
  24. self.assertFalse(options['crop_tmp'])
  25. self.assertFalse(options['upload'])
  26. self.assertTrue(options['galleries'])
  27. def test_avatars_on(self):
  28. """custom avatars are not allowed"""
  29. with self.settings(allow_custom_avatars=True):
  30. response = self.client.get(self.link)
  31. self.assertEqual(response.status_code, 200)
  32. options = json.loads(response.content)
  33. self.assertTrue(options['generated'])
  34. self.assertTrue(options['gravatar'])
  35. self.assertFalse(options['crop_org'])
  36. self.assertFalse(options['crop_tmp'])
  37. self.assertTrue(options['upload'])
  38. self.assertTrue(options['galleries'])
  39. def test_avatar_locked(self):
  40. """requests to api error if user's avatar is locked"""
  41. self.user.is_avatar_locked = True
  42. self.user.avatar_lock_user_message = 'Your avatar is pwnt.'
  43. self.user.save()
  44. response = self.client.get(self.link)
  45. self.assertEqual(response.status_code, 403)
  46. self.assertIn('Your avatar is pwnt', response.content)
  47. def test_other_user_avatar(self):
  48. """requests to api error if user tries to access other user"""
  49. self.logout_user();
  50. response = self.client.get(self.link)
  51. self.assertEqual(response.status_code, 403)
  52. self.assertIn('You have to sign in', response.content)
  53. User = get_user_model()
  54. self.login_user(User.objects.create_user(
  55. "BobUser", "bob@bob.com", self.USER_PASSWORD))
  56. response = self.client.get(self.link)
  57. self.assertEqual(response.status_code, 403)
  58. self.assertIn('can\'t change other users avatars', response.content)
  59. def test_empty_requests(self):
  60. """empty request errors with code 400"""
  61. response = self.client.post(self.link)
  62. self.assertEqual(response.status_code, 400)
  63. self.assertIn('Unknown avatar type.', response.content)
  64. def test_failed_gravatar_request(self):
  65. """no gravatar RPC fails"""
  66. self.user.email_hash = 'wolololo'
  67. self.user.save()
  68. response = self.client.post(self.link, data={'avatar': 'gravatar'})
  69. self.assertEqual(response.status_code, 400)
  70. self.assertIn('No Gravatar is associated', response.content)
  71. def test_successful_gravatar_request(self):
  72. """gravatar RPC fails"""
  73. self.user.set_email('rafio.xudb@gmail.com')
  74. self.user.save()
  75. response = self.client.post(self.link, data={'avatar': 'gravatar'})
  76. self.assertEqual(response.status_code, 200)
  77. self.assertIn('Gravatar was downloaded and set', response.content)
  78. def test_generation_request(self):
  79. """generated avatar is set"""
  80. response = self.client.post(self.link, data={'avatar': 'generated'})
  81. self.assertEqual(response.status_code, 200)
  82. self.assertIn('New avatar based on your account', response.content)
  83. def test_avatar_upload_and_crop(self):
  84. """avatar can be uploaded and cropped"""
  85. response = self.client.post(self.link, data={'avatar': 'generated'})
  86. self.assertEqual(response.status_code, 200)
  87. response = self.client.post(self.link, data={'avatar': 'upload'})
  88. self.assertEqual(response.status_code, 400)
  89. self.assertIn('No file was sent.', response.content)
  90. with open('%s/%s' % (settings.MEDIA_ROOT, 'misago.png')) as avatar:
  91. response = self.client.post(self.link,
  92. data={
  93. 'avatar': 'upload',
  94. 'image': avatar
  95. })
  96. self.assertEqual(response.status_code, 200)
  97. response_json = json.loads(response.content)
  98. self.assertTrue(response_json['options']['crop_tmp'])
  99. avatar_dir = store.get_existing_avatars_dir(self.user)
  100. avatar = Path('%s/%s_tmp.png' % (avatar_dir, self.user.pk))
  101. self.assertTrue(avatar.exists())
  102. self.assertTrue(avatar.isfile())
  103. response = self.client.post(self.link, json.dumps({
  104. 'avatar': 'crop_tmp',
  105. 'crop': {
  106. 'offset': {
  107. 'x': 0, 'y': 0
  108. },
  109. 'zoom': 1
  110. }
  111. }),
  112. content_type="application/json")
  113. self.assertEqual(response.status_code, 200)
  114. self.assertIn('Uploaded avatar was set.', response.content)
  115. avatar_dir = store.get_existing_avatars_dir(self.user)
  116. avatar = Path('%s/%s_tmp.png' % (avatar_dir, self.user.pk))
  117. self.assertFalse(avatar.exists())
  118. avatar = Path('%s/%s_org.png' % (avatar_dir, self.user.pk))
  119. self.assertTrue(avatar.exists())
  120. self.assertTrue(avatar.isfile())
  121. response = self.client.post(self.link, json.dumps({
  122. 'avatar': 'crop_tmp',
  123. 'crop': {
  124. 'offset': {
  125. 'x': 0, 'y': 0
  126. },
  127. 'zoom': 1
  128. }
  129. }),
  130. content_type="application/json")
  131. self.assertEqual(response.status_code, 400)
  132. self.assertIn('This avatar type is not allowed.', response.content)
  133. response = self.client.post(self.link, json.dumps({
  134. 'avatar': 'crop_org',
  135. 'crop': {
  136. 'offset': {
  137. 'x': 0, 'y': 0
  138. },
  139. 'zoom': 1
  140. }
  141. }),
  142. content_type="application/json")
  143. self.assertEqual(response.status_code, 200)
  144. self.assertIn('Avatar was re-cropped.', response.content)
  145. def test_gallery(self):
  146. """its possible to set avatar from gallery"""
  147. response = self.client.get(self.link)
  148. self.assertEqual(response.status_code, 200)
  149. options = json.loads(response.content)
  150. self.assertTrue(options['galleries'])
  151. for gallery in options['galleries']:
  152. for image in gallery['images']:
  153. response = self.client.post(self.link, data={
  154. 'avatar': 'galleries',
  155. 'image': image
  156. })
  157. self.assertEqual(response.status_code, 200)
  158. self.assertIn('Avatar from gallery was set.', response.content)