test_contents.py 68KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021
  1. # -*- coding: utf-8 -*-
  2. import io
  3. import pytest
  4. import transaction
  5. from PIL import Image
  6. from depot.io.utils import FileIntent
  7. from tracim import models
  8. from tracim.lib.core.content import ContentApi
  9. from tracim.lib.core.workspace import WorkspaceApi
  10. from tracim.models.data import ContentType
  11. from tracim.models import get_tm_session
  12. from tracim.models.revision_protection import new_revision
  13. from tracim.tests import FunctionalTest, create_test_image
  14. from tracim.tests import set_html_document_slug_to_legacy
  15. from tracim.fixtures.content import Content as ContentFixtures
  16. from tracim.fixtures.users_and_groups import Base as BaseFixture
  17. class TestHtmlDocuments(FunctionalTest):
  18. """
  19. Tests for /api/v2/workspaces/{workspace_id}/html-documents/{content_id}
  20. endpoint
  21. """
  22. fixtures = [BaseFixture, ContentFixtures]
  23. def test_api__get_html_document__ok_200__legacy_slug(self) -> None:
  24. """
  25. Get one html document of a content
  26. """
  27. self.testapp.authorization = (
  28. 'Basic',
  29. (
  30. 'admin@admin.admin',
  31. 'admin@admin.admin'
  32. )
  33. )
  34. set_html_document_slug_to_legacy(self.session_factory)
  35. res = self.testapp.get(
  36. '/api/v2/workspaces/2/html-documents/6',
  37. status=200
  38. )
  39. content = res.json_body
  40. assert content['content_type'] == 'html-documents'
  41. assert content['content_id'] == 6
  42. assert content['is_archived'] is False
  43. assert content['is_deleted'] is False
  44. assert content['label'] == 'Tiramisu Recipe'
  45. assert content['parent_id'] == 3
  46. assert content['show_in_ui'] is True
  47. assert content['slug'] == 'tiramisu-recipe'
  48. assert content['status'] == 'open'
  49. assert content['workspace_id'] == 2
  50. assert content['current_revision_id'] == 27
  51. # TODO - G.M - 2018-06-173 - check date format
  52. assert content['created']
  53. assert content['author']
  54. assert content['author']['user_id'] == 1
  55. assert content['author']['avatar_url'] is None
  56. assert content['author']['public_name'] == 'Global manager'
  57. # TODO - G.M - 2018-06-173 - check date format
  58. assert content['modified']
  59. assert content['last_modifier'] != content['author']
  60. assert content['last_modifier']['user_id'] == 3
  61. assert content['last_modifier']['public_name'] == 'Bob i.'
  62. assert content['last_modifier']['avatar_url'] is None
  63. assert content['raw_content'] == '<p>To cook a great Tiramisu, you need many ingredients.</p>' # nopep8
  64. def test_api__get_html_document__ok_200__nominal_case(self) -> None:
  65. """
  66. Get one html document of a content
  67. """
  68. self.testapp.authorization = (
  69. 'Basic',
  70. (
  71. 'admin@admin.admin',
  72. 'admin@admin.admin'
  73. )
  74. )
  75. res = self.testapp.get(
  76. '/api/v2/workspaces/2/html-documents/6',
  77. status=200
  78. )
  79. content = res.json_body
  80. assert content['content_type'] == 'html-documents'
  81. assert content['content_id'] == 6
  82. assert content['is_archived'] is False
  83. assert content['is_deleted'] is False
  84. assert content['label'] == 'Tiramisu Recipe'
  85. assert content['parent_id'] == 3
  86. assert content['show_in_ui'] is True
  87. assert content['slug'] == 'tiramisu-recipe'
  88. assert content['status'] == 'open'
  89. assert content['workspace_id'] == 2
  90. assert content['current_revision_id'] == 27
  91. # TODO - G.M - 2018-06-173 - check date format
  92. assert content['created']
  93. assert content['author']
  94. assert content['author']['user_id'] == 1
  95. assert content['author']['avatar_url'] is None
  96. assert content['author']['public_name'] == 'Global manager'
  97. # TODO - G.M - 2018-06-173 - check date format
  98. assert content['modified']
  99. assert content['last_modifier'] != content['author']
  100. assert content['last_modifier']['user_id'] == 3
  101. assert content['last_modifier']['public_name'] == 'Bob i.'
  102. assert content['last_modifier']['avatar_url'] is None
  103. assert content['raw_content'] == '<p>To cook a great Tiramisu, you need many ingredients.</p>' # nopep8
  104. def test_api__get_html_document__err_400__wrong_content_type(self) -> None:
  105. """
  106. Get one html document of a content content 7 is not html_document
  107. """
  108. self.testapp.authorization = (
  109. 'Basic',
  110. (
  111. 'admin@admin.admin',
  112. 'admin@admin.admin'
  113. )
  114. )
  115. res = self.testapp.get(
  116. '/api/v2/workspaces/2/html-documents/7',
  117. status=400
  118. )
  119. def test_api__get_html_document__err_400__content_does_not_exist(self) -> None: # nopep8
  120. """
  121. Get one html document of a content (content 170 does not exist in db
  122. """
  123. self.testapp.authorization = (
  124. 'Basic',
  125. (
  126. 'admin@admin.admin',
  127. 'admin@admin.admin'
  128. )
  129. )
  130. res = self.testapp.get(
  131. '/api/v2/workspaces/2/html-documents/170',
  132. status=400
  133. )
  134. def test_api__get_html_document__err_400__content_not_in_workspace(self) -> None: # nopep8
  135. """
  136. Get one html document of a content (content 6 is in workspace 2)
  137. """
  138. self.testapp.authorization = (
  139. 'Basic',
  140. (
  141. 'admin@admin.admin',
  142. 'admin@admin.admin'
  143. )
  144. )
  145. res = self.testapp.get(
  146. '/api/v2/workspaces/1/html-documents/6',
  147. status=400
  148. )
  149. def test_api__get_html_document__err_400__workspace_does_not_exist(self) -> None: # nopep8
  150. """
  151. Get one html document of a content (Workspace 40 does not exist)
  152. """
  153. self.testapp.authorization = (
  154. 'Basic',
  155. (
  156. 'admin@admin.admin',
  157. 'admin@admin.admin'
  158. )
  159. )
  160. res = self.testapp.get(
  161. '/api/v2/workspaces/40/html-documents/6',
  162. status=400
  163. )
  164. def test_api__get_html_document__err_400__workspace_id_is_not_int(self) -> None: # nopep8
  165. """
  166. Get one html document of a content, workspace id is not int
  167. """
  168. self.testapp.authorization = (
  169. 'Basic',
  170. (
  171. 'admin@admin.admin',
  172. 'admin@admin.admin'
  173. )
  174. )
  175. res = self.testapp.get(
  176. '/api/v2/workspaces/coucou/html-documents/6',
  177. status=400
  178. )
  179. def test_api__get_html_document__err_400__content_id_is_not_int(self) -> None: # nopep8
  180. """
  181. Get one html document of a content, content_id is not int
  182. """
  183. self.testapp.authorization = (
  184. 'Basic',
  185. (
  186. 'admin@admin.admin',
  187. 'admin@admin.admin'
  188. )
  189. )
  190. res = self.testapp.get(
  191. '/api/v2/workspaces/2/html-documents/coucou',
  192. status=400
  193. )
  194. def test_api__update_html_document__err_400__empty_label(self) -> None: # nopep8
  195. """
  196. Update(put) one html document of a content
  197. """
  198. self.testapp.authorization = (
  199. 'Basic',
  200. (
  201. 'admin@admin.admin',
  202. 'admin@admin.admin'
  203. )
  204. )
  205. params = {
  206. 'label': '',
  207. 'raw_content': '<p> Le nouveau contenu </p>',
  208. }
  209. res = self.testapp.put_json(
  210. '/api/v2/workspaces/2/html-documents/6',
  211. params=params,
  212. status=400
  213. )
  214. def test_api__update_html_document__ok_200__nominal_case(self) -> None:
  215. """
  216. Update(put) one html document of a content
  217. """
  218. self.testapp.authorization = (
  219. 'Basic',
  220. (
  221. 'admin@admin.admin',
  222. 'admin@admin.admin'
  223. )
  224. )
  225. params = {
  226. 'label': 'My New label',
  227. 'raw_content': '<p> Le nouveau contenu </p>',
  228. }
  229. res = self.testapp.put_json(
  230. '/api/v2/workspaces/2/html-documents/6',
  231. params=params,
  232. status=200
  233. )
  234. content = res.json_body
  235. assert content['content_type'] == 'html-documents'
  236. assert content['content_id'] == 6
  237. assert content['is_archived'] is False
  238. assert content['is_deleted'] is False
  239. assert content['label'] == 'My New label'
  240. assert content['parent_id'] == 3
  241. assert content['show_in_ui'] is True
  242. assert content['slug'] == 'my-new-label'
  243. assert content['status'] == 'open'
  244. assert content['workspace_id'] == 2
  245. assert content['current_revision_id'] == 28
  246. # TODO - G.M - 2018-06-173 - check date format
  247. assert content['created']
  248. assert content['author']
  249. assert content['author']['user_id'] == 1
  250. assert content['author']['avatar_url'] is None
  251. assert content['author']['public_name'] == 'Global manager'
  252. # TODO - G.M - 2018-06-173 - check date format
  253. assert content['modified']
  254. assert content['last_modifier'] == content['author']
  255. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  256. res = self.testapp.get(
  257. '/api/v2/workspaces/2/html-documents/6',
  258. status=200
  259. )
  260. content = res.json_body
  261. assert content['content_type'] == 'html-documents'
  262. assert content['content_id'] == 6
  263. assert content['is_archived'] is False
  264. assert content['is_deleted'] is False
  265. assert content['label'] == 'My New label'
  266. assert content['parent_id'] == 3
  267. assert content['show_in_ui'] is True
  268. assert content['slug'] == 'my-new-label'
  269. assert content['status'] == 'open'
  270. assert content['workspace_id'] == 2
  271. assert content['current_revision_id'] == 28
  272. # TODO - G.M - 2018-06-173 - check date format
  273. assert content['created']
  274. assert content['author']
  275. assert content['author']['user_id'] == 1
  276. assert content['author']['avatar_url'] is None
  277. assert content['author']['public_name'] == 'Global manager'
  278. # TODO - G.M - 2018-06-173 - check date format
  279. assert content['modified']
  280. assert content['last_modifier'] == content['author']
  281. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  282. def test_api__get_html_document_revisions__ok_200__nominal_case(
  283. self
  284. ) -> None:
  285. """
  286. Get one html document of a content
  287. """
  288. self.testapp.authorization = (
  289. 'Basic',
  290. (
  291. 'admin@admin.admin',
  292. 'admin@admin.admin'
  293. )
  294. )
  295. res = self.testapp.get(
  296. '/api/v2/workspaces/2/html-documents/6/revisions',
  297. status=200
  298. )
  299. revisions = res.json_body
  300. assert len(revisions) == 3
  301. revision = revisions[0]
  302. assert revision['content_type'] == 'html-documents'
  303. assert revision['content_id'] == 6
  304. assert revision['is_archived'] is False
  305. assert revision['is_deleted'] is False
  306. assert revision['label'] == 'Tiramisu Recipes!!!'
  307. assert revision['parent_id'] == 3
  308. assert revision['show_in_ui'] is True
  309. assert revision['slug'] == 'tiramisu-recipes'
  310. assert revision['status'] == 'open'
  311. assert revision['workspace_id'] == 2
  312. assert revision['revision_id'] == 6
  313. assert revision['sub_content_types']
  314. # TODO - G.M - 2018-06-173 - Test with real comments
  315. assert revision['comment_ids'] == []
  316. # TODO - G.M - 2018-06-173 - check date format
  317. assert revision['created']
  318. assert revision['author']
  319. assert revision['author']['user_id'] == 1
  320. assert revision['author']['avatar_url'] is None
  321. assert revision['author']['public_name'] == 'Global manager'
  322. revision = revisions[1]
  323. assert revision['content_type'] == 'html-documents'
  324. assert revision['content_id'] == 6
  325. assert revision['is_archived'] is False
  326. assert revision['is_deleted'] is False
  327. assert revision['label'] == 'Tiramisu Recipes!!!'
  328. assert revision['parent_id'] == 3
  329. assert revision['show_in_ui'] is True
  330. assert revision['slug'] == 'tiramisu-recipes'
  331. assert revision['status'] == 'open'
  332. assert revision['workspace_id'] == 2
  333. assert revision['revision_id'] == 7
  334. assert revision['sub_content_types']
  335. # TODO - G.M - 2018-06-173 - Test with real comments
  336. assert revision['comment_ids'] == []
  337. # TODO - G.M - 2018-06-173 - check date format
  338. assert revision['created']
  339. assert revision['author']
  340. assert revision['author']['user_id'] == 1
  341. assert revision['author']['avatar_url'] is None
  342. assert revision['author']['public_name'] == 'Global manager'
  343. revision = revisions[2]
  344. assert revision['content_type'] == 'html-documents'
  345. assert revision['content_id'] == 6
  346. assert revision['is_archived'] is False
  347. assert revision['is_deleted'] is False
  348. assert revision['label'] == 'Tiramisu Recipe'
  349. assert revision['parent_id'] == 3
  350. assert revision['show_in_ui'] is True
  351. assert revision['slug'] == 'tiramisu-recipe'
  352. assert revision['status'] == 'open'
  353. assert revision['workspace_id'] == 2
  354. assert revision['revision_id'] == 27
  355. assert revision['sub_content_types']
  356. # TODO - G.M - 2018-06-173 - Test with real comments
  357. assert revision['comment_ids'] == []
  358. # TODO - G.M - 2018-06-173 - check date format
  359. assert revision['created']
  360. assert revision['author']
  361. assert revision['author']['user_id'] == 3
  362. assert revision['author']['avatar_url'] is None
  363. assert revision['author']['public_name'] == 'Bob i.'
  364. def test_api__set_html_document_status__ok_200__nominal_case(self) -> None:
  365. """
  366. Get one html document of a content
  367. """
  368. self.testapp.authorization = (
  369. 'Basic',
  370. (
  371. 'admin@admin.admin',
  372. 'admin@admin.admin'
  373. )
  374. )
  375. params = {
  376. 'status': 'closed-deprecated',
  377. }
  378. # before
  379. res = self.testapp.get(
  380. '/api/v2/workspaces/2/html-documents/6',
  381. status=200
  382. )
  383. content = res.json_body
  384. assert content['content_type'] == 'html-documents'
  385. assert content['content_id'] == 6
  386. assert content['status'] == 'open'
  387. # set status
  388. res = self.testapp.put_json(
  389. '/api/v2/workspaces/2/html-documents/6/status',
  390. params=params,
  391. status=204
  392. )
  393. # after
  394. res = self.testapp.get(
  395. '/api/v2/workspaces/2/html-documents/6',
  396. status=200
  397. )
  398. content = res.json_body
  399. assert content['content_type'] == 'html-documents'
  400. assert content['content_id'] == 6
  401. assert content['status'] == 'closed-deprecated'
  402. def test_api__set_html_document_status__err_400__wrong_status(self) -> None:
  403. """
  404. Get one html document of a content
  405. """
  406. self.testapp.authorization = (
  407. 'Basic',
  408. (
  409. 'admin@admin.admin',
  410. 'admin@admin.admin'
  411. )
  412. )
  413. params = {
  414. 'status': 'unexistant-status',
  415. }
  416. res = self.testapp.put_json(
  417. '/api/v2/workspaces/2/html-documents/6/status',
  418. params=params,
  419. status=400
  420. )
  421. class TestFiles(FunctionalTest):
  422. """
  423. Tests for /api/v2/workspaces/{workspace_id}/files/{content_id}
  424. endpoint
  425. """
  426. fixtures = [BaseFixture, ContentFixtures]
  427. def test_api__get_file__ok_200__nominal_case(self) -> None:
  428. """
  429. Get one file of a content
  430. """
  431. dbsession = get_tm_session(self.session_factory, transaction.manager)
  432. admin = dbsession.query(models.User) \
  433. .filter(models.User.email == 'admin@admin.admin') \
  434. .one()
  435. workspace_api = WorkspaceApi(
  436. current_user=admin,
  437. session=dbsession,
  438. config=self.app_config
  439. )
  440. content_api = ContentApi(
  441. current_user=admin,
  442. session=dbsession,
  443. config=self.app_config
  444. )
  445. business_workspace = workspace_api.get_one(1)
  446. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  447. test_file = content_api.create(
  448. content_type=ContentType.File,
  449. workspace=business_workspace,
  450. parent=tool_folder,
  451. label='Test file',
  452. do_save=False,
  453. do_notify=False,
  454. )
  455. test_file.file_extension = '.txt'
  456. test_file.depot_file = FileIntent(
  457. b'Test file',
  458. 'Test_file.txt',
  459. 'text/plain',
  460. )
  461. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  462. dbsession.flush()
  463. transaction.commit()
  464. self.testapp.authorization = (
  465. 'Basic',
  466. (
  467. 'admin@admin.admin',
  468. 'admin@admin.admin'
  469. )
  470. )
  471. res = self.testapp.get(
  472. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  473. status=200
  474. )
  475. content = res.json_body
  476. assert content['content_type'] == 'file'
  477. assert content['content_id'] == test_file.content_id
  478. assert content['is_archived'] is False
  479. assert content['is_deleted'] is False
  480. assert content['label'] == 'Test_file'
  481. assert content['parent_id'] == 1
  482. assert content['show_in_ui'] is True
  483. assert content['slug'] == 'test-file'
  484. assert content['status'] == 'open'
  485. assert content['workspace_id'] == 1
  486. assert content['current_revision_id']
  487. # TODO - G.M - 2018-06-173 - check date format
  488. assert content['created']
  489. assert content['author']
  490. assert content['author']['user_id'] == 1
  491. assert content['author']['avatar_url'] is None
  492. assert content['author']['public_name'] == 'Global manager'
  493. # TODO - G.M - 2018-06-173 - check date format
  494. assert content['modified']
  495. assert content['last_modifier'] == content['author']
  496. assert content['raw_content'] == '<p>description</p>' # nopep8
  497. def test_api__get_files__err_400__wrong_content_type(self) -> None:
  498. """
  499. Get one file of a content content
  500. """
  501. self.testapp.authorization = (
  502. 'Basic',
  503. (
  504. 'admin@admin.admin',
  505. 'admin@admin.admin'
  506. )
  507. )
  508. res = self.testapp.get(
  509. '/api/v2/workspaces/2/files/6',
  510. status=400
  511. )
  512. def test_api__get_file__err_400__content_does_not_exist(self) -> None: # nopep8
  513. """
  514. Get one file (content 170 does not exist in db
  515. """
  516. self.testapp.authorization = (
  517. 'Basic',
  518. (
  519. 'admin@admin.admin',
  520. 'admin@admin.admin'
  521. )
  522. )
  523. res = self.testapp.get(
  524. '/api/v2/workspaces/1/files/170',
  525. status=400
  526. )
  527. def test_api__get_file__err_400__content_not_in_workspace(self) -> None: # nopep8
  528. """
  529. Get one file (content 9 is in workspace 2)
  530. """
  531. self.testapp.authorization = (
  532. 'Basic',
  533. (
  534. 'admin@admin.admin',
  535. 'admin@admin.admin'
  536. )
  537. )
  538. res = self.testapp.get(
  539. '/api/v2/workspaces/1/files/9',
  540. status=400
  541. )
  542. def test_api__get_file__err_400__workspace_does_not_exist(self) -> None: # nopep8
  543. """
  544. Get one file (Workspace 40 does not exist)
  545. """
  546. self.testapp.authorization = (
  547. 'Basic',
  548. (
  549. 'admin@admin.admin',
  550. 'admin@admin.admin'
  551. )
  552. )
  553. res = self.testapp.get(
  554. '/api/v2/workspaces/40/files/9',
  555. status=400
  556. )
  557. def test_api__get_file__err_400__workspace_id_is_not_int(self) -> None: # nopep8
  558. """
  559. Get one file, workspace id is not int
  560. """
  561. self.testapp.authorization = (
  562. 'Basic',
  563. (
  564. 'admin@admin.admin',
  565. 'admin@admin.admin'
  566. )
  567. )
  568. res = self.testapp.get(
  569. '/api/v2/workspaces/coucou/files/9',
  570. status=400
  571. )
  572. def test_api__get_file__err_400__content_id_is_not_int(self) -> None: # nopep8
  573. """
  574. Get one file, content_id is not int
  575. """
  576. self.testapp.authorization = (
  577. 'Basic',
  578. (
  579. 'admin@admin.admin',
  580. 'admin@admin.admin'
  581. )
  582. )
  583. res = self.testapp.get(
  584. '/api/v2/workspaces/2/files/coucou',
  585. status=400
  586. )
  587. def test_api__update_file_info_err_400__empty_label(self) -> None: # nopep8
  588. """
  589. Update(put) one file
  590. """
  591. dbsession = get_tm_session(self.session_factory, transaction.manager)
  592. admin = dbsession.query(models.User) \
  593. .filter(models.User.email == 'admin@admin.admin') \
  594. .one()
  595. workspace_api = WorkspaceApi(
  596. current_user=admin,
  597. session=dbsession,
  598. config=self.app_config
  599. )
  600. content_api = ContentApi(
  601. current_user=admin,
  602. session=dbsession,
  603. config=self.app_config
  604. )
  605. business_workspace = workspace_api.get_one(1)
  606. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  607. test_file = content_api.create(
  608. content_type=ContentType.File,
  609. workspace=business_workspace,
  610. parent=tool_folder,
  611. label='Test file',
  612. do_save=False,
  613. do_notify=False,
  614. )
  615. test_file.file_extension = '.txt'
  616. test_file.depot_file = FileIntent(
  617. b'Test file',
  618. 'Test_file.txt',
  619. 'text/plain',
  620. )
  621. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  622. dbsession.flush()
  623. transaction.commit()
  624. self.testapp.authorization = (
  625. 'Basic',
  626. (
  627. 'admin@admin.admin',
  628. 'admin@admin.admin'
  629. )
  630. )
  631. params = {
  632. 'label': '',
  633. 'raw_content': '<p> Le nouveau contenu </p>',
  634. }
  635. res = self.testapp.put_json(
  636. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  637. params=params,
  638. status=400
  639. )
  640. def test_api__update_file_info__ok_200__nominal_case(self) -> None:
  641. """
  642. Update(put) one file
  643. """
  644. dbsession = get_tm_session(self.session_factory, transaction.manager)
  645. admin = dbsession.query(models.User) \
  646. .filter(models.User.email == 'admin@admin.admin') \
  647. .one()
  648. workspace_api = WorkspaceApi(
  649. current_user=admin,
  650. session=dbsession,
  651. config=self.app_config
  652. )
  653. content_api = ContentApi(
  654. current_user=admin,
  655. session=dbsession,
  656. config=self.app_config
  657. )
  658. business_workspace = workspace_api.get_one(1)
  659. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  660. test_file = content_api.create(
  661. content_type=ContentType.File,
  662. workspace=business_workspace,
  663. parent=tool_folder,
  664. label='Test file',
  665. do_save=False,
  666. do_notify=False,
  667. )
  668. test_file.file_extension = '.txt'
  669. test_file.depot_file = FileIntent(
  670. b'Test file',
  671. 'Test_file.txt',
  672. 'text/plain',
  673. )
  674. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  675. dbsession.flush()
  676. transaction.commit()
  677. self.testapp.authorization = (
  678. 'Basic',
  679. (
  680. 'admin@admin.admin',
  681. 'admin@admin.admin'
  682. )
  683. )
  684. params = {
  685. 'label': 'My New label',
  686. 'raw_content': '<p> Le nouveau contenu </p>',
  687. }
  688. res = self.testapp.put_json(
  689. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  690. params=params,
  691. status=200
  692. )
  693. content = res.json_body
  694. assert content['content_type'] == 'file'
  695. assert content['content_id'] == test_file.content_id
  696. assert content['is_archived'] is False
  697. assert content['is_deleted'] is False
  698. assert content['label'] == 'My New label'
  699. assert content['parent_id'] == 1
  700. assert content['show_in_ui'] is True
  701. assert content['slug'] == 'my-new-label'
  702. assert content['status'] == 'open'
  703. assert content['workspace_id'] == 1
  704. assert content['current_revision_id']
  705. # TODO - G.M - 2018-06-173 - check date format
  706. assert content['created']
  707. assert content['author']
  708. assert content['author']['user_id'] == 1
  709. assert content['author']['avatar_url'] is None
  710. assert content['author']['public_name'] == 'Global manager'
  711. # TODO - G.M - 2018-06-173 - check date format
  712. assert content['modified']
  713. assert content['last_modifier'] == content['author']
  714. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  715. res = self.testapp.get(
  716. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  717. status=200
  718. )
  719. content = res.json_body
  720. assert content['content_type'] == 'file'
  721. assert content['content_id'] == test_file.content_id
  722. assert content['is_archived'] is False
  723. assert content['is_deleted'] is False
  724. assert content['label'] == 'My New label'
  725. assert content['parent_id'] == 1
  726. assert content['show_in_ui'] is True
  727. assert content['slug'] == 'my-new-label'
  728. assert content['status'] == 'open'
  729. assert content['workspace_id'] == 1
  730. assert content['current_revision_id']
  731. # TODO - G.M - 2018-06-173 - check date format
  732. assert content['created']
  733. assert content['author']
  734. assert content['author']['user_id'] == 1
  735. assert content['author']['avatar_url'] is None
  736. assert content['author']['public_name'] == 'Global manager'
  737. # TODO - G.M - 2018-06-173 - check date format
  738. assert content['modified']
  739. assert content['last_modifier'] == content['author']
  740. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  741. def test_api__get_file_revisions__ok_200__nominal_case(
  742. self
  743. ) -> None:
  744. """
  745. Get file revisions
  746. """
  747. dbsession = get_tm_session(self.session_factory, transaction.manager)
  748. admin = dbsession.query(models.User) \
  749. .filter(models.User.email == 'admin@admin.admin') \
  750. .one()
  751. workspace_api = WorkspaceApi(
  752. current_user=admin,
  753. session=dbsession,
  754. config=self.app_config
  755. )
  756. content_api = ContentApi(
  757. current_user=admin,
  758. session=dbsession,
  759. config=self.app_config
  760. )
  761. business_workspace = workspace_api.get_one(1)
  762. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  763. test_file = content_api.create(
  764. content_type=ContentType.File,
  765. workspace=business_workspace,
  766. parent=tool_folder,
  767. label='Test file',
  768. do_save=False,
  769. do_notify=False,
  770. )
  771. test_file.file_extension = '.txt'
  772. test_file.depot_file = FileIntent(
  773. b'Test file',
  774. 'Test_file.txt',
  775. 'text/plain',
  776. )
  777. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  778. dbsession.flush()
  779. transaction.commit()
  780. self.testapp.authorization = (
  781. 'Basic',
  782. (
  783. 'admin@admin.admin',
  784. 'admin@admin.admin'
  785. )
  786. )
  787. res = self.testapp.get(
  788. '/api/v2/workspaces/1/files/{}/revisions'.format(test_file.content_id),
  789. status=200
  790. )
  791. revisions = res.json_body
  792. assert len(revisions) == 1
  793. revision = revisions[0]
  794. assert revision['content_type'] == 'file'
  795. assert revision['content_id'] == test_file.content_id
  796. assert revision['is_archived'] is False
  797. assert revision['is_deleted'] is False
  798. assert revision['label'] == 'Test_file'
  799. assert revision['parent_id'] == 1
  800. assert revision['show_in_ui'] is True
  801. assert revision['slug'] == 'test-file'
  802. assert revision['status'] == 'open'
  803. assert revision['workspace_id'] == 1
  804. assert revision['revision_id']
  805. assert revision['sub_content_types']
  806. # TODO - G.M - 2018-06-173 - Test with real comments
  807. assert revision['comment_ids'] == []
  808. # TODO - G.M - 2018-06-173 - check date format
  809. assert revision['created']
  810. assert revision['author']
  811. assert revision['author']['user_id'] == 1
  812. assert revision['author']['avatar_url'] is None
  813. assert revision['author']['public_name'] == 'Global manager'
  814. def test_api__set_file_status__ok_200__nominal_case(self) -> None:
  815. """
  816. set file status
  817. """
  818. dbsession = get_tm_session(self.session_factory, transaction.manager)
  819. admin = dbsession.query(models.User) \
  820. .filter(models.User.email == 'admin@admin.admin') \
  821. .one()
  822. workspace_api = WorkspaceApi(
  823. current_user=admin,
  824. session=dbsession,
  825. config=self.app_config
  826. )
  827. content_api = ContentApi(
  828. current_user=admin,
  829. session=dbsession,
  830. config=self.app_config
  831. )
  832. business_workspace = workspace_api.get_one(1)
  833. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  834. test_file = content_api.create(
  835. content_type=ContentType.File,
  836. workspace=business_workspace,
  837. parent=tool_folder,
  838. label='Test file',
  839. do_save=False,
  840. do_notify=False,
  841. )
  842. test_file.file_extension = '.txt'
  843. test_file.depot_file = FileIntent(
  844. b'Test file',
  845. 'Test_file.txt',
  846. 'text/plain',
  847. )
  848. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  849. dbsession.flush()
  850. transaction.commit()
  851. self.testapp.authorization = (
  852. 'Basic',
  853. (
  854. 'admin@admin.admin',
  855. 'admin@admin.admin'
  856. )
  857. )
  858. params = {
  859. 'status': 'closed-deprecated',
  860. }
  861. # before
  862. res = self.testapp.get(
  863. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  864. status=200
  865. )
  866. content = res.json_body
  867. assert content['content_type'] == 'file'
  868. assert content['content_id'] == test_file.content_id
  869. assert content['status'] == 'open'
  870. # set status
  871. res = self.testapp.put_json(
  872. '/api/v2/workspaces/1/files/{}/status'.format(test_file.content_id),
  873. params=params,
  874. status=204
  875. )
  876. # after
  877. res = self.testapp.get(
  878. '/api/v2/workspaces/1/files/{}'.format(test_file.content_id),
  879. status=200
  880. )
  881. content = res.json_body
  882. assert content['content_type'] == 'file'
  883. assert content['content_id'] == test_file.content_id
  884. assert content['status'] == 'closed-deprecated'
  885. def test_api__set_file_status__err_400__wrong_status(self) -> None:
  886. """
  887. set file status
  888. """
  889. self.testapp.authorization = (
  890. 'Basic',
  891. (
  892. 'admin@admin.admin',
  893. 'admin@admin.admin'
  894. )
  895. )
  896. params = {
  897. 'status': 'unexistant-status',
  898. }
  899. res = self.testapp.put_json(
  900. '/api/v2/workspaces/2/files/6/status',
  901. params=params,
  902. status=400
  903. )
  904. def test_api__get_file_raw__ok_200__nominal_case(self) -> None:
  905. """
  906. Get one file of a content
  907. """
  908. dbsession = get_tm_session(self.session_factory, transaction.manager)
  909. admin = dbsession.query(models.User) \
  910. .filter(models.User.email == 'admin@admin.admin') \
  911. .one()
  912. workspace_api = WorkspaceApi(
  913. current_user=admin,
  914. session=dbsession,
  915. config=self.app_config
  916. )
  917. content_api = ContentApi(
  918. current_user=admin,
  919. session=dbsession,
  920. config=self.app_config
  921. )
  922. business_workspace = workspace_api.get_one(1)
  923. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  924. test_file = content_api.create(
  925. content_type=ContentType.File,
  926. workspace=business_workspace,
  927. parent=tool_folder,
  928. label='Test file',
  929. do_save=False,
  930. do_notify=False,
  931. )
  932. test_file.file_extension = '.txt'
  933. test_file.depot_file = FileIntent(
  934. b'Test file',
  935. 'Test_file.txt',
  936. 'text/plain',
  937. )
  938. content_api.update_content(test_file, 'Test_file', '<p>description</p>') # nopep8
  939. dbsession.flush()
  940. transaction.commit()
  941. content_id = int(test_file.content_id)
  942. self.testapp.authorization = (
  943. 'Basic',
  944. (
  945. 'admin@admin.admin',
  946. 'admin@admin.admin'
  947. )
  948. )
  949. res = self.testapp.get(
  950. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  951. status=200
  952. )
  953. assert res.body == b'Test file'
  954. assert res.content_type == 'text/plain'
  955. assert res.content_length == len(b'Test file')
  956. def test_api__set_file_raw__ok_200__nominal_case(self) -> None:
  957. """
  958. Set one file of a content
  959. """
  960. dbsession = get_tm_session(self.session_factory, transaction.manager)
  961. admin = dbsession.query(models.User) \
  962. .filter(models.User.email == 'admin@admin.admin') \
  963. .one()
  964. workspace_api = WorkspaceApi(
  965. current_user=admin,
  966. session=dbsession,
  967. config=self.app_config
  968. )
  969. content_api = ContentApi(
  970. current_user=admin,
  971. session=dbsession,
  972. config=self.app_config
  973. )
  974. business_workspace = workspace_api.get_one(1)
  975. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  976. test_file = content_api.create(
  977. content_type=ContentType.File,
  978. workspace=business_workspace,
  979. parent=tool_folder,
  980. label='Test file',
  981. do_save=True,
  982. do_notify=False,
  983. )
  984. dbsession.flush()
  985. transaction.commit()
  986. content_id = int(test_file.content_id)
  987. image = create_test_image()
  988. self.testapp.authorization = (
  989. 'Basic',
  990. (
  991. 'admin@admin.admin',
  992. 'admin@admin.admin'
  993. )
  994. )
  995. res = self.testapp.put(
  996. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  997. upload_files=[
  998. ('files',image.name, image.getvalue())
  999. ],
  1000. status=204,
  1001. )
  1002. res = self.testapp.get(
  1003. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1004. status=200
  1005. )
  1006. assert res.body == image.getvalue()
  1007. assert res.content_type == 'image/png'
  1008. assert res.content_length == len(image.getvalue())
  1009. def test_api__get_allowed_size_dim__ok__nominal_case(self) -> None:
  1010. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1011. admin = dbsession.query(models.User) \
  1012. .filter(models.User.email == 'admin@admin.admin') \
  1013. .one()
  1014. workspace_api = WorkspaceApi(
  1015. current_user=admin,
  1016. session=dbsession,
  1017. config=self.app_config
  1018. )
  1019. content_api = ContentApi(
  1020. current_user=admin,
  1021. session=dbsession,
  1022. config=self.app_config
  1023. )
  1024. business_workspace = workspace_api.get_one(1)
  1025. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1026. test_file = content_api.create(
  1027. content_type=ContentType.File,
  1028. workspace=business_workspace,
  1029. parent=tool_folder,
  1030. label='Test file',
  1031. do_save=False,
  1032. do_notify=False,
  1033. )
  1034. test_file.file_extension = '.txt'
  1035. test_file.depot_file = FileIntent(
  1036. b'Test file',
  1037. 'Test_file.txt',
  1038. 'text/plain',
  1039. )
  1040. dbsession.flush()
  1041. transaction.commit()
  1042. self.testapp.authorization = (
  1043. 'Basic',
  1044. (
  1045. 'admin@admin.admin',
  1046. 'admin@admin.admin'
  1047. )
  1048. )
  1049. content_id = int(test_file.content_id)
  1050. res = self.testapp.get(
  1051. '/api/v2/workspaces/1/files/{}/preview/jpg/allowed_dims'.format(content_id),
  1052. status=200,
  1053. )
  1054. res = res.json_body
  1055. assert res['restricted'] == True
  1056. assert len(res['dimensions']) == 1
  1057. dim = res['dimensions'][0]
  1058. assert dim['width'] == 256
  1059. assert dim['height'] == 256
  1060. def test_api__get_jpeg_preview__ok__200__nominal_case(self) -> None:
  1061. """
  1062. Set one file of a content
  1063. """
  1064. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1065. admin = dbsession.query(models.User) \
  1066. .filter(models.User.email == 'admin@admin.admin') \
  1067. .one()
  1068. workspace_api = WorkspaceApi(
  1069. current_user=admin,
  1070. session=dbsession,
  1071. config=self.app_config
  1072. )
  1073. content_api = ContentApi(
  1074. current_user=admin,
  1075. session=dbsession,
  1076. config=self.app_config
  1077. )
  1078. business_workspace = workspace_api.get_one(1)
  1079. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1080. test_file = content_api.create(
  1081. content_type=ContentType.File,
  1082. workspace=business_workspace,
  1083. parent=tool_folder,
  1084. label='Test file',
  1085. do_save=False,
  1086. do_notify=False,
  1087. )
  1088. test_file.file_extension = '.txt'
  1089. test_file.depot_file = FileIntent(
  1090. b'Test file',
  1091. 'Test_file.txt',
  1092. 'text/plain',
  1093. )
  1094. dbsession.flush()
  1095. transaction.commit()
  1096. content_id = int(test_file.content_id)
  1097. image = create_test_image()
  1098. self.testapp.authorization = (
  1099. 'Basic',
  1100. (
  1101. 'admin@admin.admin',
  1102. 'admin@admin.admin'
  1103. )
  1104. )
  1105. res = self.testapp.put(
  1106. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1107. upload_files=[
  1108. ('files', image.name, image.getvalue())
  1109. ],
  1110. status=204,
  1111. )
  1112. res = self.testapp.get(
  1113. '/api/v2/workspaces/1/files/{}/preview/jpg'.format(content_id),
  1114. status=200
  1115. )
  1116. assert res.body != image.getvalue()
  1117. assert res.content_type == 'image/jpeg'
  1118. def test_api__get_sized_jpeg_preview__ok__200__nominal_case(self) -> None:
  1119. """
  1120. get 256x256 preview of a txt file
  1121. """
  1122. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1123. admin = dbsession.query(models.User) \
  1124. .filter(models.User.email == 'admin@admin.admin') \
  1125. .one()
  1126. workspace_api = WorkspaceApi(
  1127. current_user=admin,
  1128. session=dbsession,
  1129. config=self.app_config
  1130. )
  1131. content_api = ContentApi(
  1132. current_user=admin,
  1133. session=dbsession,
  1134. config=self.app_config
  1135. )
  1136. business_workspace = workspace_api.get_one(1)
  1137. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1138. test_file = content_api.create(
  1139. content_type=ContentType.File,
  1140. workspace=business_workspace,
  1141. parent=tool_folder,
  1142. label='Test file',
  1143. do_save=True,
  1144. do_notify=False,
  1145. )
  1146. dbsession.flush()
  1147. transaction.commit()
  1148. content_id = int(test_file.content_id)
  1149. image = create_test_image()
  1150. self.testapp.authorization = (
  1151. 'Basic',
  1152. (
  1153. 'admin@admin.admin',
  1154. 'admin@admin.admin'
  1155. )
  1156. )
  1157. res = self.testapp.put(
  1158. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1159. upload_files=[
  1160. ('files',image.name, image.getvalue())
  1161. ],
  1162. status=204,
  1163. )
  1164. res = self.testapp.get(
  1165. '/api/v2/workspaces/1/files/{}/preview/jpg/256x256'.format(content_id), # nopep8
  1166. status=200
  1167. )
  1168. assert res.body != image.getvalue()
  1169. assert res.content_type == 'image/jpeg'
  1170. new_image = Image.open(io.BytesIO(res.body))
  1171. assert 256, 256 == new_image.size
  1172. def test_api__get_sized_jpeg_preview__err__400__SizeNotAllowed(self) -> None:
  1173. """
  1174. get 256x256 preview of a txt file
  1175. """
  1176. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1177. admin = dbsession.query(models.User) \
  1178. .filter(models.User.email == 'admin@admin.admin') \
  1179. .one()
  1180. workspace_api = WorkspaceApi(
  1181. current_user=admin,
  1182. session=dbsession,
  1183. config=self.app_config
  1184. )
  1185. content_api = ContentApi(
  1186. current_user=admin,
  1187. session=dbsession,
  1188. config=self.app_config
  1189. )
  1190. business_workspace = workspace_api.get_one(1)
  1191. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1192. test_file = content_api.create(
  1193. content_type=ContentType.File,
  1194. workspace=business_workspace,
  1195. parent=tool_folder,
  1196. label='Test file',
  1197. do_save=True,
  1198. do_notify=False,
  1199. )
  1200. dbsession.flush()
  1201. transaction.commit()
  1202. content_id = int(test_file.content_id)
  1203. image = create_test_image()
  1204. self.testapp.authorization = (
  1205. 'Basic',
  1206. (
  1207. 'admin@admin.admin',
  1208. 'admin@admin.admin'
  1209. )
  1210. )
  1211. res = self.testapp.put(
  1212. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1213. upload_files=[
  1214. ('files',image.name, image.getvalue())
  1215. ],
  1216. status=204,
  1217. )
  1218. res = self.testapp.get(
  1219. '/api/v2/workspaces/1/files/{}/preview/jpg/512x512'.format(content_id), # nopep8
  1220. status=400
  1221. )
  1222. def test_api__get_sized_jpeg_revision_preview__ok__200__nominal_case(self) -> None:
  1223. """
  1224. get 256x256 revision preview of a txt file
  1225. """
  1226. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1227. admin = dbsession.query(models.User) \
  1228. .filter(models.User.email == 'admin@admin.admin') \
  1229. .one()
  1230. workspace_api = WorkspaceApi(
  1231. current_user=admin,
  1232. session=dbsession,
  1233. config=self.app_config
  1234. )
  1235. content_api = ContentApi(
  1236. current_user=admin,
  1237. session=dbsession,
  1238. config=self.app_config
  1239. )
  1240. business_workspace = workspace_api.get_one(1)
  1241. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1242. test_file = content_api.create(
  1243. content_type=ContentType.File,
  1244. workspace=business_workspace,
  1245. parent=tool_folder,
  1246. label='Test file',
  1247. do_save=False,
  1248. do_notify=False,
  1249. )
  1250. test_file.file_extension = '.txt'
  1251. test_file.depot_file = FileIntent(
  1252. b'Test file',
  1253. 'Test_file.txt',
  1254. 'text/plain',
  1255. )
  1256. dbsession.flush()
  1257. transaction.commit()
  1258. content_id = int(test_file.content_id)
  1259. revision_id = int(test_file.revision_id)
  1260. image = create_test_image()
  1261. self.testapp.authorization = (
  1262. 'Basic',
  1263. (
  1264. 'admin@admin.admin',
  1265. 'admin@admin.admin'
  1266. )
  1267. )
  1268. res = self.testapp.put(
  1269. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1270. upload_files=[
  1271. ('files', image.name, image.getvalue())
  1272. ],
  1273. status=204,
  1274. )
  1275. res = self.testapp.get(
  1276. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/raw'.format(
  1277. content_id=content_id,
  1278. revision_id=revision_id,
  1279. ),
  1280. status=200
  1281. )
  1282. assert res.content_type == 'text/plain'
  1283. res = self.testapp.get(
  1284. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/preview/jpg/256x256'.format(
  1285. content_id=content_id,
  1286. revision_id=revision_id,
  1287. ),
  1288. status=200
  1289. )
  1290. assert res.body != image.getvalue()
  1291. assert res.content_type == 'image/jpeg'
  1292. new_image = Image.open(io.BytesIO(res.body))
  1293. assert 256, 256 == new_image.size
  1294. def test_api__get_full_pdf_preview__ok__200__nominal_case(self) -> None:
  1295. """
  1296. get full pdf preview of a txt file
  1297. """
  1298. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1299. admin = dbsession.query(models.User) \
  1300. .filter(models.User.email == 'admin@admin.admin') \
  1301. .one()
  1302. workspace_api = WorkspaceApi(
  1303. current_user=admin,
  1304. session=dbsession,
  1305. config=self.app_config
  1306. )
  1307. content_api = ContentApi(
  1308. current_user=admin,
  1309. session=dbsession,
  1310. config=self.app_config
  1311. )
  1312. business_workspace = workspace_api.get_one(1)
  1313. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1314. test_file = content_api.create(
  1315. content_type=ContentType.File,
  1316. workspace=business_workspace,
  1317. parent=tool_folder,
  1318. label='Test file',
  1319. do_save=True,
  1320. do_notify=False,
  1321. )
  1322. with new_revision(
  1323. session=dbsession,
  1324. tm=transaction.manager,
  1325. content=test_file,
  1326. ):
  1327. test_file.file_extension = '.txt'
  1328. test_file.depot_file = FileIntent(
  1329. b'Test file',
  1330. 'Test_file.txt',
  1331. 'text/plain',
  1332. )
  1333. content_api.update_content(test_file, 'Test_file', '<p>description</p>')
  1334. dbsession.flush()
  1335. transaction.commit()
  1336. content_id = int(test_file.content_id)
  1337. self.testapp.authorization = (
  1338. 'Basic',
  1339. (
  1340. 'admin@admin.admin',
  1341. 'admin@admin.admin'
  1342. )
  1343. )
  1344. res = self.testapp.put(
  1345. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1346. upload_files=[
  1347. ('files', test_file.file_name, test_file.depot_file.file.read())
  1348. ],
  1349. status=204,
  1350. )
  1351. res = self.testapp.get(
  1352. '/api/v2/workspaces/1/files/{}/preview/pdf/full'.format(content_id), # nopep8
  1353. status=200
  1354. )
  1355. assert res.content_type == 'application/pdf'
  1356. def test_api__get_full_pdf_preview__err__400__png_UnavailablePreviewType(self) -> None:
  1357. """
  1358. get full pdf preview of a png image -> error UnavailablePreviewType
  1359. """
  1360. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1361. admin = dbsession.query(models.User) \
  1362. .filter(models.User.email == 'admin@admin.admin') \
  1363. .one()
  1364. workspace_api = WorkspaceApi(
  1365. current_user=admin,
  1366. session=dbsession,
  1367. config=self.app_config
  1368. )
  1369. content_api = ContentApi(
  1370. current_user=admin,
  1371. session=dbsession,
  1372. config=self.app_config
  1373. )
  1374. business_workspace = workspace_api.get_one(1)
  1375. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1376. test_file = content_api.create(
  1377. content_type=ContentType.File,
  1378. workspace=business_workspace,
  1379. parent=tool_folder,
  1380. label='Test file',
  1381. do_save=True,
  1382. do_notify=False,
  1383. )
  1384. dbsession.flush()
  1385. transaction.commit()
  1386. content_id = int(test_file.content_id)
  1387. image = create_test_image()
  1388. self.testapp.authorization = (
  1389. 'Basic',
  1390. (
  1391. 'admin@admin.admin',
  1392. 'admin@admin.admin'
  1393. )
  1394. )
  1395. res = self.testapp.put(
  1396. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1397. upload_files=[
  1398. ('files',image.name, image.getvalue())
  1399. ],
  1400. status=204,
  1401. )
  1402. res = self.testapp.get(
  1403. '/api/v2/workspaces/1/files/{}/preview/pdf/full'.format(content_id), # nopep8
  1404. status=400
  1405. )
  1406. def test_api__get_pdf_preview__ok__200__nominal_case(self) -> None:
  1407. """
  1408. get full pdf preview of a txt file
  1409. """
  1410. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1411. admin = dbsession.query(models.User) \
  1412. .filter(models.User.email == 'admin@admin.admin') \
  1413. .one()
  1414. workspace_api = WorkspaceApi(
  1415. current_user=admin,
  1416. session=dbsession,
  1417. config=self.app_config
  1418. )
  1419. content_api = ContentApi(
  1420. current_user=admin,
  1421. session=dbsession,
  1422. config=self.app_config
  1423. )
  1424. business_workspace = workspace_api.get_one(1)
  1425. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1426. test_file = content_api.create(
  1427. content_type=ContentType.File,
  1428. workspace=business_workspace,
  1429. parent=tool_folder,
  1430. label='Test file',
  1431. do_save=True,
  1432. do_notify=False,
  1433. )
  1434. with new_revision(
  1435. session=dbsession,
  1436. tm=transaction.manager,
  1437. content=test_file,
  1438. ):
  1439. test_file.file_extension = '.txt'
  1440. test_file.depot_file = FileIntent(
  1441. b'Test file',
  1442. 'Test_file.txt',
  1443. 'text/plain',
  1444. )
  1445. content_api.update_content(test_file, 'Test_file', '<p>description</p>')
  1446. dbsession.flush()
  1447. transaction.commit()
  1448. content_id = int(test_file.content_id)
  1449. self.testapp.authorization = (
  1450. 'Basic',
  1451. (
  1452. 'admin@admin.admin',
  1453. 'admin@admin.admin'
  1454. )
  1455. )
  1456. res = self.testapp.put(
  1457. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1458. upload_files=[
  1459. ('files', test_file.file_name, test_file.depot_file.file.read())
  1460. ],
  1461. status=204,
  1462. )
  1463. params = {'page': 0}
  1464. res = self.testapp.get(
  1465. '/api/v2/workspaces/1/files/{}/preview/pdf'.format(content_id),
  1466. status=200,
  1467. params=params,
  1468. )
  1469. assert res.content_type == 'application/pdf'
  1470. def test_api__get_pdf_preview__ok__err__400_page_of_preview_not_found(self) -> None:
  1471. """
  1472. get full pdf preview of a txt file
  1473. """
  1474. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1475. admin = dbsession.query(models.User) \
  1476. .filter(models.User.email == 'admin@admin.admin') \
  1477. .one()
  1478. workspace_api = WorkspaceApi(
  1479. current_user=admin,
  1480. session=dbsession,
  1481. config=self.app_config
  1482. )
  1483. content_api = ContentApi(
  1484. current_user=admin,
  1485. session=dbsession,
  1486. config=self.app_config
  1487. )
  1488. business_workspace = workspace_api.get_one(1)
  1489. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1490. test_file = content_api.create(
  1491. content_type=ContentType.File,
  1492. workspace=business_workspace,
  1493. parent=tool_folder,
  1494. label='Test file',
  1495. do_save=True,
  1496. do_notify=False,
  1497. )
  1498. with new_revision(
  1499. session=dbsession,
  1500. tm=transaction.manager,
  1501. content=test_file,
  1502. ):
  1503. test_file.file_extension = '.txt'
  1504. test_file.depot_file = FileIntent(
  1505. b'Test file',
  1506. 'Test_file.txt',
  1507. 'text/plain',
  1508. )
  1509. content_api.update_content(test_file, 'Test_file', '<p>description</p>')
  1510. dbsession.flush()
  1511. transaction.commit()
  1512. content_id = int(test_file.content_id)
  1513. self.testapp.authorization = (
  1514. 'Basic',
  1515. (
  1516. 'admin@admin.admin',
  1517. 'admin@admin.admin'
  1518. )
  1519. )
  1520. res = self.testapp.put(
  1521. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1522. upload_files=[
  1523. ('files', test_file.file_name, test_file.depot_file.file.read())
  1524. ],
  1525. status=204,
  1526. )
  1527. params = {'page': 1}
  1528. res = self.testapp.get(
  1529. '/api/v2/workspaces/1/files/{}/preview/pdf'.format(content_id),
  1530. status=400,
  1531. params=params,
  1532. )
  1533. def test_api__get_pdf_revision_preview__ok__200__nominal_case(self) -> None:
  1534. """
  1535. get pdf revision preview of content
  1536. """
  1537. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1538. admin = dbsession.query(models.User) \
  1539. .filter(models.User.email == 'admin@admin.admin') \
  1540. .one()
  1541. workspace_api = WorkspaceApi(
  1542. current_user=admin,
  1543. session=dbsession,
  1544. config=self.app_config
  1545. )
  1546. content_api = ContentApi(
  1547. current_user=admin,
  1548. session=dbsession,
  1549. config=self.app_config
  1550. )
  1551. business_workspace = workspace_api.get_one(1)
  1552. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1553. test_file = content_api.create(
  1554. content_type=ContentType.File,
  1555. workspace=business_workspace,
  1556. parent=tool_folder,
  1557. label='Test file',
  1558. do_save=False,
  1559. do_notify=False,
  1560. )
  1561. test_file.file_extension = '.txt'
  1562. test_file.depot_file = FileIntent(
  1563. b'Test file',
  1564. 'Test_file.txt',
  1565. 'text/plain',
  1566. )
  1567. dbsession.flush()
  1568. transaction.commit()
  1569. content_id = int(test_file.content_id)
  1570. revision_id = int(test_file.revision_id)
  1571. image = create_test_image()
  1572. self.testapp.authorization = (
  1573. 'Basic',
  1574. (
  1575. 'admin@admin.admin',
  1576. 'admin@admin.admin'
  1577. )
  1578. )
  1579. res = self.testapp.put(
  1580. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1581. upload_files=[
  1582. ('files', image.name, image.getvalue())
  1583. ],
  1584. status=204,
  1585. )
  1586. res = self.testapp.get(
  1587. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/raw'.format(
  1588. content_id=content_id,
  1589. revision_id=revision_id,
  1590. ),
  1591. status=200
  1592. )
  1593. assert res.content_type == 'text/plain'
  1594. params = {'page': 0}
  1595. res = self.testapp.get(
  1596. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/preview/pdf'.format(
  1597. content_id=content_id,
  1598. revision_id=revision_id,
  1599. ),
  1600. status=200
  1601. )
  1602. assert res.content_type == 'application/pdf'
  1603. class TestThreads(FunctionalTest):
  1604. """
  1605. Tests for /api/v2/workspaces/{workspace_id}/threads/{content_id}
  1606. endpoint
  1607. """
  1608. fixtures = [BaseFixture, ContentFixtures]
  1609. def test_api__get_thread__err_400__wrong_content_type(self) -> None:
  1610. """
  1611. Get one html document of a content
  1612. """
  1613. self.testapp.authorization = (
  1614. 'Basic',
  1615. (
  1616. 'admin@admin.admin',
  1617. 'admin@admin.admin'
  1618. )
  1619. )
  1620. res = self.testapp.get(
  1621. '/api/v2/workspaces/2/threads/6',
  1622. status=400
  1623. )
  1624. def test_api__get_thread__ok_200__nominal_case(self) -> None:
  1625. """
  1626. Get one html document of a content
  1627. """
  1628. self.testapp.authorization = (
  1629. 'Basic',
  1630. (
  1631. 'admin@admin.admin',
  1632. 'admin@admin.admin'
  1633. )
  1634. )
  1635. res = self.testapp.get(
  1636. '/api/v2/workspaces/2/threads/7',
  1637. status=200
  1638. ) # nopep8
  1639. content = res.json_body
  1640. assert content['content_type'] == 'thread'
  1641. assert content['content_id'] == 7
  1642. assert content['is_archived'] is False
  1643. assert content['is_deleted'] is False
  1644. assert content['label'] == 'Best Cakes?'
  1645. assert content['parent_id'] == 3
  1646. assert content['show_in_ui'] is True
  1647. assert content['slug'] == 'best-cakes'
  1648. assert content['status'] == 'open'
  1649. assert content['workspace_id'] == 2
  1650. assert content['current_revision_id'] == 26
  1651. # TODO - G.M - 2018-06-173 - check date format
  1652. assert content['created']
  1653. assert content['author']
  1654. assert content['author']['user_id'] == 1
  1655. assert content['author']['avatar_url'] is None
  1656. assert content['author']['public_name'] == 'Global manager'
  1657. # TODO - G.M - 2018-06-173 - check date format
  1658. assert content['modified']
  1659. assert content['last_modifier'] != content['author']
  1660. assert content['last_modifier']['user_id'] == 3
  1661. assert content['last_modifier']['public_name'] == 'Bob i.'
  1662. assert content['last_modifier']['avatar_url'] is None
  1663. assert content['raw_content'] == 'What is the best cake?' # nopep8
  1664. def test_api__get_thread__err_400__content_does_not_exist(self) -> None:
  1665. """
  1666. Get one thread (content 170 does not exist)
  1667. """
  1668. self.testapp.authorization = (
  1669. 'Basic',
  1670. (
  1671. 'admin@admin.admin',
  1672. 'admin@admin.admin'
  1673. )
  1674. )
  1675. res = self.testapp.get(
  1676. '/api/v2/workspaces/2/threads/170',
  1677. status=400
  1678. )
  1679. def test_api__get_thread__err_400__content_not_in_workspace(self) -> None:
  1680. """
  1681. Get one thread(content 7 is in workspace 2)
  1682. """
  1683. self.testapp.authorization = (
  1684. 'Basic',
  1685. (
  1686. 'admin@admin.admin',
  1687. 'admin@admin.admin'
  1688. )
  1689. )
  1690. res = self.testapp.get(
  1691. '/api/v2/workspaces/1/threads/7',
  1692. status=400
  1693. )
  1694. def test_api__get_thread__err_400__workspace_does_not_exist(self) -> None: # nopep8
  1695. """
  1696. Get one thread (Workspace 40 does not exist)
  1697. """
  1698. self.testapp.authorization = (
  1699. 'Basic',
  1700. (
  1701. 'admin@admin.admin',
  1702. 'admin@admin.admin'
  1703. )
  1704. )
  1705. res = self.testapp.get(
  1706. '/api/v2/workspaces/40/threads/7',
  1707. status=400
  1708. )
  1709. def test_api__get_thread__err_400__workspace_id_is_not_int(self) -> None: # nopep8
  1710. """
  1711. Get one thread, workspace id is not int
  1712. """
  1713. self.testapp.authorization = (
  1714. 'Basic',
  1715. (
  1716. 'admin@admin.admin',
  1717. 'admin@admin.admin'
  1718. )
  1719. )
  1720. res = self.testapp.get(
  1721. '/api/v2/workspaces/coucou/threads/7',
  1722. status=400
  1723. )
  1724. def test_api__get_thread__err_400_content_id_is_not_int(self) -> None: # nopep8
  1725. """
  1726. Get one thread, content id is not int
  1727. """
  1728. self.testapp.authorization = (
  1729. 'Basic',
  1730. (
  1731. 'admin@admin.admin',
  1732. 'admin@admin.admin'
  1733. )
  1734. )
  1735. res = self.testapp.get(
  1736. '/api/v2/workspaces/2/threads/coucou',
  1737. status=400
  1738. )
  1739. def test_api__update_thread__ok_200__nominal_case(self) -> None:
  1740. """
  1741. Update(put) thread
  1742. """
  1743. self.testapp.authorization = (
  1744. 'Basic',
  1745. (
  1746. 'admin@admin.admin',
  1747. 'admin@admin.admin'
  1748. )
  1749. )
  1750. params = {
  1751. 'label': 'My New label',
  1752. 'raw_content': '<p> Le nouveau contenu </p>',
  1753. }
  1754. res = self.testapp.put_json(
  1755. '/api/v2/workspaces/2/threads/7',
  1756. params=params,
  1757. status=200
  1758. )
  1759. content = res.json_body
  1760. assert content['content_type'] == 'thread'
  1761. assert content['content_id'] == 7
  1762. assert content['is_archived'] is False
  1763. assert content['is_deleted'] is False
  1764. assert content['label'] == 'My New label'
  1765. assert content['parent_id'] == 3
  1766. assert content['show_in_ui'] is True
  1767. assert content['slug'] == 'my-new-label'
  1768. assert content['status'] == 'open'
  1769. assert content['workspace_id'] == 2
  1770. assert content['current_revision_id'] == 28
  1771. # TODO - G.M - 2018-06-173 - check date format
  1772. assert content['created']
  1773. assert content['author']
  1774. assert content['author']['user_id'] == 1
  1775. assert content['author']['avatar_url'] is None
  1776. assert content['author']['public_name'] == 'Global manager'
  1777. # TODO - G.M - 2018-06-173 - check date format
  1778. assert content['modified']
  1779. assert content['last_modifier'] == content['author']
  1780. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1781. res = self.testapp.get(
  1782. '/api/v2/workspaces/2/threads/7',
  1783. status=200
  1784. ) # nopep8
  1785. content = res.json_body
  1786. assert content['content_type'] == 'thread'
  1787. assert content['content_id'] == 7
  1788. assert content['is_archived'] is False
  1789. assert content['is_deleted'] is False
  1790. assert content['label'] == 'My New label'
  1791. assert content['parent_id'] == 3
  1792. assert content['show_in_ui'] is True
  1793. assert content['slug'] == 'my-new-label'
  1794. assert content['status'] == 'open'
  1795. assert content['workspace_id'] == 2
  1796. assert content['current_revision_id'] == 28
  1797. # TODO - G.M - 2018-06-173 - check date format
  1798. assert content['created']
  1799. assert content['author']
  1800. assert content['author']['user_id'] == 1
  1801. assert content['author']['avatar_url'] is None
  1802. assert content['author']['public_name'] == 'Global manager'
  1803. # TODO - G.M - 2018-06-173 - check date format
  1804. assert content['modified']
  1805. assert content['last_modifier'] == content['author']
  1806. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1807. def test_api__update_thread__err_400__empty_label(self) -> None:
  1808. """
  1809. Update(put) thread
  1810. """
  1811. self.testapp.authorization = (
  1812. 'Basic',
  1813. (
  1814. 'admin@admin.admin',
  1815. 'admin@admin.admin'
  1816. )
  1817. )
  1818. params = {
  1819. 'label': '',
  1820. 'raw_content': '<p> Le nouveau contenu </p>',
  1821. }
  1822. res = self.testapp.put_json(
  1823. '/api/v2/workspaces/2/threads/7',
  1824. params=params,
  1825. status=400
  1826. )
  1827. def test_api__get_thread_revisions__ok_200__nominal_case(
  1828. self
  1829. ) -> None:
  1830. """
  1831. Get threads revisions
  1832. """
  1833. self.testapp.authorization = (
  1834. 'Basic',
  1835. (
  1836. 'admin@admin.admin',
  1837. 'admin@admin.admin'
  1838. )
  1839. )
  1840. res = self.testapp.get(
  1841. '/api/v2/workspaces/2/threads/7/revisions',
  1842. status=200
  1843. )
  1844. revisions = res.json_body
  1845. assert len(revisions) == 2
  1846. revision = revisions[0]
  1847. assert revision['content_type'] == 'thread'
  1848. assert revision['content_id'] == 7
  1849. assert revision['is_archived'] is False
  1850. assert revision['is_deleted'] is False
  1851. assert revision['label'] == 'Best Cake'
  1852. assert revision['parent_id'] == 3
  1853. assert revision['show_in_ui'] is True
  1854. assert revision['slug'] == 'best-cake'
  1855. assert revision['status'] == 'open'
  1856. assert revision['workspace_id'] == 2
  1857. assert revision['revision_id'] == 8
  1858. assert revision['sub_content_types']
  1859. assert revision['comment_ids'] == [18, 19, 20]
  1860. # TODO - G.M - 2018-06-173 - check date format
  1861. assert revision['created']
  1862. assert revision['author']
  1863. assert revision['author']['user_id'] == 1
  1864. assert revision['author']['avatar_url'] is None
  1865. assert revision['author']['public_name'] == 'Global manager'
  1866. revision = revisions[1]
  1867. assert revision['content_type'] == 'thread'
  1868. assert revision['content_id'] == 7
  1869. assert revision['is_archived'] is False
  1870. assert revision['is_deleted'] is False
  1871. assert revision['label'] == 'Best Cakes?'
  1872. assert revision['parent_id'] == 3
  1873. assert revision['show_in_ui'] is True
  1874. assert revision['slug'] == 'best-cakes'
  1875. assert revision['status'] == 'open'
  1876. assert revision['workspace_id'] == 2
  1877. assert revision['revision_id'] == 26
  1878. assert revision['sub_content_types']
  1879. assert revision['comment_ids'] == []
  1880. # TODO - G.M - 2018-06-173 - check date format
  1881. assert revision['created']
  1882. assert revision['author']
  1883. assert revision['author']['user_id'] == 3
  1884. assert revision['author']['avatar_url'] is None
  1885. assert revision['author']['public_name'] == 'Bob i.'
  1886. def test_api__set_thread_status__ok_200__nominal_case(self) -> None:
  1887. """
  1888. Set thread status
  1889. """
  1890. self.testapp.authorization = (
  1891. 'Basic',
  1892. (
  1893. 'admin@admin.admin',
  1894. 'admin@admin.admin'
  1895. )
  1896. )
  1897. params = {
  1898. 'status': 'closed-deprecated',
  1899. }
  1900. # before
  1901. res = self.testapp.get(
  1902. '/api/v2/workspaces/2/threads/7',
  1903. status=200
  1904. ) # nopep8
  1905. content = res.json_body
  1906. assert content['content_type'] == 'thread'
  1907. assert content['content_id'] == 7
  1908. assert content['status'] == 'open'
  1909. # set status
  1910. res = self.testapp.put_json(
  1911. '/api/v2/workspaces/2/threads/7/status',
  1912. params=params,
  1913. status=204
  1914. )
  1915. # after
  1916. res = self.testapp.get(
  1917. '/api/v2/workspaces/2/threads/7',
  1918. status=200
  1919. ) # nopep8
  1920. content = res.json_body
  1921. assert content['content_type'] == 'thread'
  1922. assert content['content_id'] == 7
  1923. assert content['status'] == 'closed-deprecated'
  1924. def test_api__set_thread_status__ok_400__wrong_status(self) -> None:
  1925. """
  1926. Set thread status
  1927. """
  1928. self.testapp.authorization = (
  1929. 'Basic',
  1930. (
  1931. 'admin@admin.admin',
  1932. 'admin@admin.admin'
  1933. )
  1934. )
  1935. params = {
  1936. 'status': 'unexistant-status',
  1937. }
  1938. res = self.testapp.put_json(
  1939. '/api/v2/workspaces/2/threads/7/status',
  1940. params=params,
  1941. status=400
  1942. )