test_usercp_views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. from path import path
  2. from django.contrib.auth import get_user_model
  3. from django.core import mail
  4. from django.core.urlresolvers import reverse
  5. from misago.admin.testutils import AdminTestCase
  6. from misago.conf import settings
  7. from misago.core import threadstore
  8. from misago.users.avatars import store
  9. class ChangeForumOptionsTests(AdminTestCase):
  10. def setUp(self):
  11. super(ChangeForumOptionsTests, self).setUp()
  12. self.view_link = reverse('misago:usercp_change_forum_options')
  13. def test_change_forum_options_get(self):
  14. """GET to usercp change options view returns 200"""
  15. response = self.client.get(self.view_link)
  16. self.assertEqual(response.status_code, 200)
  17. self.assertIn('Change forum options', response.content)
  18. def test_change_forum_options_post(self):
  19. """POST to usercp change options view returns 302"""
  20. response = self.client.post(self.view_link, data={
  21. 'timezone': 'Asia/Qatar',
  22. 'is_hiding_presence': '1',
  23. 'subscribe_to_started_threads': '0',
  24. 'subscribe_to_replied_threads': '1',
  25. })
  26. self.assertEqual(response.status_code, 302)
  27. test_user = get_user_model().objects.get(pk=self.test_admin.pk)
  28. self.assertEqual(test_user.timezone, 'Asia/Qatar')
  29. self.assertEqual(test_user.is_hiding_presence, 1)
  30. self.assertEqual(test_user.subscribe_to_started_threads, 0)
  31. self.assertEqual(test_user.subscribe_to_replied_threads, 1)
  32. class ChangeAvatarTests(AdminTestCase):
  33. def setUp(self):
  34. super(ChangeAvatarTests, self).setUp()
  35. self.view_link = reverse('misago:usercp_change_avatar')
  36. def test_avatar_get(self):
  37. """GET to change avatar returns 200"""
  38. response = self.client.get(self.view_link)
  39. self.assertEqual(response.status_code, 200)
  40. self.test_admin.is_avatar_banned = True
  41. self.test_admin.avatar_ban_user_message = 'Your avatar is banned.'
  42. self.test_admin.save()
  43. response = self.client.get(self.view_link)
  44. self.assertEqual(response.status_code, 200)
  45. self.assertIn('Your avatar is banned', response.content)
  46. def test_set_gravatar(self):
  47. """view sets user gravatar"""
  48. self.test_admin.set_email('kontakt@rpiton.com')
  49. self.test_admin.save()
  50. response = self.client.post(self.view_link, data={'dl-gravatar': '1'})
  51. self.assertEqual(response.status_code, 302)
  52. response = self.client.get(self.view_link)
  53. self.assertEqual(response.status_code, 200)
  54. self.assertIn('Gravatar was downloaded', response.content)
  55. self.test_admin.set_email('test@test.com')
  56. self.test_admin.save()
  57. self.client.post(self.view_link, data={'dl-gravatar': '1'})
  58. response = self.client.get(self.view_link)
  59. self.assertEqual(response.status_code, 200)
  60. self.assertIn('No Gravatar is associated', response.content)
  61. def test_set_dynamic(self):
  62. """view sets user dynamic avatar"""
  63. response = self.client.post(self.view_link, data={'set-dynamic': '1'})
  64. self.assertEqual(response.status_code, 302)
  65. response = self.client.get(self.view_link)
  66. self.assertEqual(response.status_code, 200)
  67. self.assertIn('New avatar based', response.content)
  68. class AvatarUploadTests(AdminTestCase):
  69. def setUp(self):
  70. super(AvatarUploadTests, self).setUp()
  71. store.delete_avatar(self.test_admin)
  72. def tearDown(self):
  73. store.delete_avatar(self.test_admin)
  74. def test_upload_form_view(self):
  75. """upload view renders on get"""
  76. response = self.client.get(reverse('misago:usercp_upload_avatar'))
  77. self.assertEqual(response.status_code, 200)
  78. self.assertIn('Upload avatar', response.content)
  79. def test_upload_view(self):
  80. """upload view renders on get"""
  81. handler_link = reverse('misago:usercp_upload_avatar_handler')
  82. response = self.client.get(handler_link)
  83. self.assertEqual(response.status_code, 405)
  84. ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
  85. response = self.client.post(handler_link,
  86. data={'baww': 'nope'},
  87. **ajax_header)
  88. self.assertEqual(response.status_code, 406)
  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(handler_link,
  92. data={'new-avatar': avatar},
  93. **ajax_header)
  94. self.assertEqual(response.status_code, 200)
  95. avatar_dir = store.get_existing_avatars_dir(self.test_admin)
  96. avatar = path('%s/%s_tmp.png' % (avatar_dir, self.test_admin.pk))
  97. self.assertTrue(avatar.exists())
  98. self.assertTrue(avatar.isfile())
  99. def test_crop_view(self):
  100. """avatar gets cropped"""
  101. with open('%s/%s' % (settings.MEDIA_ROOT, 'misago.png')) as avatar:
  102. handler_link = reverse('misago:usercp_upload_avatar_handler')
  103. ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
  104. response = self.client.post(handler_link,
  105. data={'new-avatar': avatar},
  106. **ajax_header)
  107. self.assertEqual(response.status_code, 200)
  108. crop_link = reverse('misago:usercp_crop_new_avatar')
  109. response = self.client.post(crop_link, data={'crop': '1245'})
  110. self.assertEqual(response.status_code, 200)
  111. test_crop = '619,201,150,150,0,0,150,150'
  112. response = self.client.post(crop_link, data={'crop': test_crop})
  113. self.assertEqual(response.status_code, 302)
  114. avatar_dir = store.get_existing_avatars_dir(self.test_admin)
  115. avatar = path('%s/%s_tmp.png' % (avatar_dir, self.test_admin.pk))
  116. self.assertFalse(avatar.exists())
  117. avatar = path('%s/%s_org.png' % (avatar_dir, self.test_admin.pk))
  118. self.assertTrue(avatar.exists())
  119. self.assertTrue(avatar.isfile())
  120. class AvatarGalleryTests(AdminTestCase):
  121. def setUp(self):
  122. super(AvatarGalleryTests, self).setUp()
  123. self.view_link = reverse('misago:usercp_avatar_galleries')
  124. def test_gallery_list(self):
  125. """view renders gallery on GET"""
  126. response = self.client.get(self.view_link)
  127. self.assertEqual(response.status_code, 200)
  128. self.assertIn('Select avatar from gallery', response.content)
  129. def test_gallery_set_avatar(self):
  130. """view changes user avatar on post"""
  131. response = self.client.post(self.view_link, data={
  132. 'new-image': 'avatars/Nature/serval.jpg'})
  133. self.assertEqual(response.status_code, 302)
  134. response = self.client.get(reverse('misago:usercp_change_avatar'))
  135. self.assertEqual(response.status_code, 200)
  136. self.assertIn('Avatar from gallery was set', response.content)
  137. response = self.client.post(self.view_link, data={
  138. 'new-image': 'baww.jpg'})
  139. self.assertEqual(response.status_code, 200)
  140. self.assertIn('Incorrect image', response.content)
  141. class EditSignatureTests(AdminTestCase):
  142. def setUp(self):
  143. super(EditSignatureTests, self).setUp()
  144. self.view_link = reverse('misago:usercp_edit_signature')
  145. def test_signature_no_permission(self):
  146. """edit signature view with no ACL returns 404"""
  147. response = self.client.get(self.view_link)
  148. self.assertEqual(response.status_code, 404)
  149. def test_signature_banned(self):
  150. """GET to usercp change options view returns 200"""
  151. role = self.test_admin.roles.all()[0]
  152. permissions = role.permissions
  153. account_permissions = permissions['misago.users.permissions.account']
  154. account_permissions['can_have_signature'] = 1
  155. role.permissions = permissions
  156. self.test_admin.is_signature_banned = True
  157. self.test_admin.signature_ban_user_message = 'Your siggy is banned.'
  158. self.test_admin.save()
  159. response = self.client.get(self.view_link)
  160. self.assertEqual(response.status_code, 200)
  161. self.assertIn('Your siggy is banned', response.content)
  162. def test_signature_change(self):
  163. """GET to usercp change options view returns 200"""
  164. role = self.test_admin.roles.all()[0]
  165. permissions = role.permissions
  166. account_permissions = permissions['misago.users.permissions.account']
  167. account_permissions['can_have_signature'] = 1
  168. role.permissions = permissions
  169. self.test_admin.is_signature_banned = False
  170. self.test_admin.save()
  171. response = self.client.post(self.view_link,
  172. data={'signature': 'Hello siggy!'})
  173. self.assertEqual(response.status_code, 302)
  174. response = self.client.get(self.view_link)
  175. self.assertIn('<p>Hello siggy!</p>', response.content)
  176. class ChangeUsernameTests(AdminTestCase):
  177. def setUp(self):
  178. super(ChangeUsernameTests, self).setUp()
  179. self.view_link = reverse('misago:usercp_change_username')
  180. def test_change_username_get(self):
  181. """GET to usercp change username view returns 200"""
  182. response = self.client.get(self.view_link)
  183. self.assertEqual(response.status_code, 200)
  184. self.assertIn('Change username', response.content)
  185. def test_change_username_post(self):
  186. """POST to usercp change username view returns 302"""
  187. response = self.client.post(self.view_link,
  188. data={'new_username': 'Boberson'})
  189. self.assertEqual(response.status_code, 302)
  190. test_user = get_user_model().objects.get(pk=self.test_admin.pk)
  191. self.assertEqual(test_user.username, 'Boberson')
  192. response = self.client.get(self.view_link)
  193. self.assertEqual(response.status_code, 200)
  194. self.assertIn(test_user.username, response.content)
  195. class ChangeEmailPasswordTests(AdminTestCase):
  196. def setUp(self):
  197. super(ChangeEmailPasswordTests, self).setUp()
  198. self.view_link = reverse('misago:usercp_change_email_password')
  199. threadstore.clear()
  200. def _link_from_mail(self, mail_body):
  201. for line in mail.outbox[0].body.splitlines():
  202. if line.strip().startswith('http://testserver/'):
  203. return line.strip()[len('http://testserver'):]
  204. raise ValueError("mail body didn't contain link with token")
  205. def test_change_email_password_get(self):
  206. """GET to usercp change email/pass view returns 200"""
  207. response = self.client.get(self.view_link)
  208. self.assertEqual(response.status_code, 200)
  209. self.assertIn('Change email or password', response.content)
  210. def test_change_email(self):
  211. """POST to usercp change email view returns 302"""
  212. response = self.client.post(self.view_link,
  213. data={'new_email': 'newmail@test.com',
  214. 'current_password': 'Pass.123'})
  215. self.assertEqual(response.status_code, 302)
  216. self.assertIn('Confirm changes to', mail.outbox[0].subject)
  217. confirmation_link = self._link_from_mail(mail.outbox[0].body)
  218. response = self.client.get(confirmation_link)
  219. self.assertEqual(response.status_code, 302)
  220. User = get_user_model()
  221. test_user = User.objects.get(email='newmail@test.com')
  222. def test_change_password(self):
  223. """POST to usercp change password view returns 302"""
  224. response = self.client.post(self.view_link,
  225. data={'new_password': 'newpass123',
  226. 'current_password': 'Pass.123'})
  227. self.assertEqual(response.status_code, 302)
  228. self.assertIn('Confirm changes to', mail.outbox[0].subject)
  229. confirmation_link = self._link_from_mail(mail.outbox[0].body)
  230. response = self.client.get(confirmation_link)
  231. self.assertEqual(response.status_code, 302)
  232. User = get_user_model()
  233. test_user = User.objects.get(pk=self.test_admin.pk)
  234. self.assertFalse(test_user.check_password('Pass.123'))
  235. self.assertTrue(test_user.check_password('newpass123'))