test_threadpost_patch_api.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import json
  4. from datetime import timedelta
  5. from django.core.urlresolvers import reverse
  6. from django.test.client import BOUNDARY, MULTIPART_CONTENT, encode_multipart
  7. from django.utils import timezone
  8. from django.utils.encoding import smart_str
  9. from misago.acl.testutils import override_acl
  10. from misago.categories.models import Category
  11. from misago.users.testutils import AuthenticatedUserTestCase
  12. from .. import testutils
  13. from ..models import Thread
  14. class ThreadPostPatchApiTestCase(AuthenticatedUserTestCase):
  15. def setUp(self):
  16. super(ThreadPostPatchApiTestCase, self).setUp()
  17. self.category = Category.objects.get(slug='first-category')
  18. self.thread = testutils.post_thread(category=self.category)
  19. self.post = testutils.reply_thread(self.thread, poster=self.user)
  20. self.api_link = reverse('misago:api:thread-post-detail', kwargs={
  21. 'thread_pk': self.thread.pk,
  22. 'pk': self.post.pk
  23. })
  24. def patch(self, api_link, ops):
  25. return self.client.patch(api_link, json.dumps(ops), content_type="application/json")
  26. def refresh_post(self):
  27. self.post = self.thread.post_set.get(pk=self.post.pk)
  28. def override_acl(self, extra_acl=None):
  29. new_acl = self.user.acl
  30. new_acl['categories'][self.category.pk].update({
  31. 'can_see': 1,
  32. 'can_browse': 1,
  33. 'can_start_threads': 0,
  34. 'can_reply_threads': 0,
  35. 'can_edit_posts': 1
  36. })
  37. if extra_acl:
  38. new_acl['categories'][self.category.pk].update(extra_acl)
  39. override_acl(self.user, new_acl)
  40. class PostAddAclApiTests(ThreadPostPatchApiTestCase):
  41. def test_add_acl_true(self):
  42. """api adds current event's acl to response"""
  43. response = self.patch(self.api_link, [
  44. {'op': 'add', 'path': 'acl', 'value': True}
  45. ])
  46. self.assertEqual(response.status_code, 200)
  47. response_json = json.loads(smart_str(response.content))
  48. self.assertTrue(response_json['acl'])
  49. def test_add_acl_false(self):
  50. """if value is false, api won't add acl to the response, but will set empty key"""
  51. response = self.patch(self.api_link, [
  52. {'op': 'add', 'path': 'acl', 'value': False}
  53. ])
  54. self.assertEqual(response.status_code, 200)
  55. response_json = json.loads(smart_str(response.content))
  56. self.assertIsNone(response_json['acl'])
  57. response = self.patch(self.api_link, [
  58. {'op': 'add', 'path': 'acl', 'value': True}
  59. ])
  60. self.assertEqual(response.status_code, 200)
  61. class PostProtectApiTests(ThreadPostPatchApiTestCase):
  62. def test_protect_post(self):
  63. """api makes it possible to protect post"""
  64. self.override_acl({
  65. 'can_protect_posts': 1
  66. })
  67. response = self.patch(self.api_link, [
  68. {'op': 'replace', 'path': 'is-protected', 'value': True}
  69. ])
  70. self.assertEqual(response.status_code, 200)
  71. self.refresh_post()
  72. self.assertTrue(self.post.is_protected)
  73. def test_unprotect_post(self):
  74. """api makes it possible to unprotect protected post"""
  75. self.post.is_protected = True
  76. self.post.save()
  77. self.override_acl({
  78. 'can_protect_posts': 1
  79. })
  80. response = self.patch(self.api_link, [
  81. {'op': 'replace', 'path': 'is-protected', 'value': False}
  82. ])
  83. self.assertEqual(response.status_code, 200)
  84. self.refresh_post()
  85. self.assertFalse(self.post.is_protected)
  86. def test_protect_post_no_permission(self):
  87. """api validates permission to protect post"""
  88. self.override_acl({
  89. 'can_protect_posts': 0
  90. })
  91. response = self.patch(self.api_link, [
  92. {'op': 'replace', 'path': 'is-protected', 'value': True}
  93. ])
  94. self.assertEqual(response.status_code, 400)
  95. response_json = json.loads(smart_str(response.content))
  96. self.assertEqual(response_json['detail'][0], "You can't protect posts in this category.")
  97. self.refresh_post()
  98. self.assertFalse(self.post.is_protected)
  99. def test_unprotect_post_no_permission(self):
  100. """api validates permission to unprotect post"""
  101. self.post.is_protected = True
  102. self.post.save()
  103. self.override_acl({
  104. 'can_protect_posts': 0
  105. })
  106. response = self.patch(self.api_link, [
  107. {'op': 'replace', 'path': 'is-protected', 'value': False}
  108. ])
  109. self.assertEqual(response.status_code, 400)
  110. response_json = json.loads(smart_str(response.content))
  111. self.assertEqual(response_json['detail'][0], "You can't protect posts in this category.")
  112. self.refresh_post()
  113. self.assertTrue(self.post.is_protected)
  114. def test_unprotect_post_not_editable(self):
  115. """api validates if we can edit post we want to protect"""
  116. self.override_acl({
  117. 'can_edit_posts': 0,
  118. 'can_protect_posts': 1
  119. })
  120. response = self.patch(self.api_link, [
  121. {'op': 'replace', 'path': 'is-protected', 'value': True}
  122. ])
  123. self.assertEqual(response.status_code, 400)
  124. response_json = json.loads(smart_str(response.content))
  125. self.assertEqual(response_json['detail'][0], "You can't protect posts you can't edit.")
  126. self.refresh_post()
  127. self.assertFalse(self.post.is_protected)
  128. class PostApproveApiTests(ThreadPostPatchApiTestCase):
  129. def test_approve_post(self):
  130. """api makes it possible to approve post"""
  131. self.post.is_unapproved = True
  132. self.post.save()
  133. self.override_acl({
  134. 'can_approve_content': 1
  135. })
  136. response = self.patch(self.api_link, [
  137. {'op': 'replace', 'path': 'is-unapproved', 'value': True}
  138. ])
  139. self.assertEqual(response.status_code, 200)
  140. self.refresh_post()
  141. self.assertFalse(self.post.is_unapproved)
  142. def test_unapprove_post(self):
  143. """unapproving posts is not supported by api"""
  144. self.override_acl({
  145. 'can_approve_content': 1
  146. })
  147. response = self.patch(self.api_link, [
  148. {'op': 'replace', 'path': 'is-unapproved', 'value': False}
  149. ])
  150. self.assertEqual(response.status_code, 200)
  151. self.refresh_post()
  152. self.assertFalse(self.post.is_unapproved)
  153. def test_approve_post_no_permission(self):
  154. """api validates approval permission"""
  155. self.post.is_unapproved = True
  156. self.post.save()
  157. self.override_acl({
  158. 'can_approve_content': 0
  159. })
  160. response = self.patch(self.api_link, [
  161. {'op': 'replace', 'path': 'is-unapproved', 'value': True}
  162. ])
  163. self.assertEqual(response.status_code, 400)
  164. response_json = json.loads(smart_str(response.content))
  165. self.assertEqual(response_json['detail'][0], "You can't approve posts in this category.")
  166. self.refresh_post()
  167. self.assertTrue(self.post.is_unapproved)
  168. def test_approve_first_post(self):
  169. """api approve first post fails"""
  170. self.post.is_unapproved = True
  171. self.post.save()
  172. self.thread.set_first_post(self.post)
  173. self.thread.save()
  174. self.override_acl({
  175. 'can_approve_content': 1
  176. })
  177. response = self.patch(self.api_link, [
  178. {'op': 'replace', 'path': 'is-unapproved', 'value': True}
  179. ])
  180. self.assertEqual(response.status_code, 400)
  181. response_json = json.loads(smart_str(response.content))
  182. self.assertEqual(response_json['detail'][0], "You can't approve thread's first post.")
  183. self.refresh_post()
  184. self.assertTrue(self.post.is_unapproved)
  185. def test_approve_hidden_post(self):
  186. """api approve hidden post fails"""
  187. self.post.is_unapproved = True
  188. self.post.is_hidden = True
  189. self.post.save()
  190. self.override_acl({
  191. 'can_approve_content': 1
  192. })
  193. response = self.patch(self.api_link, [
  194. {'op': 'replace', 'path': 'is-unapproved', 'value': True}
  195. ])
  196. self.assertEqual(response.status_code, 400)
  197. response_json = json.loads(smart_str(response.content))
  198. self.assertEqual(response_json['detail'][0], "You can't approve posts the content you can't see.")
  199. self.refresh_post()
  200. self.assertTrue(self.post.is_unapproved)
  201. class PostHideApiTests(ThreadPostPatchApiTestCase):
  202. def test_hide_post(self):
  203. """api makes it possible to hide post"""
  204. self.override_acl({
  205. 'can_hide_posts': 1
  206. })
  207. response = self.patch(self.api_link, [
  208. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  209. ])
  210. self.assertEqual(response.status_code, 200)
  211. self.refresh_post()
  212. self.assertTrue(self.post.is_hidden)
  213. def test_show_post(self):
  214. """api makes it possible to unhide post"""
  215. self.post.is_hidden = True
  216. self.post.save()
  217. self.refresh_post()
  218. self.assertTrue(self.post.is_hidden)
  219. self.override_acl({
  220. 'can_hide_posts': 1
  221. })
  222. response = self.patch(self.api_link, [
  223. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  224. ])
  225. self.assertEqual(response.status_code, 200)
  226. self.refresh_post()
  227. self.assertFalse(self.post.is_hidden)
  228. def test_hide_own_post(self):
  229. """api makes it possible to hide owned post"""
  230. self.override_acl({
  231. 'can_hide_own_posts': 1
  232. })
  233. response = self.patch(self.api_link, [
  234. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  235. ])
  236. self.assertEqual(response.status_code, 200)
  237. self.refresh_post()
  238. self.assertTrue(self.post.is_hidden)
  239. def test_show_own_post(self):
  240. """api makes it possible to unhide owned post"""
  241. self.post.is_hidden = True
  242. self.post.save()
  243. self.refresh_post()
  244. self.assertTrue(self.post.is_hidden)
  245. self.override_acl({
  246. 'can_hide_own_posts': 1
  247. })
  248. response = self.patch(self.api_link, [
  249. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  250. ])
  251. self.assertEqual(response.status_code, 200)
  252. self.refresh_post()
  253. self.assertFalse(self.post.is_hidden)
  254. def test_hide_post_no_permission(self):
  255. """api hide post with no permission fails"""
  256. self.override_acl({
  257. 'can_hide_posts': 0
  258. })
  259. response = self.patch(self.api_link, [
  260. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  261. ])
  262. self.assertEqual(response.status_code, 400)
  263. response_json = json.loads(smart_str(response.content))
  264. self.assertEqual(response_json['detail'][0], "You can't hide posts in this category.")
  265. self.refresh_post()
  266. self.assertFalse(self.post.is_hidden)
  267. def test_show_post_no_permission(self):
  268. """api unhide post with no permission fails"""
  269. self.post.is_hidden = True
  270. self.post.save()
  271. self.refresh_post()
  272. self.assertTrue(self.post.is_hidden)
  273. self.override_acl({
  274. 'can_hide_posts': 0
  275. })
  276. response = self.patch(self.api_link, [
  277. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  278. ])
  279. self.assertEqual(response.status_code, 400)
  280. response_json = json.loads(smart_str(response.content))
  281. self.assertEqual(response_json['detail'][0], "You can't reveal posts in this category.")
  282. self.refresh_post()
  283. self.assertTrue(self.post.is_hidden)
  284. def test_hide_own_protected_post(self):
  285. """api validates if we are trying to hide protected post"""
  286. self.post.is_protected = True
  287. self.post.save()
  288. self.override_acl({
  289. 'can_protect_posts': 0,
  290. 'can_hide_own_posts': 1
  291. })
  292. response = self.patch(self.api_link, [
  293. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  294. ])
  295. self.assertEqual(response.status_code, 400)
  296. response_json = json.loads(smart_str(response.content))
  297. self.assertEqual(response_json['detail'][0], "This post is protected. You can't hide it.")
  298. self.refresh_post()
  299. self.assertFalse(self.post.is_hidden)
  300. def test_show_own_protected_post(self):
  301. """api validates if we are trying to reveal protected post"""
  302. self.post.is_hidden = True
  303. self.post.save()
  304. self.override_acl({
  305. 'can_protect_posts': 0,
  306. 'can_hide_own_posts': 1
  307. })
  308. self.post.is_protected = True
  309. self.post.save()
  310. response = self.patch(self.api_link, [
  311. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  312. ])
  313. self.assertEqual(response.status_code, 400)
  314. response_json = json.loads(smart_str(response.content))
  315. self.assertEqual(response_json['detail'][0], "This post is protected. You can't reveal it.")
  316. self.refresh_post()
  317. self.assertTrue(self.post.is_hidden)
  318. def test_hide_other_user_post(self):
  319. """api validates post ownership when hiding"""
  320. self.post.poster = None
  321. self.post.save()
  322. self.override_acl({
  323. 'can_hide_own_posts': 1
  324. })
  325. response = self.patch(self.api_link, [
  326. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  327. ])
  328. self.assertEqual(response.status_code, 400)
  329. response_json = json.loads(smart_str(response.content))
  330. self.assertEqual(response_json['detail'][0], "You can't hide other users posts in this category.")
  331. self.refresh_post()
  332. self.assertFalse(self.post.is_hidden)
  333. def test_show_other_user_post(self):
  334. """api validates post ownership when revealing"""
  335. self.post.is_hidden = True
  336. self.post.poster = None
  337. self.post.save()
  338. self.override_acl({
  339. 'can_hide_own_posts': 1
  340. })
  341. response = self.patch(self.api_link, [
  342. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  343. ])
  344. self.assertEqual(response.status_code, 400)
  345. response_json = json.loads(smart_str(response.content))
  346. self.assertEqual(response_json['detail'][0], "You can't reveal other users posts in this category.")
  347. self.refresh_post()
  348. self.assertTrue(self.post.is_hidden)
  349. def test_hide_own_post_after_edit_time(self):
  350. """api validates if we are trying to hide post after edit time"""
  351. self.post.posted_on = timezone.now() - timedelta(minutes=10)
  352. self.post.save()
  353. self.override_acl({
  354. 'post_edit_time': 1,
  355. 'can_hide_own_posts': 1
  356. })
  357. response = self.patch(self.api_link, [
  358. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  359. ])
  360. self.assertEqual(response.status_code, 400)
  361. response_json = json.loads(smart_str(response.content))
  362. self.assertEqual(response_json['detail'][0], "You can't hide posts that are older than 1 minute.")
  363. self.refresh_post()
  364. self.assertFalse(self.post.is_hidden)
  365. def test_show_own_post_after_edit_time(self):
  366. """api validates if we are trying to reveal post after edit time"""
  367. self.post.is_hidden = True
  368. self.post.posted_on = timezone.now() - timedelta(minutes=10)
  369. self.post.save()
  370. self.override_acl({
  371. 'post_edit_time': 1,
  372. 'can_hide_own_posts': 1
  373. })
  374. response = self.patch(self.api_link, [
  375. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  376. ])
  377. self.assertEqual(response.status_code, 400)
  378. response_json = json.loads(smart_str(response.content))
  379. self.assertEqual(response_json['detail'][0], "You can't reveal posts that are older than 1 minute.")
  380. self.refresh_post()
  381. self.assertTrue(self.post.is_hidden)
  382. def test_hide_post_in_closed_thread(self):
  383. """api validates if we are trying to hide post in closed thread"""
  384. self.thread.is_closed = True
  385. self.thread.save()
  386. self.override_acl({
  387. 'can_hide_own_posts': 1
  388. })
  389. response = self.patch(self.api_link, [
  390. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  391. ])
  392. self.assertEqual(response.status_code, 400)
  393. response_json = json.loads(smart_str(response.content))
  394. self.assertEqual(response_json['detail'][0], "This thread is closed. You can't hide posts in it.")
  395. self.refresh_post()
  396. self.assertFalse(self.post.is_hidden)
  397. def test_show_post_in_closed_thread(self):
  398. """api validates if we are trying to reveal post in closed thread"""
  399. self.thread.is_closed = True
  400. self.thread.save()
  401. self.post.is_hidden = True
  402. self.post.save()
  403. self.override_acl({
  404. 'can_hide_own_posts': 1
  405. })
  406. response = self.patch(self.api_link, [
  407. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  408. ])
  409. self.assertEqual(response.status_code, 400)
  410. response_json = json.loads(smart_str(response.content))
  411. self.assertEqual(response_json['detail'][0], "This thread is closed. You can't reveal posts in it.")
  412. self.refresh_post()
  413. self.assertTrue(self.post.is_hidden)
  414. def test_hide_post_in_closed_category(self):
  415. """api validates if we are trying to hide post in closed category"""
  416. self.category.is_closed = True
  417. self.category.save()
  418. self.override_acl({
  419. 'can_hide_own_posts': 1
  420. })
  421. response = self.patch(self.api_link, [
  422. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  423. ])
  424. self.assertEqual(response.status_code, 400)
  425. response_json = json.loads(smart_str(response.content))
  426. self.assertEqual(response_json['detail'][0], "This category is closed. You can't hide posts in it.")
  427. self.refresh_post()
  428. self.assertFalse(self.post.is_hidden)
  429. def test_show_post_in_closed_category(self):
  430. """api validates if we are trying to reveal post in closed category"""
  431. self.category.is_closed = True
  432. self.category.save()
  433. self.post.is_hidden = True
  434. self.post.save()
  435. self.override_acl({
  436. 'can_hide_own_posts': 1
  437. })
  438. response = self.patch(self.api_link, [
  439. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  440. ])
  441. self.assertEqual(response.status_code, 400)
  442. response_json = json.loads(smart_str(response.content))
  443. self.assertEqual(response_json['detail'][0], "This category is closed. You can't reveal posts in it.")
  444. self.refresh_post()
  445. self.assertTrue(self.post.is_hidden)
  446. def test_hide_first_post(self):
  447. """api hide first post fails"""
  448. self.thread.set_first_post(self.post)
  449. self.thread.save()
  450. self.override_acl({
  451. 'can_hide_posts': 1
  452. })
  453. response = self.patch(self.api_link, [
  454. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  455. ])
  456. self.assertEqual(response.status_code, 400)
  457. response_json = json.loads(smart_str(response.content))
  458. self.assertEqual(response_json['detail'][0], "You can't hide thread's first post.")
  459. def test_show_first_post(self):
  460. """api unhide first post fails"""
  461. self.thread.set_first_post(self.post)
  462. self.thread.save()
  463. self.override_acl({
  464. 'can_hide_posts': 1
  465. })
  466. response = self.patch(self.api_link, [
  467. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  468. ])
  469. self.assertEqual(response.status_code, 400)
  470. response_json = json.loads(smart_str(response.content))
  471. self.assertEqual(response_json['detail'][0], "You can't reveal thread's first post.")
  472. class ThreadEventPatchApiTestCase(ThreadPostPatchApiTestCase):
  473. def setUp(self):
  474. super(ThreadEventPatchApiTestCase, self).setUp()
  475. self.event = testutils.reply_thread(self.thread, poster=self.user, is_event=True)
  476. self.api_link = reverse('misago:api:thread-post-detail', kwargs={
  477. 'thread_pk': self.thread.pk,
  478. 'pk': self.event.pk
  479. })
  480. def refresh_event(self):
  481. self.event = self.thread.post_set.get(pk=self.event.pk)
  482. class EventAnonPatchApiTests(ThreadEventPatchApiTestCase):
  483. def test_anonymous_user(self):
  484. """anonymous users can't change event state"""
  485. self.logout_user()
  486. response = self.patch(self.api_link, [
  487. {'op': 'add', 'path': 'acl', 'value': True}
  488. ])
  489. self.assertEqual(response.status_code, 403)
  490. class EventAddAclApiTests(ThreadEventPatchApiTestCase):
  491. def test_add_acl_true(self):
  492. """api adds current event's acl to response"""
  493. response = self.patch(self.api_link, [
  494. {'op': 'add', 'path': 'acl', 'value': True}
  495. ])
  496. self.assertEqual(response.status_code, 200)
  497. response_json = json.loads(smart_str(response.content))
  498. self.assertTrue(response_json['acl'])
  499. def test_add_acl_false(self):
  500. """if value is false, api won't add acl to the response, but will set empty key"""
  501. response = self.patch(self.api_link, [
  502. {'op': 'add', 'path': 'acl', 'value': False}
  503. ])
  504. self.assertEqual(response.status_code, 200)
  505. response_json = json.loads(smart_str(response.content))
  506. self.assertIsNone(response_json['acl'])
  507. response = self.patch(self.api_link, [
  508. {'op': 'add', 'path': 'acl', 'value': True}
  509. ])
  510. self.assertEqual(response.status_code, 200)
  511. class EventHideApiTests(ThreadEventPatchApiTestCase):
  512. def test_hide_event(self):
  513. """api makes it possible to hide event"""
  514. self.override_acl({
  515. 'can_hide_events': 1
  516. })
  517. response = self.patch(self.api_link, [
  518. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  519. ])
  520. self.assertEqual(response.status_code, 200)
  521. self.refresh_event()
  522. self.assertTrue(self.event.is_hidden)
  523. def test_show_event(self):
  524. """api makes it possible to unhide event"""
  525. self.event.is_hidden = True
  526. self.event.save()
  527. self.refresh_event()
  528. self.assertTrue(self.event.is_hidden)
  529. self.override_acl({
  530. 'can_hide_events': 1
  531. })
  532. response = self.patch(self.api_link, [
  533. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  534. ])
  535. self.assertEqual(response.status_code, 200)
  536. self.refresh_event()
  537. self.assertFalse(self.event.is_hidden)
  538. def test_hide_event_no_permission(self):
  539. """api hide event with no permission fails"""
  540. self.override_acl({
  541. 'can_hide_events': 0
  542. })
  543. response = self.patch(self.api_link, [
  544. {'op': 'replace', 'path': 'is-hidden', 'value': True}
  545. ])
  546. self.assertEqual(response.status_code, 400)
  547. response_json = json.loads(smart_str(response.content))
  548. self.assertEqual(response_json['detail'][0], "You don't have permission to hide this event.")
  549. self.refresh_event()
  550. self.assertFalse(self.event.is_hidden)
  551. def test_show_event_no_permission(self):
  552. """api unhide event with no permission fails"""
  553. self.event.is_hidden = True
  554. self.event.save()
  555. self.refresh_event()
  556. self.assertTrue(self.event.is_hidden)
  557. self.override_acl({
  558. 'can_hide_events': 0
  559. })
  560. response = self.patch(self.api_link, [
  561. {'op': 'replace', 'path': 'is-hidden', 'value': False}
  562. ])
  563. self.assertEqual(response.status_code, 404)