test_contents.py 68KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022
  1. # -*- coding: utf-8 -*-
  2. import io
  3. import transaction
  4. from PIL import Image
  5. from depot.io.utils import FileIntent
  6. from tracim import models
  7. from tracim.lib.core.content import ContentApi
  8. from tracim.lib.core.workspace import WorkspaceApi
  9. from tracim.models.data import ContentType
  10. from tracim.models import get_tm_session
  11. from tracim.models.revision_protection import new_revision
  12. from tracim.tests import FunctionalTest
  13. from tracim.tests import create_1000px_png_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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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), # nopep8
  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. 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. 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_1000px_png_test_image()
  988. self.testapp.authorization = (
  989. 'Basic',
  990. (
  991. 'admin@admin.admin',
  992. 'admin@admin.admin'
  993. )
  994. )
  995. 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), # nopep8
  1052. status=200,
  1053. )
  1054. res = res.json_body
  1055. assert res['restricted'] is 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_1000px_png_test_image()
  1098. self.testapp.authorization = (
  1099. 'Basic',
  1100. (
  1101. 'admin@admin.admin',
  1102. 'admin@admin.admin'
  1103. )
  1104. )
  1105. 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_1000px_png_test_image()
  1150. self.testapp.authorization = (
  1151. 'Basic',
  1152. (
  1153. 'admin@admin.admin',
  1154. 'admin@admin.admin'
  1155. )
  1156. )
  1157. 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: # nopep8
  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_1000px_png_test_image()
  1204. self.testapp.authorization = (
  1205. 'Basic',
  1206. (
  1207. 'admin@admin.admin',
  1208. 'admin@admin.admin'
  1209. )
  1210. )
  1211. 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. 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: # nopep8
  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_1000px_png_test_image()
  1261. self.testapp.authorization = (
  1262. 'Basic',
  1263. (
  1264. 'admin@admin.admin',
  1265. 'admin@admin.admin'
  1266. )
  1267. )
  1268. 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( # nopep8
  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( # nopep8
  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>') # nopep8
  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. 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: # nopep8
  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_1000px_png_test_image()
  1388. self.testapp.authorization = (
  1389. 'Basic',
  1390. (
  1391. 'admin@admin.admin',
  1392. 'admin@admin.admin'
  1393. )
  1394. )
  1395. 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. 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>') # nopep8
  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. 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: # nopep8
  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>') # nopep8
  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. 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. 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_1000px_png_test_image()
  1572. self.testapp.authorization = (
  1573. 'Basic',
  1574. (
  1575. 'admin@admin.admin',
  1576. 'admin@admin.admin'
  1577. )
  1578. )
  1579. 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( # nopep8
  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( # nopep8
  1597. content_id=content_id,
  1598. revision_id=revision_id,
  1599. params=params,
  1600. ),
  1601. status=200
  1602. )
  1603. assert res.content_type == 'application/pdf'
  1604. class TestThreads(FunctionalTest):
  1605. """
  1606. Tests for /api/v2/workspaces/{workspace_id}/threads/{content_id}
  1607. endpoint
  1608. """
  1609. fixtures = [BaseFixture, ContentFixtures]
  1610. def test_api__get_thread__err_400__wrong_content_type(self) -> None:
  1611. """
  1612. Get one html document of a content
  1613. """
  1614. self.testapp.authorization = (
  1615. 'Basic',
  1616. (
  1617. 'admin@admin.admin',
  1618. 'admin@admin.admin'
  1619. )
  1620. )
  1621. self.testapp.get(
  1622. '/api/v2/workspaces/2/threads/6',
  1623. status=400
  1624. )
  1625. def test_api__get_thread__ok_200__nominal_case(self) -> None:
  1626. """
  1627. Get one html document of a content
  1628. """
  1629. self.testapp.authorization = (
  1630. 'Basic',
  1631. (
  1632. 'admin@admin.admin',
  1633. 'admin@admin.admin'
  1634. )
  1635. )
  1636. res = self.testapp.get(
  1637. '/api/v2/workspaces/2/threads/7',
  1638. status=200
  1639. ) # nopep8
  1640. content = res.json_body
  1641. assert content['content_type'] == 'thread'
  1642. assert content['content_id'] == 7
  1643. assert content['is_archived'] is False
  1644. assert content['is_deleted'] is False
  1645. assert content['label'] == 'Best Cakes?'
  1646. assert content['parent_id'] == 3
  1647. assert content['show_in_ui'] is True
  1648. assert content['slug'] == 'best-cakes'
  1649. assert content['status'] == 'open'
  1650. assert content['workspace_id'] == 2
  1651. assert content['current_revision_id'] == 26
  1652. # TODO - G.M - 2018-06-173 - check date format
  1653. assert content['created']
  1654. assert content['author']
  1655. assert content['author']['user_id'] == 1
  1656. assert content['author']['avatar_url'] is None
  1657. assert content['author']['public_name'] == 'Global manager'
  1658. # TODO - G.M - 2018-06-173 - check date format
  1659. assert content['modified']
  1660. assert content['last_modifier'] != content['author']
  1661. assert content['last_modifier']['user_id'] == 3
  1662. assert content['last_modifier']['public_name'] == 'Bob i.'
  1663. assert content['last_modifier']['avatar_url'] is None
  1664. assert content['raw_content'] == 'What is the best cake?' # nopep8
  1665. def test_api__get_thread__err_400__content_does_not_exist(self) -> None:
  1666. """
  1667. Get one thread (content 170 does not exist)
  1668. """
  1669. self.testapp.authorization = (
  1670. 'Basic',
  1671. (
  1672. 'admin@admin.admin',
  1673. 'admin@admin.admin'
  1674. )
  1675. )
  1676. self.testapp.get(
  1677. '/api/v2/workspaces/2/threads/170',
  1678. status=400
  1679. )
  1680. def test_api__get_thread__err_400__content_not_in_workspace(self) -> None:
  1681. """
  1682. Get one thread(content 7 is in workspace 2)
  1683. """
  1684. self.testapp.authorization = (
  1685. 'Basic',
  1686. (
  1687. 'admin@admin.admin',
  1688. 'admin@admin.admin'
  1689. )
  1690. )
  1691. self.testapp.get(
  1692. '/api/v2/workspaces/1/threads/7',
  1693. status=400
  1694. )
  1695. def test_api__get_thread__err_400__workspace_does_not_exist(self) -> None: # nopep8
  1696. """
  1697. Get one thread (Workspace 40 does not exist)
  1698. """
  1699. self.testapp.authorization = (
  1700. 'Basic',
  1701. (
  1702. 'admin@admin.admin',
  1703. 'admin@admin.admin'
  1704. )
  1705. )
  1706. self.testapp.get(
  1707. '/api/v2/workspaces/40/threads/7',
  1708. status=400
  1709. )
  1710. def test_api__get_thread__err_400__workspace_id_is_not_int(self) -> None: # nopep8
  1711. """
  1712. Get one thread, workspace id is not int
  1713. """
  1714. self.testapp.authorization = (
  1715. 'Basic',
  1716. (
  1717. 'admin@admin.admin',
  1718. 'admin@admin.admin'
  1719. )
  1720. )
  1721. self.testapp.get(
  1722. '/api/v2/workspaces/coucou/threads/7',
  1723. status=400
  1724. )
  1725. def test_api__get_thread__err_400_content_id_is_not_int(self) -> None: # nopep8
  1726. """
  1727. Get one thread, content id is not int
  1728. """
  1729. self.testapp.authorization = (
  1730. 'Basic',
  1731. (
  1732. 'admin@admin.admin',
  1733. 'admin@admin.admin'
  1734. )
  1735. )
  1736. self.testapp.get(
  1737. '/api/v2/workspaces/2/threads/coucou',
  1738. status=400
  1739. )
  1740. def test_api__update_thread__ok_200__nominal_case(self) -> None:
  1741. """
  1742. Update(put) thread
  1743. """
  1744. self.testapp.authorization = (
  1745. 'Basic',
  1746. (
  1747. 'admin@admin.admin',
  1748. 'admin@admin.admin'
  1749. )
  1750. )
  1751. params = {
  1752. 'label': 'My New label',
  1753. 'raw_content': '<p> Le nouveau contenu </p>',
  1754. }
  1755. res = self.testapp.put_json(
  1756. '/api/v2/workspaces/2/threads/7',
  1757. params=params,
  1758. status=200
  1759. )
  1760. content = res.json_body
  1761. assert content['content_type'] == 'thread'
  1762. assert content['content_id'] == 7
  1763. assert content['is_archived'] is False
  1764. assert content['is_deleted'] is False
  1765. assert content['label'] == 'My New label'
  1766. assert content['parent_id'] == 3
  1767. assert content['show_in_ui'] is True
  1768. assert content['slug'] == 'my-new-label'
  1769. assert content['status'] == 'open'
  1770. assert content['workspace_id'] == 2
  1771. assert content['current_revision_id'] == 28
  1772. # TODO - G.M - 2018-06-173 - check date format
  1773. assert content['created']
  1774. assert content['author']
  1775. assert content['author']['user_id'] == 1
  1776. assert content['author']['avatar_url'] is None
  1777. assert content['author']['public_name'] == 'Global manager'
  1778. # TODO - G.M - 2018-06-173 - check date format
  1779. assert content['modified']
  1780. assert content['last_modifier'] == content['author']
  1781. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1782. res = self.testapp.get(
  1783. '/api/v2/workspaces/2/threads/7',
  1784. status=200
  1785. ) # nopep8
  1786. content = res.json_body
  1787. assert content['content_type'] == 'thread'
  1788. assert content['content_id'] == 7
  1789. assert content['is_archived'] is False
  1790. assert content['is_deleted'] is False
  1791. assert content['label'] == 'My New label'
  1792. assert content['parent_id'] == 3
  1793. assert content['show_in_ui'] is True
  1794. assert content['slug'] == 'my-new-label'
  1795. assert content['status'] == 'open'
  1796. assert content['workspace_id'] == 2
  1797. assert content['current_revision_id'] == 28
  1798. # TODO - G.M - 2018-06-173 - check date format
  1799. assert content['created']
  1800. assert content['author']
  1801. assert content['author']['user_id'] == 1
  1802. assert content['author']['avatar_url'] is None
  1803. assert content['author']['public_name'] == 'Global manager'
  1804. # TODO - G.M - 2018-06-173 - check date format
  1805. assert content['modified']
  1806. assert content['last_modifier'] == content['author']
  1807. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1808. def test_api__update_thread__err_400__empty_label(self) -> None:
  1809. """
  1810. Update(put) thread
  1811. """
  1812. self.testapp.authorization = (
  1813. 'Basic',
  1814. (
  1815. 'admin@admin.admin',
  1816. 'admin@admin.admin'
  1817. )
  1818. )
  1819. params = {
  1820. 'label': '',
  1821. 'raw_content': '<p> Le nouveau contenu </p>',
  1822. }
  1823. self.testapp.put_json(
  1824. '/api/v2/workspaces/2/threads/7',
  1825. params=params,
  1826. status=400
  1827. )
  1828. def test_api__get_thread_revisions__ok_200__nominal_case(
  1829. self
  1830. ) -> None:
  1831. """
  1832. Get threads revisions
  1833. """
  1834. self.testapp.authorization = (
  1835. 'Basic',
  1836. (
  1837. 'admin@admin.admin',
  1838. 'admin@admin.admin'
  1839. )
  1840. )
  1841. res = self.testapp.get(
  1842. '/api/v2/workspaces/2/threads/7/revisions',
  1843. status=200
  1844. )
  1845. revisions = res.json_body
  1846. assert len(revisions) == 2
  1847. revision = revisions[0]
  1848. assert revision['content_type'] == 'thread'
  1849. assert revision['content_id'] == 7
  1850. assert revision['is_archived'] is False
  1851. assert revision['is_deleted'] is False
  1852. assert revision['label'] == 'Best Cake'
  1853. assert revision['parent_id'] == 3
  1854. assert revision['show_in_ui'] is True
  1855. assert revision['slug'] == 'best-cake'
  1856. assert revision['status'] == 'open'
  1857. assert revision['workspace_id'] == 2
  1858. assert revision['revision_id'] == 8
  1859. assert revision['sub_content_types']
  1860. assert revision['comment_ids'] == [18, 19, 20]
  1861. # TODO - G.M - 2018-06-173 - check date format
  1862. assert revision['created']
  1863. assert revision['author']
  1864. assert revision['author']['user_id'] == 1
  1865. assert revision['author']['avatar_url'] is None
  1866. assert revision['author']['public_name'] == 'Global manager'
  1867. revision = revisions[1]
  1868. assert revision['content_type'] == 'thread'
  1869. assert revision['content_id'] == 7
  1870. assert revision['is_archived'] is False
  1871. assert revision['is_deleted'] is False
  1872. assert revision['label'] == 'Best Cakes?'
  1873. assert revision['parent_id'] == 3
  1874. assert revision['show_in_ui'] is True
  1875. assert revision['slug'] == 'best-cakes'
  1876. assert revision['status'] == 'open'
  1877. assert revision['workspace_id'] == 2
  1878. assert revision['revision_id'] == 26
  1879. assert revision['sub_content_types']
  1880. assert revision['comment_ids'] == []
  1881. # TODO - G.M - 2018-06-173 - check date format
  1882. assert revision['created']
  1883. assert revision['author']
  1884. assert revision['author']['user_id'] == 3
  1885. assert revision['author']['avatar_url'] is None
  1886. assert revision['author']['public_name'] == 'Bob i.'
  1887. def test_api__set_thread_status__ok_200__nominal_case(self) -> None:
  1888. """
  1889. Set thread status
  1890. """
  1891. self.testapp.authorization = (
  1892. 'Basic',
  1893. (
  1894. 'admin@admin.admin',
  1895. 'admin@admin.admin'
  1896. )
  1897. )
  1898. params = {
  1899. 'status': 'closed-deprecated',
  1900. }
  1901. # before
  1902. res = self.testapp.get(
  1903. '/api/v2/workspaces/2/threads/7',
  1904. status=200
  1905. ) # nopep8
  1906. content = res.json_body
  1907. assert content['content_type'] == 'thread'
  1908. assert content['content_id'] == 7
  1909. assert content['status'] == 'open'
  1910. # set status
  1911. self.testapp.put_json(
  1912. '/api/v2/workspaces/2/threads/7/status',
  1913. params=params,
  1914. status=204
  1915. )
  1916. # after
  1917. res = self.testapp.get(
  1918. '/api/v2/workspaces/2/threads/7',
  1919. status=200
  1920. ) # nopep8
  1921. content = res.json_body
  1922. assert content['content_type'] == 'thread'
  1923. assert content['content_id'] == 7
  1924. assert content['status'] == 'closed-deprecated'
  1925. def test_api__set_thread_status__ok_400__wrong_status(self) -> None:
  1926. """
  1927. Set thread status
  1928. """
  1929. self.testapp.authorization = (
  1930. 'Basic',
  1931. (
  1932. 'admin@admin.admin',
  1933. 'admin@admin.admin'
  1934. )
  1935. )
  1936. params = {
  1937. 'status': 'unexistant-status',
  1938. }
  1939. self.testapp.put_json(
  1940. '/api/v2/workspaces/2/threads/7/status',
  1941. params=params,
  1942. status=400
  1943. )