test_user_changeemail_api.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from django.contrib.auth import get_user_model
  2. from django.core import mail
  3. from django.urls import reverse
  4. from misago.users.testutils import AuthenticatedUserTestCase
  5. UserModel = get_user_model()
  6. class UserChangeEmailTests(AuthenticatedUserTestCase):
  7. """
  8. tests for user change email RPC (/api/users/1/change-email/)
  9. """
  10. def setUp(self):
  11. super(UserChangeEmailTests, self).setUp()
  12. self.link = '/api/users/%s/change-email/' % self.user.pk
  13. def test_unsupported_methods(self):
  14. """api isn't supporting GET"""
  15. response = self.client.get(self.link)
  16. self.assertEqual(response.status_code, 405)
  17. def test_empty_input(self):
  18. """api errors correctly for empty input"""
  19. response = self.client.post(self.link, data={})
  20. self.assertEqual(response.status_code, 400)
  21. self.assertEqual(response.json(), {
  22. 'new_email': [
  23. "This field is required."
  24. ],
  25. 'password': [
  26. "This field is required."
  27. ],
  28. })
  29. def test_invalid_password(self):
  30. """api errors correctly for invalid password"""
  31. response = self.client.post(self.link, data={
  32. 'new_email': 'new@email.com',
  33. 'password': 'Lor3mIpsum'
  34. })
  35. self.assertContains(response, 'password is invalid', status_code=400)
  36. def test_invalid_input(self):
  37. """api errors correctly for invalid input"""
  38. response = self.client.post(self.link, data={
  39. 'new_email': '',
  40. 'password': self.USER_PASSWORD
  41. })
  42. self.assertEqual(response.status_code, 400)
  43. self.assertEqual(response.json(), {
  44. 'new_email': [
  45. "This field may not be blank."
  46. ],
  47. })
  48. response = self.client.post(self.link, data={
  49. 'new_email': 'newmail',
  50. 'password': self.USER_PASSWORD
  51. })
  52. self.assertEqual(response.status_code, 400)
  53. self.assertEqual(response.json(), {
  54. 'new_email': [
  55. "Enter a valid email address."
  56. ],
  57. })
  58. def test_email_taken(self):
  59. """api validates email usage"""
  60. UserModel.objects.create_user('BobBoberson', 'new@email.com', 'Pass.123')
  61. response = self.client.post(self.link, data={
  62. 'new_email': 'new@email.com',
  63. 'password': self.USER_PASSWORD
  64. })
  65. self.assertContains(response, 'not available', status_code=400)
  66. def test_change_email(self):
  67. """api allows users to change their e-mail addresses"""
  68. new_email = 'new@email.com'
  69. response = self.client.post(self.link, data={
  70. 'new_email': new_email,
  71. 'password': self.USER_PASSWORD
  72. })
  73. self.assertEqual(response.status_code, 200)
  74. self.assertIn('Confirm e-mail change', mail.outbox[0].subject)
  75. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  76. if line.startswith('http://'):
  77. token = line.rstrip('/').split('/')[-1]
  78. break
  79. else:
  80. self.fail("E-mail sent didn't contain confirmation url")
  81. response = self.client.get(reverse('misago:options-confirm-email-change', kwargs={
  82. 'token': token
  83. }))
  84. self.assertEqual(response.status_code, 200)
  85. self.reload_user()
  86. self.assertEqual(self.user.email, new_email)