test_contents.py 58KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718
  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_jpeg_preview__ok__200__nominal_case(self) -> None:
  1010. """
  1011. Set one file of a content
  1012. """
  1013. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1014. admin = dbsession.query(models.User) \
  1015. .filter(models.User.email == 'admin@admin.admin') \
  1016. .one()
  1017. workspace_api = WorkspaceApi(
  1018. current_user=admin,
  1019. session=dbsession,
  1020. config=self.app_config
  1021. )
  1022. content_api = ContentApi(
  1023. current_user=admin,
  1024. session=dbsession,
  1025. config=self.app_config
  1026. )
  1027. business_workspace = workspace_api.get_one(1)
  1028. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1029. test_file = content_api.create(
  1030. content_type=ContentType.File,
  1031. workspace=business_workspace,
  1032. parent=tool_folder,
  1033. label='Test file',
  1034. do_save=False,
  1035. do_notify=False,
  1036. )
  1037. test_file.file_extension = '.txt'
  1038. test_file.depot_file = FileIntent(
  1039. b'Test file',
  1040. 'Test_file.txt',
  1041. 'text/plain',
  1042. )
  1043. dbsession.flush()
  1044. transaction.commit()
  1045. content_id = int(test_file.content_id)
  1046. image = create_test_image()
  1047. self.testapp.authorization = (
  1048. 'Basic',
  1049. (
  1050. 'admin@admin.admin',
  1051. 'admin@admin.admin'
  1052. )
  1053. )
  1054. res = self.testapp.put(
  1055. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1056. upload_files=[
  1057. ('files', image.name, image.getvalue())
  1058. ],
  1059. status=204,
  1060. )
  1061. res = self.testapp.get(
  1062. '/api/v2/workspaces/1/files/{}/preview/jpg'.format(content_id),
  1063. status=200
  1064. )
  1065. assert res.body != image.getvalue()
  1066. assert res.content_type == 'image/jpeg'
  1067. def test_api__get_sized_jpeg_preview__ok__200__nominal_case(self) -> None:
  1068. """
  1069. get 256x256 preview of a txt file
  1070. """
  1071. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1072. admin = dbsession.query(models.User) \
  1073. .filter(models.User.email == 'admin@admin.admin') \
  1074. .one()
  1075. workspace_api = WorkspaceApi(
  1076. current_user=admin,
  1077. session=dbsession,
  1078. config=self.app_config
  1079. )
  1080. content_api = ContentApi(
  1081. current_user=admin,
  1082. session=dbsession,
  1083. config=self.app_config
  1084. )
  1085. business_workspace = workspace_api.get_one(1)
  1086. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1087. test_file = content_api.create(
  1088. content_type=ContentType.File,
  1089. workspace=business_workspace,
  1090. parent=tool_folder,
  1091. label='Test file',
  1092. do_save=True,
  1093. do_notify=False,
  1094. )
  1095. dbsession.flush()
  1096. transaction.commit()
  1097. content_id = int(test_file.content_id)
  1098. image = create_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/256x256'.format(content_id), # nopep8
  1115. status=200
  1116. )
  1117. assert res.body != image.getvalue()
  1118. assert res.content_type == 'image/jpeg'
  1119. new_image = Image.open(io.BytesIO(res.body))
  1120. assert 256, 256 == new_image.size
  1121. def test_api__get_sized_jpeg_revision_preview__ok__200__nominal_case(self) -> None:
  1122. """
  1123. get 256x256 revision preview of a txt file
  1124. """
  1125. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1126. admin = dbsession.query(models.User) \
  1127. .filter(models.User.email == 'admin@admin.admin') \
  1128. .one()
  1129. workspace_api = WorkspaceApi(
  1130. current_user=admin,
  1131. session=dbsession,
  1132. config=self.app_config
  1133. )
  1134. content_api = ContentApi(
  1135. current_user=admin,
  1136. session=dbsession,
  1137. config=self.app_config
  1138. )
  1139. business_workspace = workspace_api.get_one(1)
  1140. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1141. test_file = content_api.create(
  1142. content_type=ContentType.File,
  1143. workspace=business_workspace,
  1144. parent=tool_folder,
  1145. label='Test file',
  1146. do_save=False,
  1147. do_notify=False,
  1148. )
  1149. test_file.file_extension = '.txt'
  1150. test_file.depot_file = FileIntent(
  1151. b'Test file',
  1152. 'Test_file.txt',
  1153. 'text/plain',
  1154. )
  1155. dbsession.flush()
  1156. transaction.commit()
  1157. content_id = int(test_file.content_id)
  1158. revision_id = int(test_file.revision_id)
  1159. image = create_test_image()
  1160. self.testapp.authorization = (
  1161. 'Basic',
  1162. (
  1163. 'admin@admin.admin',
  1164. 'admin@admin.admin'
  1165. )
  1166. )
  1167. res = self.testapp.put(
  1168. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1169. upload_files=[
  1170. ('files', image.name, image.getvalue())
  1171. ],
  1172. status=204,
  1173. )
  1174. res = self.testapp.get(
  1175. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/raw'.format(
  1176. content_id=content_id,
  1177. revision_id=revision_id,
  1178. ),
  1179. status=200
  1180. )
  1181. assert res.content_type == 'text/plain'
  1182. res = self.testapp.get(
  1183. '/api/v2/workspaces/1/files/{content_id}/revisions/{revision_id}/preview/jpg/256x256'.format(
  1184. content_id=content_id,
  1185. revision_id=revision_id,
  1186. ),
  1187. status=200
  1188. )
  1189. assert res.body != image.getvalue()
  1190. assert res.content_type == 'image/jpeg'
  1191. new_image = Image.open(io.BytesIO(res.body))
  1192. assert 256, 256 == new_image.size
  1193. def test_api__get_full_pdf_preview__ok__200__nominal_case(self) -> None:
  1194. """
  1195. get full pdf preview of a txt file
  1196. """
  1197. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1198. admin = dbsession.query(models.User) \
  1199. .filter(models.User.email == 'admin@admin.admin') \
  1200. .one()
  1201. workspace_api = WorkspaceApi(
  1202. current_user=admin,
  1203. session=dbsession,
  1204. config=self.app_config
  1205. )
  1206. content_api = ContentApi(
  1207. current_user=admin,
  1208. session=dbsession,
  1209. config=self.app_config
  1210. )
  1211. business_workspace = workspace_api.get_one(1)
  1212. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1213. test_file = content_api.create(
  1214. content_type=ContentType.File,
  1215. workspace=business_workspace,
  1216. parent=tool_folder,
  1217. label='Test file',
  1218. do_save=True,
  1219. do_notify=False,
  1220. )
  1221. with new_revision(
  1222. session=dbsession,
  1223. tm=transaction.manager,
  1224. content=test_file,
  1225. ):
  1226. test_file.file_extension = '.txt'
  1227. test_file.depot_file = FileIntent(
  1228. b'Test file',
  1229. 'Test_file.txt',
  1230. 'text/plain',
  1231. )
  1232. content_api.update_content(test_file, 'Test_file', '<p>description</p>')
  1233. dbsession.flush()
  1234. transaction.commit()
  1235. content_id = int(test_file.content_id)
  1236. self.testapp.authorization = (
  1237. 'Basic',
  1238. (
  1239. 'admin@admin.admin',
  1240. 'admin@admin.admin'
  1241. )
  1242. )
  1243. res = self.testapp.put(
  1244. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1245. upload_files=[
  1246. ('files', test_file.file_name, test_file.depot_file.file.read())
  1247. ],
  1248. status=204,
  1249. )
  1250. res = self.testapp.get(
  1251. '/api/v2/workspaces/1/files/{}/preview/pdf/full'.format(content_id), # nopep8
  1252. status=200
  1253. )
  1254. assert res.content_type == 'application/pdf'
  1255. def test_api__get_full_pdf_preview__err__400__png_UnavailablePreviewType(self) -> None:
  1256. """
  1257. get full pdf preview of a png image -> error UnavailablePreviewType
  1258. """
  1259. dbsession = get_tm_session(self.session_factory, transaction.manager)
  1260. admin = dbsession.query(models.User) \
  1261. .filter(models.User.email == 'admin@admin.admin') \
  1262. .one()
  1263. workspace_api = WorkspaceApi(
  1264. current_user=admin,
  1265. session=dbsession,
  1266. config=self.app_config
  1267. )
  1268. content_api = ContentApi(
  1269. current_user=admin,
  1270. session=dbsession,
  1271. config=self.app_config
  1272. )
  1273. business_workspace = workspace_api.get_one(1)
  1274. tool_folder = content_api.get_one(1, content_type=ContentType.Any)
  1275. test_file = content_api.create(
  1276. content_type=ContentType.File,
  1277. workspace=business_workspace,
  1278. parent=tool_folder,
  1279. label='Test file',
  1280. do_save=True,
  1281. do_notify=False,
  1282. )
  1283. dbsession.flush()
  1284. transaction.commit()
  1285. content_id = int(test_file.content_id)
  1286. image = create_test_image()
  1287. self.testapp.authorization = (
  1288. 'Basic',
  1289. (
  1290. 'admin@admin.admin',
  1291. 'admin@admin.admin'
  1292. )
  1293. )
  1294. res = self.testapp.put(
  1295. '/api/v2/workspaces/1/files/{}/raw'.format(content_id),
  1296. upload_files=[
  1297. ('files',image.name, image.getvalue())
  1298. ],
  1299. status=204,
  1300. )
  1301. res = self.testapp.get(
  1302. '/api/v2/workspaces/1/files/{}/preview/pdf/full'.format(content_id), # nopep8
  1303. status=400
  1304. )
  1305. class TestThreads(FunctionalTest):
  1306. """
  1307. Tests for /api/v2/workspaces/{workspace_id}/threads/{content_id}
  1308. endpoint
  1309. """
  1310. fixtures = [BaseFixture, ContentFixtures]
  1311. def test_api__get_thread__err_400__wrong_content_type(self) -> None:
  1312. """
  1313. Get one html document of a content
  1314. """
  1315. self.testapp.authorization = (
  1316. 'Basic',
  1317. (
  1318. 'admin@admin.admin',
  1319. 'admin@admin.admin'
  1320. )
  1321. )
  1322. res = self.testapp.get(
  1323. '/api/v2/workspaces/2/threads/6',
  1324. status=400
  1325. )
  1326. def test_api__get_thread__ok_200__nominal_case(self) -> None:
  1327. """
  1328. Get one html document of a content
  1329. """
  1330. self.testapp.authorization = (
  1331. 'Basic',
  1332. (
  1333. 'admin@admin.admin',
  1334. 'admin@admin.admin'
  1335. )
  1336. )
  1337. res = self.testapp.get(
  1338. '/api/v2/workspaces/2/threads/7',
  1339. status=200
  1340. ) # nopep8
  1341. content = res.json_body
  1342. assert content['content_type'] == 'thread'
  1343. assert content['content_id'] == 7
  1344. assert content['is_archived'] is False
  1345. assert content['is_deleted'] is False
  1346. assert content['label'] == 'Best Cakes?'
  1347. assert content['parent_id'] == 3
  1348. assert content['show_in_ui'] is True
  1349. assert content['slug'] == 'best-cakes'
  1350. assert content['status'] == 'open'
  1351. assert content['workspace_id'] == 2
  1352. assert content['current_revision_id'] == 26
  1353. # TODO - G.M - 2018-06-173 - check date format
  1354. assert content['created']
  1355. assert content['author']
  1356. assert content['author']['user_id'] == 1
  1357. assert content['author']['avatar_url'] is None
  1358. assert content['author']['public_name'] == 'Global manager'
  1359. # TODO - G.M - 2018-06-173 - check date format
  1360. assert content['modified']
  1361. assert content['last_modifier'] != content['author']
  1362. assert content['last_modifier']['user_id'] == 3
  1363. assert content['last_modifier']['public_name'] == 'Bob i.'
  1364. assert content['last_modifier']['avatar_url'] is None
  1365. assert content['raw_content'] == 'What is the best cake?' # nopep8
  1366. def test_api__get_thread__err_400__content_does_not_exist(self) -> None:
  1367. """
  1368. Get one thread (content 170 does not exist)
  1369. """
  1370. self.testapp.authorization = (
  1371. 'Basic',
  1372. (
  1373. 'admin@admin.admin',
  1374. 'admin@admin.admin'
  1375. )
  1376. )
  1377. res = self.testapp.get(
  1378. '/api/v2/workspaces/2/threads/170',
  1379. status=400
  1380. )
  1381. def test_api__get_thread__err_400__content_not_in_workspace(self) -> None:
  1382. """
  1383. Get one thread(content 7 is in workspace 2)
  1384. """
  1385. self.testapp.authorization = (
  1386. 'Basic',
  1387. (
  1388. 'admin@admin.admin',
  1389. 'admin@admin.admin'
  1390. )
  1391. )
  1392. res = self.testapp.get(
  1393. '/api/v2/workspaces/1/threads/7',
  1394. status=400
  1395. )
  1396. def test_api__get_thread__err_400__workspace_does_not_exist(self) -> None: # nopep8
  1397. """
  1398. Get one thread (Workspace 40 does not exist)
  1399. """
  1400. self.testapp.authorization = (
  1401. 'Basic',
  1402. (
  1403. 'admin@admin.admin',
  1404. 'admin@admin.admin'
  1405. )
  1406. )
  1407. res = self.testapp.get(
  1408. '/api/v2/workspaces/40/threads/7',
  1409. status=400
  1410. )
  1411. def test_api__get_thread__err_400__workspace_id_is_not_int(self) -> None: # nopep8
  1412. """
  1413. Get one thread, workspace id is not int
  1414. """
  1415. self.testapp.authorization = (
  1416. 'Basic',
  1417. (
  1418. 'admin@admin.admin',
  1419. 'admin@admin.admin'
  1420. )
  1421. )
  1422. res = self.testapp.get(
  1423. '/api/v2/workspaces/coucou/threads/7',
  1424. status=400
  1425. )
  1426. def test_api__get_thread__err_400_content_id_is_not_int(self) -> None: # nopep8
  1427. """
  1428. Get one thread, content id is not int
  1429. """
  1430. self.testapp.authorization = (
  1431. 'Basic',
  1432. (
  1433. 'admin@admin.admin',
  1434. 'admin@admin.admin'
  1435. )
  1436. )
  1437. res = self.testapp.get(
  1438. '/api/v2/workspaces/2/threads/coucou',
  1439. status=400
  1440. )
  1441. def test_api__update_thread__ok_200__nominal_case(self) -> None:
  1442. """
  1443. Update(put) thread
  1444. """
  1445. self.testapp.authorization = (
  1446. 'Basic',
  1447. (
  1448. 'admin@admin.admin',
  1449. 'admin@admin.admin'
  1450. )
  1451. )
  1452. params = {
  1453. 'label': 'My New label',
  1454. 'raw_content': '<p> Le nouveau contenu </p>',
  1455. }
  1456. res = self.testapp.put_json(
  1457. '/api/v2/workspaces/2/threads/7',
  1458. params=params,
  1459. status=200
  1460. )
  1461. content = res.json_body
  1462. assert content['content_type'] == 'thread'
  1463. assert content['content_id'] == 7
  1464. assert content['is_archived'] is False
  1465. assert content['is_deleted'] is False
  1466. assert content['label'] == 'My New label'
  1467. assert content['parent_id'] == 3
  1468. assert content['show_in_ui'] is True
  1469. assert content['slug'] == 'my-new-label'
  1470. assert content['status'] == 'open'
  1471. assert content['workspace_id'] == 2
  1472. assert content['current_revision_id'] == 28
  1473. # TODO - G.M - 2018-06-173 - check date format
  1474. assert content['created']
  1475. assert content['author']
  1476. assert content['author']['user_id'] == 1
  1477. assert content['author']['avatar_url'] is None
  1478. assert content['author']['public_name'] == 'Global manager'
  1479. # TODO - G.M - 2018-06-173 - check date format
  1480. assert content['modified']
  1481. assert content['last_modifier'] == content['author']
  1482. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1483. res = self.testapp.get(
  1484. '/api/v2/workspaces/2/threads/7',
  1485. status=200
  1486. ) # nopep8
  1487. content = res.json_body
  1488. assert content['content_type'] == 'thread'
  1489. assert content['content_id'] == 7
  1490. assert content['is_archived'] is False
  1491. assert content['is_deleted'] is False
  1492. assert content['label'] == 'My New label'
  1493. assert content['parent_id'] == 3
  1494. assert content['show_in_ui'] is True
  1495. assert content['slug'] == 'my-new-label'
  1496. assert content['status'] == 'open'
  1497. assert content['workspace_id'] == 2
  1498. assert content['current_revision_id'] == 28
  1499. # TODO - G.M - 2018-06-173 - check date format
  1500. assert content['created']
  1501. assert content['author']
  1502. assert content['author']['user_id'] == 1
  1503. assert content['author']['avatar_url'] is None
  1504. assert content['author']['public_name'] == 'Global manager'
  1505. # TODO - G.M - 2018-06-173 - check date format
  1506. assert content['modified']
  1507. assert content['last_modifier'] == content['author']
  1508. assert content['raw_content'] == '<p> Le nouveau contenu </p>'
  1509. def test_api__update_thread__err_400__empty_label(self) -> None:
  1510. """
  1511. Update(put) thread
  1512. """
  1513. self.testapp.authorization = (
  1514. 'Basic',
  1515. (
  1516. 'admin@admin.admin',
  1517. 'admin@admin.admin'
  1518. )
  1519. )
  1520. params = {
  1521. 'label': '',
  1522. 'raw_content': '<p> Le nouveau contenu </p>',
  1523. }
  1524. res = self.testapp.put_json(
  1525. '/api/v2/workspaces/2/threads/7',
  1526. params=params,
  1527. status=400
  1528. )
  1529. def test_api__get_thread_revisions__ok_200__nominal_case(
  1530. self
  1531. ) -> None:
  1532. """
  1533. Get threads revisions
  1534. """
  1535. self.testapp.authorization = (
  1536. 'Basic',
  1537. (
  1538. 'admin@admin.admin',
  1539. 'admin@admin.admin'
  1540. )
  1541. )
  1542. res = self.testapp.get(
  1543. '/api/v2/workspaces/2/threads/7/revisions',
  1544. status=200
  1545. )
  1546. revisions = res.json_body
  1547. assert len(revisions) == 2
  1548. revision = revisions[0]
  1549. assert revision['content_type'] == 'thread'
  1550. assert revision['content_id'] == 7
  1551. assert revision['is_archived'] is False
  1552. assert revision['is_deleted'] is False
  1553. assert revision['label'] == 'Best Cake'
  1554. assert revision['parent_id'] == 3
  1555. assert revision['show_in_ui'] is True
  1556. assert revision['slug'] == 'best-cake'
  1557. assert revision['status'] == 'open'
  1558. assert revision['workspace_id'] == 2
  1559. assert revision['revision_id'] == 8
  1560. assert revision['sub_content_types']
  1561. assert revision['comment_ids'] == [18, 19, 20]
  1562. # TODO - G.M - 2018-06-173 - check date format
  1563. assert revision['created']
  1564. assert revision['author']
  1565. assert revision['author']['user_id'] == 1
  1566. assert revision['author']['avatar_url'] is None
  1567. assert revision['author']['public_name'] == 'Global manager'
  1568. revision = revisions[1]
  1569. assert revision['content_type'] == 'thread'
  1570. assert revision['content_id'] == 7
  1571. assert revision['is_archived'] is False
  1572. assert revision['is_deleted'] is False
  1573. assert revision['label'] == 'Best Cakes?'
  1574. assert revision['parent_id'] == 3
  1575. assert revision['show_in_ui'] is True
  1576. assert revision['slug'] == 'best-cakes'
  1577. assert revision['status'] == 'open'
  1578. assert revision['workspace_id'] == 2
  1579. assert revision['revision_id'] == 26
  1580. assert revision['sub_content_types']
  1581. assert revision['comment_ids'] == []
  1582. # TODO - G.M - 2018-06-173 - check date format
  1583. assert revision['created']
  1584. assert revision['author']
  1585. assert revision['author']['user_id'] == 3
  1586. assert revision['author']['avatar_url'] is None
  1587. assert revision['author']['public_name'] == 'Bob i.'
  1588. def test_api__set_thread_status__ok_200__nominal_case(self) -> None:
  1589. """
  1590. Set thread status
  1591. """
  1592. self.testapp.authorization = (
  1593. 'Basic',
  1594. (
  1595. 'admin@admin.admin',
  1596. 'admin@admin.admin'
  1597. )
  1598. )
  1599. params = {
  1600. 'status': 'closed-deprecated',
  1601. }
  1602. # before
  1603. res = self.testapp.get(
  1604. '/api/v2/workspaces/2/threads/7',
  1605. status=200
  1606. ) # nopep8
  1607. content = res.json_body
  1608. assert content['content_type'] == 'thread'
  1609. assert content['content_id'] == 7
  1610. assert content['status'] == 'open'
  1611. # set status
  1612. res = self.testapp.put_json(
  1613. '/api/v2/workspaces/2/threads/7/status',
  1614. params=params,
  1615. status=204
  1616. )
  1617. # after
  1618. res = self.testapp.get(
  1619. '/api/v2/workspaces/2/threads/7',
  1620. status=200
  1621. ) # nopep8
  1622. content = res.json_body
  1623. assert content['content_type'] == 'thread'
  1624. assert content['content_id'] == 7
  1625. assert content['status'] == 'closed-deprecated'
  1626. def test_api__set_thread_status__ok_400__wrong_status(self) -> None:
  1627. """
  1628. Set thread status
  1629. """
  1630. self.testapp.authorization = (
  1631. 'Basic',
  1632. (
  1633. 'admin@admin.admin',
  1634. 'admin@admin.admin'
  1635. )
  1636. )
  1637. params = {
  1638. 'status': 'unexistant-status',
  1639. }
  1640. res = self.testapp.put_json(
  1641. '/api/v2/workspaces/2/threads/7/status',
  1642. params=params,
  1643. status=400
  1644. )