You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.6 KiB

  1. from django.core import mail
  2. from django.conf import settings
  3. from django.test.utils import override_settings
  4. from hc.test import BaseTestCase
  5. from hc.accounts.models import Member
  6. from hc.api.models import TokenBucket
  7. class ProjectTestCase(BaseTestCase):
  8. def setUp(self):
  9. super(ProjectTestCase, self).setUp()
  10. self.url = "/projects/%s/settings/" % self.project.code
  11. def test_it_checks_access(self):
  12. self.client.login(username="[email protected]", password="password")
  13. r = self.client.get(self.url)
  14. self.assertEqual(r.status_code, 404)
  15. def test_it_allows_team_access(self):
  16. self.client.login(username="[email protected]", password="password")
  17. r = self.client.get(self.url)
  18. self.assertContains(r, "Change Project Name")
  19. def test_it_shows_api_keys(self):
  20. self.project.api_key_readonly = "R" * 32
  21. self.project.save()
  22. self.client.login(username="[email protected]", password="password")
  23. form = {"show_api_keys": "1"}
  24. r = self.client.post(self.url, form)
  25. self.assertEqual(r.status_code, 200)
  26. self.assertContains(r, "X" * 32)
  27. self.assertContains(r, "R" * 32)
  28. def test_it_creates_api_key(self):
  29. self.client.login(username="[email protected]", password="password")
  30. form = {"create_api_keys": "1"}
  31. r = self.client.post(self.url, form)
  32. self.assertEqual(r.status_code, 200)
  33. self.project.refresh_from_db()
  34. api_key = self.project.api_key
  35. self.assertTrue(len(api_key) > 10)
  36. self.assertFalse("b'" in api_key)
  37. def test_it_revokes_api_key(self):
  38. self.project.api_key_readonly = "R" * 32
  39. self.project.save()
  40. self.client.login(username="[email protected]", password="password")
  41. form = {"revoke_api_keys": "1"}
  42. r = self.client.post(self.url, form)
  43. self.assertEqual(r.status_code, 200)
  44. self.project.refresh_from_db()
  45. self.assertEqual(self.project.api_key, "")
  46. self.assertEqual(self.project.api_key_readonly, "")
  47. def test_it_adds_team_member(self):
  48. self.client.login(username="[email protected]", password="password")
  49. form = {"invite_team_member": "1", "email": "[email protected]"}
  50. r = self.client.post(self.url, form)
  51. self.assertEqual(r.status_code, 200)
  52. members = self.project.member_set.all()
  53. self.assertEqual(members.count(), 2)
  54. member = Member.objects.get(
  55. project=self.project, user__email="[email protected]"
  56. )
  57. profile = member.user.profile
  58. self.assertEqual(profile.current_project, self.project)
  59. # The new user should not have their own project
  60. self.assertFalse(member.user.project_set.exists())
  61. # And an email should have been sent
  62. subj = (
  63. "You have been invited to join"
  64. " Alice's Project on %s" % settings.SITE_NAME
  65. )
  66. self.assertEqual(mail.outbox[0].subject, subj)
  67. @override_settings(SECRET_KEY="test-secret")
  68. def test_it_rate_limits_invites(self):
  69. obj = TokenBucket(value="invite-%d" % self.alice.id)
  70. obj.tokens = 0
  71. obj.save()
  72. self.client.login(username="[email protected]", password="password")
  73. form = {"invite_team_member": "1", "email": "[email protected]"}
  74. r = self.client.post(self.url, form)
  75. self.assertContains(r, "Too Many Requests")
  76. self.assertEqual(len(mail.outbox), 0)
  77. def test_it_requires_owner_to_add_team_member(self):
  78. self.client.login(username="[email protected]", password="password")
  79. form = {"invite_team_member": "1", "email": "[email protected]"}
  80. r = self.client.post(self.url, form)
  81. self.assertEqual(r.status_code, 403)
  82. def test_it_checks_team_size(self):
  83. self.profile.team_limit = 0
  84. self.profile.save()
  85. self.client.login(username="[email protected]", password="password")
  86. form = {"invite_team_member": "1", "email": "[email protected]"}
  87. r = self.client.post(self.url, form)
  88. self.assertEqual(r.status_code, 403)
  89. def test_it_removes_team_member(self):
  90. self.client.login(username="[email protected]", password="password")
  91. form = {"remove_team_member": "1", "email": "[email protected]"}
  92. r = self.client.post(self.url, form)
  93. self.assertEqual(r.status_code, 200)
  94. self.assertEqual(Member.objects.count(), 0)
  95. self.bobs_profile.refresh_from_db()
  96. self.assertEqual(self.bobs_profile.current_project, None)
  97. def test_it_requires_owner_to_remove_team_member(self):
  98. self.client.login(username="[email protected]", password="password")
  99. form = {"remove_team_member": "1", "email": "[email protected]"}
  100. r = self.client.post(self.url, form)
  101. self.assertEqual(r.status_code, 403)
  102. def test_it_checks_membership_when_removing_team_member(self):
  103. self.client.login(username="[email protected]", password="password")
  104. url = "/projects/%s/settings/" % self.charlies_project.code
  105. form = {"remove_team_member": "1", "email": "[email protected]"}
  106. r = self.client.post(url, form)
  107. self.assertEqual(r.status_code, 400)
  108. self.profile.refresh_from_db()
  109. self.assertIsNotNone(self.profile.current_project)
  110. def test_it_sets_project_name(self):
  111. self.client.login(username="[email protected]", password="password")
  112. form = {"set_project_name": "1", "name": "Alpha Team"}
  113. r = self.client.post(self.url, form)
  114. self.assertEqual(r.status_code, 200)
  115. self.project.refresh_from_db()
  116. self.assertEqual(self.project.name, "Alpha Team")