test_thread_postpatch_api.py 24 KB

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