test_thread_pollvotes_api.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from django.contrib.auth import get_user_model
  2. from django.core.urlresolvers import reverse
  3. from ..models import Poll, PollVote
  4. from .test_thread_poll_api import ThreadPollApiTestCase
  5. class ThreadGetVotesTests(ThreadPollApiTestCase):
  6. def setUp(self):
  7. super(ThreadGetVotesTests, self).setUp()
  8. self.mock_poll()
  9. self.poll.is_public = True
  10. self.poll.save()
  11. self.api_link = reverse('misago:api:thread-poll-votes', kwargs={
  12. 'thread_pk': self.thread.pk,
  13. 'pk': self.poll.pk
  14. })
  15. def test_anonymous(self):
  16. """api allows guests to get poll votes"""
  17. self.logout_user()
  18. response = self.client.get(self.api_link)
  19. self.assertEqual(response.status_code, 200)
  20. def test_invalid_thread_id(self):
  21. """api validates that thread id is integer"""
  22. api_link = reverse('misago:api:thread-poll-votes', kwargs={
  23. 'thread_pk': 'kjha6dsa687sa',
  24. 'pk': self.poll.pk
  25. })
  26. response = self.client.get(api_link)
  27. self.assertEqual(response.status_code, 404)
  28. def test_nonexistant_thread_id(self):
  29. """api validates that thread exists"""
  30. api_link = reverse('misago:api:thread-poll-votes', kwargs={
  31. 'thread_pk': self.thread.pk + 1,
  32. 'pk': self.poll.pk
  33. })
  34. response = self.client.get(api_link)
  35. self.assertEqual(response.status_code, 404)
  36. def test_invalid_poll_id(self):
  37. """api validates that poll id is integer"""
  38. api_link = reverse('misago:api:thread-poll-votes', kwargs={
  39. 'thread_pk': self.thread.pk,
  40. 'pk': 'sad98as7d97sa98'
  41. })
  42. response = self.client.get(api_link)
  43. self.assertEqual(response.status_code, 404)
  44. def test_nonexistant_poll_id(self):
  45. """api validates that poll exists"""
  46. api_link = reverse('misago:api:thread-poll-votes', kwargs={
  47. 'thread_pk': self.thread.pk,
  48. 'pk': self.poll.pk + 123
  49. })
  50. response = self.client.get(api_link)
  51. self.assertEqual(response.status_code, 404)
  52. def test_no_permission(self):
  53. """api chcecks permission to see poll voters"""
  54. self.override_acl({
  55. 'can_always_see_poll_voters': False
  56. })
  57. self.poll.is_public = False
  58. self.poll.save()
  59. response = self.client.get(self.api_link)
  60. self.assertEqual(response.status_code, 403)
  61. def test_nonpublic_poll(self):
  62. """api validates that poll is public"""
  63. self.logout_user()
  64. self.poll.is_public = False
  65. self.poll.save()
  66. response = self.client.get(self.api_link)
  67. self.assertEqual(response.status_code, 403)
  68. def test_get_votes(self):
  69. """api returns list of voters"""
  70. response = self.client.get(self.api_link)
  71. self.assertEqual(response.status_code, 200)
  72. response_json = response.json()
  73. self.assertEqual(len(response_json), 4)
  74. self.assertEqual([c['label'] for c in response_json], ['Alpha', 'Beta', 'Gamma', 'Delta'])
  75. self.assertEqual([c['votes'] for c in response_json], [1, 0, 2, 1])
  76. self.assertEqual([len(c['voters']) for c in response_json], [1, 0, 2, 1])
  77. self.assertEqual([[v['username'] for v in c['voters']] for c in response_json], [
  78. ['bob'],
  79. [],
  80. [self.user.username, 'deleted'],
  81. [self.user.username]
  82. ])
  83. User = get_user_model()
  84. user = User.objects.get(slug='bob')
  85. self.assertEqual([[v['url'] for v in c['voters']] for c in response_json], [
  86. [user.get_absolute_url()],
  87. [],
  88. [self.user.get_absolute_url(), None],
  89. [self.user.get_absolute_url()]
  90. ])
  91. def test_get_votes_private_poll(self):
  92. """api returns list of voters on private poll for user with permission"""
  93. self.override_acl({
  94. 'can_always_see_poll_voters': True
  95. })
  96. self.poll.is_public = False
  97. self.poll.save()
  98. response = self.client.get(self.api_link)
  99. self.assertEqual(response.status_code, 200)
  100. response_json = response.json()
  101. self.assertEqual(len(response_json), 4)
  102. self.assertEqual([c['label'] for c in response_json], ['Alpha', 'Beta', 'Gamma', 'Delta'])
  103. self.assertEqual([c['votes'] for c in response_json], [1, 0, 2, 1])
  104. self.assertEqual([len(c['voters']) for c in response_json], [1, 0, 2, 1])
  105. self.assertEqual([[v['username'] for v in c['voters']] for c in response_json][0][0], 'bob')
  106. User = get_user_model()
  107. user = User.objects.get(slug='bob')
  108. self.assertEqual(
  109. [[v['url'] for v in c['voters']] for c in response_json][0][0], user.get_absolute_url())
  110. class ThreadPostVotesTests(ThreadPollApiTestCase):
  111. def setUp(self):
  112. super(ThreadPostVotesTests, self).setUp()
  113. self.mock_poll()
  114. self.api_link = reverse('misago:api:thread-poll-votes', kwargs={
  115. 'thread_pk': self.thread.pk,
  116. 'pk': self.poll.pk
  117. })
  118. def test_anonymous(self):
  119. """api requires you to sign in to vote in poll"""
  120. self.logout_user()
  121. response = self.post(self.api_link)
  122. self.assertEqual(response.status_code, 403)