test_contents.py 61KB

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