test_user_avatar_api.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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 UserAvatarTests(AuthenticatedUserTestCase):
  9. """
  10. tests for user avatar RPC (/api/users/1/avatar/)
  11. """
  12. def setUp(self):
  13. super(UserAvatarTests, 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. tmp_avatar_kwargs = {
  104. 'secret': response_json['options']['crop_tmp']['secret'],
  105. 'hash': response_json['avatar_hash'],
  106. 'user_id': self.user.pk
  107. }
  108. tmp_avatar_path = reverse('misago:user_avatar_source',
  109. kwargs=tmp_avatar_kwargs)
  110. response = self.client.get(tmp_avatar_path)
  111. self.assertEqual(response.status_code, 200)
  112. response = self.client.post(self.link, json.dumps({
  113. 'avatar': 'crop_tmp',
  114. 'crop': {
  115. 'offset': {
  116. 'x': 0, 'y': 0
  117. },
  118. 'zoom': 1
  119. }
  120. }),
  121. content_type="application/json")
  122. response_json = json.loads(response.content)
  123. self.assertEqual(response.status_code, 200)
  124. self.assertIn('Uploaded avatar was set.', response.content)
  125. avatar_dir = store.get_existing_avatars_dir(self.user)
  126. avatar = Path('%s/%s_tmp.png' % (avatar_dir, self.user.pk))
  127. self.assertFalse(avatar.exists())
  128. avatar = Path('%s/%s_org.png' % (avatar_dir, self.user.pk))
  129. self.assertTrue(avatar.exists())
  130. self.assertTrue(avatar.isfile())
  131. org_avatar_kwargs = {
  132. 'secret': response_json['options']['crop_org']['secret'],
  133. 'hash': response_json['avatar_hash'],
  134. 'user_id': self.user.pk
  135. }
  136. org_avatar_path = reverse('misago:user_avatar_source',
  137. kwargs=tmp_avatar_kwargs)
  138. response = self.client.get(org_avatar_path)
  139. self.assertEqual(response.status_code, 200)
  140. response = self.client.post(self.link, json.dumps({
  141. 'avatar': 'crop_tmp',
  142. 'crop': {
  143. 'offset': {
  144. 'x': 0, 'y': 0
  145. },
  146. 'zoom': 1
  147. }
  148. }),
  149. content_type="application/json")
  150. self.assertEqual(response.status_code, 400)
  151. self.assertIn('This avatar type is not allowed.', response.content)
  152. response = self.client.post(self.link, json.dumps({
  153. 'avatar': 'crop_org',
  154. 'crop': {
  155. 'offset': {
  156. 'x': 0, 'y': 0
  157. },
  158. 'zoom': 1
  159. }
  160. }),
  161. content_type="application/json")
  162. self.assertEqual(response.status_code, 200)
  163. self.assertIn('Avatar was re-cropped.', response.content)
  164. def test_gallery(self):
  165. """its possible to set avatar from gallery"""
  166. response = self.client.get(self.link)
  167. self.assertEqual(response.status_code, 200)
  168. options = json.loads(response.content)
  169. self.assertTrue(options['galleries'])
  170. for gallery in options['galleries']:
  171. for image in gallery['images']:
  172. response = self.client.post(self.link, data={
  173. 'avatar': 'galleries',
  174. 'image': image
  175. })
  176. self.assertEqual(response.status_code, 200)
  177. self.assertIn('Avatar from gallery was set.', response.content)