test_contents.py 68KB

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