test.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. from django.core import mail
  2. from django.shortcuts import reverse
  3. from rest_framework.test import APITestCase
  4. from model_bakery import baker
  5. from glitchtip import test_utils # pylint: disable=unused-import
  6. from organizations_ext.models import OrganizationUserRole
  7. from .models import UserProjectAlert
  8. class OrganizationsAPITestCase(APITestCase):
  9. def test_organizations_retrieve(self):
  10. url = reverse("rest_register")
  11. data = {
  12. "email": "test@example.com",
  13. "password1": "hunter222",
  14. "password2": "hunter222",
  15. }
  16. res = self.client.post(url, data)
  17. self.assertContains(res, "key", status_code=201)
  18. class UsersTestCase(APITestCase):
  19. def setUp(self):
  20. self.user = baker.make("users.user")
  21. self.organization = baker.make("organizations_ext.Organization")
  22. self.organization.add_user(self.user, OrganizationUserRole.ADMIN)
  23. self.team = baker.make("teams.Team", organization=self.organization)
  24. self.team.members.add(self.user)
  25. self.project = baker.make("projects.Project", organization=self.organization)
  26. self.project.team_set.add(self.team)
  27. self.client.force_login(self.user)
  28. def test_list(self):
  29. url = reverse("user-list")
  30. res = self.client.get(url)
  31. self.assertContains(res, self.user.email)
  32. def test_retrieve(self):
  33. url = reverse("user-detail", args=["me"])
  34. res = self.client.get(url)
  35. self.assertContains(res, self.user.email)
  36. def test_organization_members_list(self):
  37. other_user = baker.make("users.user")
  38. other_organization = baker.make("organizations_ext.Organization")
  39. other_organization.add_user(other_user, OrganizationUserRole.ADMIN)
  40. user2 = baker.make("users.User")
  41. self.organization.add_user(user2, OrganizationUserRole.MEMBER)
  42. url = reverse("organization-members-list", args=[self.organization.slug])
  43. res = self.client.get(url)
  44. self.assertContains(res, user2.email)
  45. self.assertNotContains(res, other_user.email)
  46. # Can't view members of groups you don't belong to
  47. url = reverse("organization-members-list", args=[other_organization.slug])
  48. res = self.client.get(url)
  49. self.assertNotContains(res, other_user.email)
  50. # def test_organization_members_create(self):
  51. # url = reverse("organization-members-list", args=[self.organization.slug])
  52. # data = {
  53. # "email": "new@example.com",
  54. # "role": "member",
  55. # "teams": [],
  56. # "user": "new@example.com",
  57. # }
  58. # res = self.client.post(url, data)
  59. # self.assertEqual(res.status_code, 201)
  60. # # TODO pending functionality
  61. # # self.assertTrue(res.data["pending"])
  62. # User.objects.get(pk=res.data["id"])
  63. def test_emails_retrieve(self):
  64. email_address = baker.make("account.EmailAddress", user=self.user)
  65. url = reverse("user-emails-list", args=["me"])
  66. res = self.client.get(url)
  67. self.assertContains(res, email_address.email)
  68. def test_emails_create(self):
  69. url = reverse("user-emails-list", args=["me"])
  70. new_email = "new@exmaple.com"
  71. data = {"email": new_email}
  72. res = self.client.post(url, data)
  73. self.assertContains(res, new_email, status_code=201)
  74. self.assertTrue(
  75. self.user.emailaddress_set.filter(email=new_email, verified=False).exists()
  76. )
  77. self.assertEqual(len(mail.outbox), 1)
  78. # Ensure token is valid and can verify email
  79. body = mail.outbox[0].body
  80. key = body[body.find("confirm-email") :].split("/")[1]
  81. url = reverse("rest_verify_email")
  82. data = {"key": key}
  83. res = self.client.post(url, data)
  84. self.assertTrue(
  85. self.user.emailaddress_set.filter(email=new_email, verified=True).exists()
  86. )
  87. def test_emails_create_dupe_email(self):
  88. url = reverse("user-emails-list", args=["me"])
  89. email_address = baker.make("account.EmailAddress", user=self.user)
  90. data = {"email": email_address.email}
  91. res = self.client.post(url, data)
  92. self.assertContains(res, "this account", status_code=400)
  93. def test_emails_create_dupe_email_other_user(self):
  94. url = reverse("user-emails-list", args=["me"])
  95. email_address = baker.make("account.EmailAddress")
  96. data = {"email": email_address.email}
  97. res = self.client.post(url, data)
  98. self.assertContains(res, "another account", status_code=400)
  99. def test_emails_set_primary(self):
  100. url = reverse("user-emails-list", args=["me"])
  101. email_address = baker.make(
  102. "account.EmailAddress", verified=True, user=self.user
  103. )
  104. data = {"email": email_address.email}
  105. res = self.client.put(url, data)
  106. self.assertContains(res, email_address.email, status_code=200)
  107. self.assertTrue(
  108. self.user.emailaddress_set.filter(
  109. email=email_address.email, primary=True
  110. ).exists()
  111. )
  112. def test_emails_destroy(self):
  113. url = reverse("user-emails-list", args=["me"])
  114. email_address = baker.make(
  115. "account.EmailAddress", verified=True, primary=False, user=self.user
  116. )
  117. data = {"email": email_address.email}
  118. res = self.client.delete(url, data)
  119. self.assertEqual(res.status_code, 204)
  120. self.assertFalse(
  121. self.user.emailaddress_set.filter(email=email_address.email).exists()
  122. )
  123. def test_notifications_retrieve(self):
  124. url = reverse("user-detail", args=["me"]) + "notifications/"
  125. res = self.client.get(url)
  126. self.assertContains(res, "subscribeByDefault")
  127. def test_notifications_update(self):
  128. url = reverse("user-detail", args=["me"]) + "notifications/"
  129. data = {"subscribeByDefault": False}
  130. res = self.client.put(url, data)
  131. self.assertFalse(res.data.get("subscribeByDefault"))
  132. self.user.refresh_from_db()
  133. self.assertFalse(self.user.subscribe_by_default)
  134. def test_alerts_retrieve(self):
  135. url = reverse("user-detail", args=["me"]) + "notifications/alerts/"
  136. alert = baker.make(
  137. "users.UserProjectAlert", user=self.user, project=self.project
  138. )
  139. res = self.client.get(url)
  140. self.assertContains(res, self.project.id)
  141. self.assertEqual(res.data[self.project.id], alert.status)
  142. def test_alerts_update(self):
  143. url = reverse("user-detail", args=["me"]) + "notifications/alerts/"
  144. # Set to alert to On
  145. data = '{"' + str(self.project.id) + '":1}'
  146. res = self.client.put(url, data, content_type="application/json")
  147. self.assertEqual(res.status_code, 204)
  148. self.assertEqual(UserProjectAlert.objects.all().count(), 1)
  149. self.assertEqual(UserProjectAlert.objects.first().status, 1)
  150. # Set to alert to Off
  151. data = '{"' + str(self.project.id) + '":0}'
  152. res = self.client.put(url, data, content_type="application/json")
  153. self.assertEqual(res.status_code, 204)
  154. self.assertEqual(UserProjectAlert.objects.first().status, 0)
  155. # Set to alert to "default"
  156. data = '{"' + str(self.project.id) + '":-1}'
  157. res = self.client.put(url, data, content_type="application/json")
  158. self.assertEqual(res.status_code, 204)
  159. # Default deletes the row
  160. self.assertEqual(UserProjectAlert.objects.all().count(), 0)