/fruitful_forums/forums/tests/test_forums_post.py

https://gitlab.com/bplatta/proto-api · Python · 345 lines · 237 code · 57 blank · 51 comment · 0 complexity · e5e1f3249bd60cb98ff42d2699385fe5 MD5 · raw file

  1. from random import choice
  2. from django.contrib.auth.hashers import check_password
  3. from django.test import tag
  4. from rest_framework import status
  5. from fruitful_forums.forums.models import Forum
  6. from fruitful_forums.forums.urls import NAMESPACE as FORUM_NAMESPACE
  7. from fruitful_forums.forums.views.forums_view import ForumsView
  8. from fruitful_forums.utils.forums_data_manager import ForumsDataManager
  9. from fruitful_forums.utils.asserter import TestAssertionHelper
  10. from utils.testing.base_test_case import BaseAPIAllViewTestCase
  11. @tag('db')
  12. class ForumsPostIntegTestCase(BaseAPIAllViewTestCase):
  13. """
  14. Test Case for the Forums Collection POST operations
  15. """
  16. parent_none = None
  17. POST_FORMAT = 'json'
  18. view_under_test = ForumsView
  19. app_namespace = FORUM_NAMESPACE
  20. forum_data = ForumsDataManager()
  21. assert_helper = TestAssertionHelper()
  22. @classmethod
  23. def tearDownClass(cls):
  24. """
  25. Cleanup data created for tests
  26. """
  27. cls.forum_data.cleanup()
  28. super(ForumsPostIntegTestCase, cls).tearDownClass()
  29. def test_create_forum_unauthed_failed(self):
  30. """
  31. Test creating forum fails if user is unauthed
  32. """
  33. client = self.de_auth_client(self.client)
  34. response = client.post(
  35. self.collection_endpoint(), data={}, format=self.POST_FORMAT)
  36. self.assertEqual(
  37. response.status_code, status.HTTP_403_FORBIDDEN, response.data)
  38. def test_create_forum_success_authed_user(self):
  39. """
  40. Test creating a forum for an authed api user succeeds
  41. """
  42. self.bearer_auth_client(self.token)
  43. self.as_non_staff(self.user)
  44. post_data = self.forum_data.rand_forum_post_data()
  45. post_data['resources'] = [
  46. self.forum_data.rand_forum_resource_data(resource_number=None)
  47. ]
  48. assert_on_create = self.assert_helper.assert_post_forum(
  49. self, post_data)
  50. response = self.client.post(
  51. self.collection_endpoint(),
  52. data=post_data, format=self.POST_FORMAT)
  53. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  54. self.assertIn('id', response.data)
  55. uid = response.data['id']
  56. new_forum = Forum.objects.get(uid=uid)
  57. creator = new_forum.creator_participant
  58. assert_on_create(new_forum)
  59. self.assertEqual(creator.user.uid, self.user.uid)
  60. def test_create_forum_success_anon_admin_user(self):
  61. """
  62. Test creating a forum for anonymous user by admin
  63. """
  64. self.bearer_auth_client(self.token)
  65. self.as_staff(self.user)
  66. post_data = self.forum_data.rand_forum_post_data(anon_user=True)
  67. assert_on_create = self.assert_helper.assert_post_forum(
  68. self, post_data)
  69. response = self.client.post(
  70. self.collection_endpoint(),
  71. data=post_data, format=self.POST_FORMAT)
  72. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  73. self.assertIn('id', response.data)
  74. uid = response.data['id']
  75. new_forum = Forum.objects.get(uid=uid)
  76. assert_on_create(new_forum, new_forum.creator_participant)
  77. def test_create_forum_fail_for_anon_non_admin(self):
  78. """
  79. Test creating a forum for anonymous user by non-admin fails
  80. """
  81. self.bearer_auth_client(self.token)
  82. self.as_non_staff(self.user)
  83. post_data = self.forum_data.rand_forum_post_data(anon_user=True)
  84. response = self.client.post(
  85. self.collection_endpoint(),
  86. data=post_data, format=self.POST_FORMAT)
  87. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  88. self.assertEqual(response.data, {
  89. 'error': ['Only admin can create Forums on behalf '
  90. 'of anonymous users.']
  91. })
  92. def test_create_forum_missing_req_fields(self):
  93. """
  94. Test creating a forum fails if missing required fields
  95. """
  96. self.bearer_auth_client(self.token)
  97. self.as_non_staff(self.user)
  98. pop_fields = ['topic', 'goal', 'type']
  99. missing_field = choice(pop_fields)
  100. post_data = self.forum_data.rand_forum_post_data()
  101. post_data.pop(missing_field)
  102. response = self.client.post(
  103. self.collection_endpoint(),
  104. data=post_data, format=self.POST_FORMAT)
  105. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  106. self.assertEqual(response.data, {
  107. missing_field: ['This field is required.']
  108. })
  109. def test_create_forum_anon_user_missing_fields(self):
  110. """
  111. Test creating a forum for anonymous user fails if missing fields
  112. """
  113. self.bearer_auth_client(self.token)
  114. self.as_staff(self.user)
  115. pop_fields = ['name', 'user_password']
  116. missing_field = choice(pop_fields)
  117. post_data = self.forum_data.rand_forum_post_data(anon_user=True)
  118. post_data.pop(missing_field)
  119. response = self.client.post(
  120. self.collection_endpoint(),
  121. data=post_data, format=self.POST_FORMAT)
  122. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  123. self.assertEqual(response.data, {
  124. missing_field: ['This field is required if creating forum on '
  125. 'behalf of unauthenticated user.']
  126. })
  127. def test_create_private_forum_missing_password(self):
  128. """
  129. Test creating a private forum fails if missing password
  130. """
  131. self.bearer_auth_client(self.token)
  132. self.as_non_staff(self.user)
  133. post_data = self.forum_data.rand_forum_post_data(
  134. forum_type=Forum.PRIVATE_FORUM)
  135. post_data.pop('forum_password')
  136. response = self.client.post(
  137. self.collection_endpoint(),
  138. data=post_data, format=self.POST_FORMAT)
  139. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  140. self.assertEqual(response.data, {
  141. 'forum_password': ['A `forum_password` must be provided if '
  142. 'forum type is private']
  143. })
  144. def test_create_forum_bad_data_types(self):
  145. """
  146. Test creating a forum fails with bad data types
  147. """
  148. self.bearer_auth_client(self.token)
  149. self.as_non_staff(self.user)
  150. post_data = self.forum_data.rand_forum_post_data(
  151. forum_type=Forum.PRIVATE_FORUM)
  152. post_data['max_participants'] = 'notaninteger'
  153. response = self.client.post(
  154. self.collection_endpoint(),
  155. data=post_data, format=self.POST_FORMAT)
  156. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  157. self.assertEqual(response.data, {
  158. 'max_participants': ['A valid integer is required.']
  159. })
  160. def test_update_forum_invalid_fields(self):
  161. """
  162. Test updating invalid fields for a forum fails
  163. """
  164. forum, p = self.forum_data.create_single_forum__public(user=self.user)
  165. self.bearer_auth_client(self.token)
  166. self.as_non_staff(self.user)
  167. invalid_field = choice([
  168. 'name', 'phone_number', 'user_password', 'email'])
  169. post_data = {
  170. invalid_field: self.forum_data.randomizer.generate_field(str)
  171. }
  172. response = self.client.post(
  173. self.resource_endpoint(uid=forum['uid']),
  174. data=post_data, format=self.POST_FORMAT)
  175. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  176. self.assertEqual(response.data, {
  177. invalid_field: ['Invalid field for update operation. '
  178. 'Please update (post) the '
  179. 'relevant related forum resource.']
  180. }, post_data)
  181. def test_update_forum_fields_success(self):
  182. """
  183. Test updating valid update fields succeeds
  184. """
  185. forum, p = self.forum_data.create_single_forum__public(user=self.user)
  186. self.bearer_auth_client(self.token)
  187. self.as_non_staff(self.user)
  188. valid_field = choice([
  189. ('topic', str), ('goal', str),
  190. ('description', str), ('max_participants', int)
  191. ])
  192. post_data = {
  193. valid_field[0]: self.forum_data.randomizer.generate_field(
  194. valid_field[1])
  195. }
  196. response = self.client.post(
  197. self.resource_endpoint(uid=forum['uid']),
  198. data=post_data, format=self.POST_FORMAT)
  199. self.assertEqual(response.status_code, status.HTTP_200_OK)
  200. def test_update_forum_tags_success(self):
  201. """
  202. Test updating tags for forum succeeds
  203. """
  204. forum, p = self.forum_data.create_single_forum__public(user=self.user)
  205. self.bearer_auth_client(self.token)
  206. self.as_non_staff(self.user)
  207. post_data = {
  208. 'tags': [
  209. self.forum_data.randomizer.generate_field(str),
  210. self.forum_data.randomizer.generate_field(str)
  211. ]
  212. }
  213. response = self.client.post(
  214. self.resource_endpoint(uid=forum['uid']),
  215. data=post_data, format=self.POST_FORMAT)
  216. self.assertEqual(response.status_code, status.HTTP_200_OK)
  217. forum = Forum.objects.get(uid=forum['uid'])
  218. self.assertEqual(forum.tags, post_data['tags'])
  219. def test_update_forum_private_no_password_fails(self):
  220. """
  221. Test updating type of forum to private without password fails
  222. """
  223. forum, p = self.forum_data.create_single_forum__public(user=self.user)
  224. self.bearer_auth_client(self.token)
  225. self.as_non_staff(self.user)
  226. post_data = {
  227. 'type': Forum.PRIVATE_FORUM
  228. }
  229. response = self.client.post(
  230. self.resource_endpoint(uid=forum['uid']),
  231. data=post_data, format=self.POST_FORMAT)
  232. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  233. self.assertEqual(response.data, {
  234. 'forum_password': ['A `forum_password` must be provided if '
  235. 'forum type is private']
  236. })
  237. def test_update_forum_password_succeeds(self):
  238. """
  239. Test updating password for forum succeeds
  240. """
  241. forum, p = self.forum_data.create_single_forum__private(user=self.user)
  242. self.bearer_auth_client(self.token)
  243. self.as_non_staff(self.user)
  244. post_data = {
  245. 'forum_password': self.forum_data.randomizer.generate_field(str)
  246. }
  247. response = self.client.post(
  248. self.resource_endpoint(uid=forum['uid']),
  249. data=post_data, format=self.POST_FORMAT)
  250. forum_instance = Forum.objects.get(uid=forum['uid'])
  251. self.assertEqual(response.status_code, status.HTTP_200_OK)
  252. self.assertTrue(check_password(
  253. post_data['forum_password'],
  254. forum_instance.password
  255. ))
  256. def test_update_forum_non_owner_fails(self):
  257. """
  258. Test updating a forum by non-owner fails
  259. """
  260. new_user, creds = self.new_user()
  261. forum, p = self.forum_data.create_single_forum__public(user=new_user)
  262. self.bearer_auth_client(self.token)
  263. self.as_non_staff(self.user)
  264. post_data = {
  265. 'topic': self.forum_data.randomizer.generate_field(str)
  266. }
  267. response = self.client.post(
  268. self.resource_endpoint(uid=forum['uid']),
  269. data=post_data, format=self.POST_FORMAT)
  270. self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
  271. def test_update_forum_non_owner_as_admin_succeeds(self):
  272. """
  273. Test updating a forum by non-owner admin succeeds
  274. """
  275. new_user, creds = self.new_user()
  276. forum, p = self.forum_data.create_single_forum__public(user=new_user)
  277. self.bearer_auth_client(self.token)
  278. self.as_staff(self.user)
  279. post_data = {
  280. 'topic': self.forum_data.randomizer.generate_field(str)
  281. }
  282. response = self.client.post(
  283. self.resource_endpoint(uid=forum['uid']),
  284. data=post_data, format=self.POST_FORMAT)
  285. self.assertEqual(response.status_code, status.HTTP_200_OK)
  286. self.assertEqual(
  287. Forum.objects.get(uid=forum['uid']).topic,
  288. post_data['topic'])