test_thread_pollvotes_api.py 5.4 KB

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