test_usercp_views.py 12 KB

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