test_user_changeemail_api.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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(
  22. response.json(), {
  23. 'new_email': ["This field is required."],
  24. 'password': ["This field is required."],
  25. }
  26. )
  27. def test_invalid_password(self):
  28. """api errors correctly for invalid password"""
  29. response = self.client.post(
  30. self.link,
  31. data={
  32. 'new_email': 'new@email.com',
  33. 'password': 'Lor3mIpsum',
  34. },
  35. )
  36. self.assertContains(response, 'password is invalid', status_code=400)
  37. def test_invalid_input(self):
  38. """api errors correctly for invalid input"""
  39. response = self.client.post(
  40. self.link,
  41. data={
  42. 'new_email': '',
  43. 'password': self.USER_PASSWORD,
  44. },
  45. )
  46. self.assertEqual(response.status_code, 400)
  47. self.assertEqual(response.json(), {
  48. 'new_email': ["This field may not be blank."],
  49. })
  50. response = self.client.post(
  51. self.link,
  52. data={
  53. 'new_email': 'newmail',
  54. 'password': self.USER_PASSWORD,
  55. },
  56. )
  57. self.assertEqual(response.status_code, 400)
  58. self.assertEqual(response.json(), {
  59. 'new_email': ["Enter a valid email address."],
  60. })
  61. def test_email_taken(self):
  62. """api validates email usage"""
  63. UserModel.objects.create_user('BobBoberson', 'new@email.com', 'Pass.123')
  64. response = self.client.post(
  65. self.link,
  66. data={
  67. 'new_email': 'new@email.com',
  68. 'password': self.USER_PASSWORD,
  69. },
  70. )
  71. self.assertContains(response, 'not available', status_code=400)
  72. def test_change_email(self):
  73. """api allows users to change their e-mail addresses"""
  74. new_email = 'new@email.com'
  75. response = self.client.post(
  76. self.link,
  77. data={
  78. 'new_email': new_email,
  79. 'password': self.USER_PASSWORD,
  80. },
  81. )
  82. self.assertEqual(response.status_code, 200)
  83. self.assertIn('Confirm e-mail change', mail.outbox[0].subject)
  84. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  85. if line.startswith('http://'):
  86. token = line.rstrip('/').split('/')[-1]
  87. break
  88. else:
  89. self.fail("E-mail sent didn't contain confirmation url")
  90. response = self.client.get(
  91. reverse(
  92. 'misago:options-confirm-email-change',
  93. kwargs={
  94. 'token': token,
  95. },
  96. )
  97. )
  98. self.assertEqual(response.status_code, 200)
  99. self.reload_user()
  100. self.assertEqual(self.user.email, new_email)