|
@@ -1,4 +1,5 @@
|
|
|
import json
|
|
|
+import os
|
|
|
|
|
|
from path import Path
|
|
|
|
|
@@ -13,6 +14,10 @@ from ..avatars import store
|
|
|
from ..testutils import AuthenticatedUserTestCase
|
|
|
|
|
|
|
|
|
+TESTFILES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'testfiles')
|
|
|
+TEST_AVATAR_PATH = os.path.join(TESTFILES_DIR, 'avatar.png')
|
|
|
+
|
|
|
+
|
|
|
class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
"""
|
|
|
tests for user avatar RPC (/api/users/1/avatar/)
|
|
@@ -21,6 +26,10 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
super(UserAvatarTests, self).setUp()
|
|
|
self.link = '/api/users/%s/avatar/' % self.user.pk
|
|
|
|
|
|
+ def get_current_user(self):
|
|
|
+ UserModel = get_user_model()
|
|
|
+ return UserModel.objects.get(pk=self.user.pk)
|
|
|
+
|
|
|
def test_avatars_off(self):
|
|
|
"""custom avatars are not allowed"""
|
|
|
with self.settings(allow_custom_avatars=False):
|
|
@@ -30,7 +39,7 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
options = json.loads(smart_str(response.content))
|
|
|
self.assertTrue(options['generated'])
|
|
|
self.assertFalse(options['gravatar'])
|
|
|
- self.assertFalse(options['crop_org'])
|
|
|
+ self.assertFalse(options['crop_src'])
|
|
|
self.assertFalse(options['crop_tmp'])
|
|
|
self.assertFalse(options['upload'])
|
|
|
self.assertTrue(options['galleries'])
|
|
@@ -44,7 +53,7 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
options = json.loads(smart_str(response.content))
|
|
|
self.assertTrue(options['generated'])
|
|
|
self.assertTrue(options['gravatar'])
|
|
|
- self.assertFalse(options['crop_org'])
|
|
|
+ self.assertFalse(options['crop_src'])
|
|
|
self.assertFalse(options['crop_tmp'])
|
|
|
self.assertTrue(options['upload'])
|
|
|
self.assertTrue(options['galleries'])
|
|
@@ -52,30 +61,30 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
def test_avatar_locked(self):
|
|
|
"""requests to api error if user's avatar is locked"""
|
|
|
self.user.is_avatar_locked = True
|
|
|
- self.user.avatar_lock_user_message = 'Your avatar is pwnt.'
|
|
|
+ self.user.avatar_lock_user_message = "Your avatar is pwnt."
|
|
|
self.user.save()
|
|
|
|
|
|
response = self.client.get(self.link)
|
|
|
- self.assertContains(response, 'Your avatar is pwnt', status_code=403)
|
|
|
+ self.assertContains(response, "Your avatar is pwnt", status_code=403)
|
|
|
|
|
|
def test_other_user_avatar(self):
|
|
|
"""requests to api error if user tries to access other user"""
|
|
|
self.logout_user();
|
|
|
|
|
|
response = self.client.get(self.link)
|
|
|
- self.assertContains(response, 'You have to sign in', status_code=403)
|
|
|
+ self.assertContains(response, "You have to sign in", status_code=403)
|
|
|
|
|
|
User = get_user_model()
|
|
|
self.login_user(User.objects.create_user(
|
|
|
"BobUser", "bob@bob.com", self.USER_PASSWORD))
|
|
|
|
|
|
response = self.client.get(self.link)
|
|
|
- self.assertContains(response, 'can\'t change other users avatars', status_code=403)
|
|
|
+ self.assertContains(response, "can't change other users avatars", status_code=403)
|
|
|
|
|
|
def test_empty_requests(self):
|
|
|
"""empty request errors with code 400"""
|
|
|
response = self.client.post(self.link)
|
|
|
- self.assertContains(response, 'Unknown avatar type.', status_code=400)
|
|
|
+ self.assertContains(response, "Unknown avatar type.", status_code=400)
|
|
|
|
|
|
def test_failed_gravatar_request(self):
|
|
|
"""no gravatar RPC fails"""
|
|
@@ -83,20 +92,20 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
self.user.save()
|
|
|
|
|
|
response = self.client.post(self.link, data={'avatar': 'gravatar'})
|
|
|
- self.assertContains(response, 'No Gravatar is associated', status_code=400)
|
|
|
+ self.assertContains(response, "No Gravatar is associated", status_code=400)
|
|
|
|
|
|
def test_successful_gravatar_request(self):
|
|
|
- """gravatar RPC fails"""
|
|
|
+ """gravatar RPC passes"""
|
|
|
self.user.set_email('rafio.xudb@gmail.com')
|
|
|
self.user.save()
|
|
|
|
|
|
response = self.client.post(self.link, data={'avatar': 'gravatar'})
|
|
|
- self.assertContains(response, 'Gravatar was downloaded and set')
|
|
|
+ self.assertContains(response, "Gravatar was downloaded and set")
|
|
|
|
|
|
def test_generation_request(self):
|
|
|
"""generated avatar is set"""
|
|
|
response = self.client.post(self.link, data={'avatar': 'generated'})
|
|
|
- self.assertContains(response, 'New avatar based on your account')
|
|
|
+ self.assertContains(response, "New avatar based on your account")
|
|
|
|
|
|
def test_avatar_upload_and_crop(self):
|
|
|
"""avatar can be uploaded and cropped"""
|
|
@@ -104,91 +113,63 @@ class UserAvatarTests(AuthenticatedUserTestCase):
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
response = self.client.post(self.link, data={'avatar': 'upload'})
|
|
|
- self.assertContains(response, 'No file was sent.', status_code=400)
|
|
|
-
|
|
|
- avatar_path = (settings.MEDIA_ROOT, 'avatars', 'blank.png')
|
|
|
- with open('/'.join(avatar_path), 'rb') as avatar:
|
|
|
- response = self.client.post(self.link,
|
|
|
- data={
|
|
|
- 'avatar': 'upload',
|
|
|
- 'image': avatar
|
|
|
- })
|
|
|
+ self.assertContains(response, "No file was sent.", status_code=400)
|
|
|
+
|
|
|
+ with open(TEST_AVATAR_PATH, 'rb') as avatar:
|
|
|
+ response = self.client.post(self.link, data={
|
|
|
+ 'avatar': 'upload',
|
|
|
+ 'image': avatar
|
|
|
+ })
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
- response_json = json.loads(smart_str(response.content))
|
|
|
+ response_json = response.json()
|
|
|
self.assertTrue(response_json['options']['crop_tmp'])
|
|
|
|
|
|
- avatar_dir = store.get_existing_avatars_dir(self.user)
|
|
|
- avatar = Path('%s/%s_tmp.png' % (avatar_dir, self.user.pk))
|
|
|
- self.assertTrue(avatar.exists())
|
|
|
- self.assertTrue(avatar.isfile())
|
|
|
+ avatar = Path(self.get_current_user().avatar_tmp.path)
|
|
|
+ self.assertTrue(avatar.exists())
|
|
|
+ self.assertTrue(avatar.isfile())
|
|
|
|
|
|
- tmp_avatar_kwargs = {
|
|
|
- 'pk': self.user.pk,
|
|
|
- 'secret': response_json['options']['crop_tmp']['secret'],
|
|
|
- 'hash': response_json['avatar_hash'],
|
|
|
+ response = self.client.post(self.link, json.dumps({
|
|
|
+ 'avatar': 'crop_tmp',
|
|
|
+ 'crop': {
|
|
|
+ 'offset': {
|
|
|
+ 'x': 0, 'y': 0
|
|
|
+ },
|
|
|
+ 'zoom': 1
|
|
|
}
|
|
|
- tmp_avatar_path = reverse('misago:user-avatar-source',
|
|
|
- kwargs=tmp_avatar_kwargs)
|
|
|
- response = self.client.get(tmp_avatar_path)
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
+ }), content_type="application/json")
|
|
|
|
|
|
- response = self.client.post(self.link, json.dumps({
|
|
|
- 'avatar': 'crop_tmp',
|
|
|
- 'crop': {
|
|
|
- 'offset': {
|
|
|
- 'x': 0, 'y': 0
|
|
|
- },
|
|
|
- 'zoom': 1
|
|
|
- }
|
|
|
- }),
|
|
|
- content_type="application/json")
|
|
|
- response_json = json.loads(smart_str(response.content))
|
|
|
-
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
- self.assertContains(response, 'Uploaded avatar was set.')
|
|
|
+ response_json = response.json()
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
+ self.assertContains(response, "Uploaded avatar was set.")
|
|
|
|
|
|
- avatar_dir = store.get_existing_avatars_dir(self.user)
|
|
|
- avatar = Path('%s/%s_tmp.png' % (avatar_dir, self.user.pk))
|
|
|
- self.assertFalse(avatar.exists())
|
|
|
+ self.assertFalse(self.get_current_user().avatar_tmp)
|
|
|
|
|
|
- avatar = Path('%s/%s_org.png' % (avatar_dir, self.user.pk))
|
|
|
- self.assertTrue(avatar.exists())
|
|
|
- self.assertTrue(avatar.isfile())
|
|
|
+ avatar = Path(self.get_current_user().avatar_src.path)
|
|
|
+ self.assertTrue(avatar.exists())
|
|
|
+ self.assertTrue(avatar.isfile())
|
|
|
|
|
|
- org_avatar_kwargs = {
|
|
|
- 'pk': self.user.pk,
|
|
|
- 'secret': response_json['options']['crop_org']['secret'],
|
|
|
- 'hash': response_json['avatar_hash'],
|
|
|
+ response = self.client.post(self.link, json.dumps({
|
|
|
+ 'avatar': 'crop_tmp',
|
|
|
+ 'crop': {
|
|
|
+ 'offset': {
|
|
|
+ 'x': 0, 'y': 0
|
|
|
+ },
|
|
|
+ 'zoom': 1
|
|
|
}
|
|
|
- org_avatar_path = reverse('misago:user-avatar-source',
|
|
|
- kwargs=tmp_avatar_kwargs)
|
|
|
- response = self.client.get(org_avatar_path)
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
+ }), content_type="application/json")
|
|
|
+ self.assertContains(response, "This avatar type is not allowed.", status_code=400)
|
|
|
|
|
|
- response = self.client.post(self.link, json.dumps({
|
|
|
- 'avatar': 'crop_tmp',
|
|
|
- 'crop': {
|
|
|
- 'offset': {
|
|
|
- 'x': 0, 'y': 0
|
|
|
- },
|
|
|
- 'zoom': 1
|
|
|
- }
|
|
|
- }),
|
|
|
- content_type="application/json")
|
|
|
- self.assertContains(response, 'This avatar type is not allowed.', status_code=400)
|
|
|
-
|
|
|
- response = self.client.post(self.link, json.dumps({
|
|
|
- 'avatar': 'crop_org',
|
|
|
- 'crop': {
|
|
|
- 'offset': {
|
|
|
- 'x': 0, 'y': 0
|
|
|
- },
|
|
|
- 'zoom': 1
|
|
|
- }
|
|
|
- }),
|
|
|
- content_type="application/json")
|
|
|
- self.assertContains(response, 'Avatar was re-cropped.')
|
|
|
+ response = self.client.post(self.link, json.dumps({
|
|
|
+ 'avatar': 'crop_src',
|
|
|
+ 'crop': {
|
|
|
+ 'offset': {
|
|
|
+ 'x': 0, 'y': 0
|
|
|
+ },
|
|
|
+ 'zoom': 1
|
|
|
+ }
|
|
|
+ }), content_type="application/json")
|
|
|
+ self.assertContains(response, "Avatar was re-cropped.")
|
|
|
|
|
|
def test_gallery(self):
|
|
|
"""its possible to set avatar from gallery"""
|
|
@@ -247,12 +228,12 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
|
options = json.loads(smart_str(response.content))
|
|
|
- self.assertEqual(options['is_avatar_locked'],
|
|
|
- self.other_user.is_avatar_locked)
|
|
|
- self.assertEqual(options['avatar_lock_user_message'],
|
|
|
- self.other_user.avatar_lock_user_message)
|
|
|
- self.assertEqual(options['avatar_lock_staff_message'],
|
|
|
- self.other_user.avatar_lock_staff_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['is_avatar_locked'], self.other_user.is_avatar_locked)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_user_message'], self.other_user.avatar_lock_user_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_staff_message'], self.other_user.avatar_lock_staff_message)
|
|
|
|
|
|
override_acl(self.user, {
|
|
|
'can_moderate_avatars': 1,
|
|
@@ -276,14 +257,14 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
|
|
|
self.assertEqual(
|
|
|
other_user.avatar_lock_staff_message, "Test staff message.")
|
|
|
|
|
|
- self.assertEqual(options['avatar_hash'],
|
|
|
- other_user.avatar_hash)
|
|
|
- self.assertEqual(options['is_avatar_locked'],
|
|
|
- other_user.is_avatar_locked)
|
|
|
- self.assertEqual(options['avatar_lock_user_message'],
|
|
|
- other_user.avatar_lock_user_message)
|
|
|
- self.assertEqual(options['avatar_lock_staff_message'],
|
|
|
- other_user.avatar_lock_staff_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatars'], other_user.avatars)
|
|
|
+ self.assertEqual(
|
|
|
+ options['is_avatar_locked'], other_user.is_avatar_locked)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_user_message'], other_user.avatar_lock_user_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_staff_message'], other_user.avatar_lock_staff_message)
|
|
|
|
|
|
override_acl(self.user, {
|
|
|
'can_moderate_avatars': 1,
|
|
@@ -300,14 +281,14 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
|
|
|
other_user = User.objects.get(pk=self.other_user.pk)
|
|
|
|
|
|
options = json.loads(smart_str(response.content))
|
|
|
- self.assertEqual(options['avatar_hash'],
|
|
|
- other_user.avatar_hash)
|
|
|
- self.assertEqual(options['is_avatar_locked'],
|
|
|
- other_user.is_avatar_locked)
|
|
|
- self.assertEqual(options['avatar_lock_user_message'],
|
|
|
- other_user.avatar_lock_user_message)
|
|
|
- self.assertEqual(options['avatar_lock_staff_message'],
|
|
|
- other_user.avatar_lock_staff_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatars'], other_user.avatars)
|
|
|
+ self.assertEqual(
|
|
|
+ options['is_avatar_locked'], other_user.is_avatar_locked)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_user_message'], other_user.avatar_lock_user_message)
|
|
|
+ self.assertEqual(
|
|
|
+ options['avatar_lock_staff_message'], other_user.avatar_lock_staff_message)
|
|
|
|
|
|
def test_moderate_own_avatar(self):
|
|
|
"""moderate own avatar"""
|
|
@@ -315,6 +296,5 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
|
|
|
'can_moderate_avatars': 1,
|
|
|
})
|
|
|
|
|
|
- response = self.client.get(
|
|
|
- '/api/users/%s/moderate-avatar/' % self.user.pk)
|
|
|
+ response = self.client.get( '/api/users/%s/moderate-avatar/' % self.user.pk)
|
|
|
self.assertEqual(response.status_code, 200)
|