test_content_api.py 69KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315
  1. # -*- coding: utf-8 -*-
  2. import transaction
  3. import pytest
  4. from tracim.config import CFG
  5. from tracim.lib.core.content import compare_content_for_sorting_by_type_and_name
  6. from tracim.lib.core.content import ContentApi
  7. # TODO - G.M - 28-03-2018 - [GroupApi] Re-enable GroupApi
  8. from tracim.lib.core.group import GroupApi
  9. from tracim.lib.core.user import UserApi
  10. from tracim.exceptions import SameValueError
  11. # TODO - G.M - 28-03-2018 - [RoleApi] Re-enable RoleApi
  12. from tracim.lib.core.workspace import RoleApi
  13. # TODO - G.M - 28-03-2018 - [WorkspaceApi] Re-enable WorkspaceApi
  14. from tracim.lib.core.workspace import WorkspaceApi
  15. from tracim.models.revision_protection import new_revision
  16. from tracim.models.auth import User
  17. from tracim.models.auth import Group
  18. from tracim.models.data import ActionDescription
  19. from tracim.models.data import ContentRevisionRO
  20. from tracim.models.data import Workspace
  21. from tracim.models.data import Content
  22. from tracim.models.data import ContentType
  23. from tracim.models.data import UserRoleInWorkspace
  24. from tracim.fixtures.users_and_groups import Test as FixtureTest
  25. from tracim.tests import DefaultTest
  26. from tracim.tests import eq_
  27. class TestContentApi(DefaultTest):
  28. def test_compare_content_for_sorting_by_type(self):
  29. c1 = Content()
  30. c1.label = ''
  31. c1.type = 'file'
  32. c2 = Content()
  33. c2.label = ''
  34. c2.type = 'folder'
  35. c11 = c1
  36. eq_(1, compare_content_for_sorting_by_type_and_name(c1, c2))
  37. eq_(-1, compare_content_for_sorting_by_type_and_name(c2, c1))
  38. eq_(0, compare_content_for_sorting_by_type_and_name(c1, c11))
  39. def test_compare_content_for_sorting_by_label(self):
  40. c1 = Content()
  41. c1.label = 'bbb'
  42. c1.type = 'file'
  43. c2 = Content()
  44. c2.label = 'aaa'
  45. c2.type = 'file'
  46. c11 = c1
  47. eq_(1, compare_content_for_sorting_by_type_and_name(c1, c2))
  48. eq_(-1, compare_content_for_sorting_by_type_and_name(c2, c1))
  49. eq_(0, compare_content_for_sorting_by_type_and_name(c1, c11))
  50. def test_sort_by_label_or_filename(self):
  51. c1 = Content()
  52. c1.label = 'ABCD'
  53. c1.type = 'file'
  54. c2 = Content()
  55. c2.label = ''
  56. c2.type = 'file'
  57. c2.file_name = 'AABC'
  58. c3 = Content()
  59. c3.label = 'BCDE'
  60. c3.type = 'file'
  61. items = [c1, c2, c3]
  62. sorteds = ContentApi.sort_content(items)
  63. eq_(sorteds[0], c2)
  64. eq_(sorteds[1], c1)
  65. eq_(sorteds[2], c3)
  66. def test_sort_by_content_type(self):
  67. c1 = Content()
  68. c1.label = 'AAAA'
  69. c1.type = 'file'
  70. c2 = Content()
  71. c2.label = 'BBBB'
  72. c2.type = 'folder'
  73. items = [c1, c2]
  74. sorteds = ContentApi.sort_content(items)
  75. eq_(sorteds[0], c2,
  76. 'value is {} instead of {}'.format(sorteds[0].content_id,
  77. c2.content_id))
  78. eq_(sorteds[1], c1,
  79. 'value is {} instead of {}'.format(sorteds[1].content_id,
  80. c1.content_id))
  81. def test_delete(self):
  82. uapi = UserApi(
  83. session=self.session,
  84. config=self.app_config,
  85. current_user=None,
  86. )
  87. group_api = GroupApi(
  88. current_user=None,
  89. session=self.session,
  90. config=self.app_config,
  91. )
  92. groups = [group_api.get_one(Group.TIM_USER),
  93. group_api.get_one(Group.TIM_MANAGER),
  94. group_api.get_one(Group.TIM_ADMIN)]
  95. user = uapi.create_minimal_user(email='this.is@user',
  96. groups=groups, save_now=True)
  97. workspace = WorkspaceApi(
  98. current_user=user,
  99. session=self.session,
  100. config=self.app_config,
  101. ).create_workspace('test workspace', save_now=True)
  102. api = ContentApi(
  103. current_user=user,
  104. session=self.session,
  105. config=self.app_config,
  106. )
  107. item = api.create(
  108. content_type=ContentType.Folder,
  109. workspace=workspace,
  110. parent=None,
  111. label='not_deleted',
  112. do_save=True
  113. )
  114. item2 = api.create(
  115. content_type=ContentType.Folder,
  116. workspace=workspace,
  117. parent=None,
  118. label='to_delete',
  119. do_save=True
  120. )
  121. uid = user.user_id
  122. wid = workspace.workspace_id
  123. transaction.commit()
  124. # Refresh instances after commit
  125. user = uapi.get_one(uid)
  126. workspace_api = WorkspaceApi(
  127. current_user=user,
  128. session=self.session,
  129. config=self.app_config
  130. )
  131. workspace = workspace_api.get_one(wid)
  132. api = ContentApi(
  133. current_user=user,
  134. session=self.session,
  135. config=self.app_config,
  136. )
  137. items = api.get_all(None, ContentType.Any, workspace)
  138. eq_(2, len(items))
  139. items = api.get_all(None, ContentType.Any, workspace)
  140. with new_revision(
  141. session=self.session,
  142. tm=transaction.manager,
  143. content=items[0]
  144. ):
  145. api.delete(items[0])
  146. transaction.commit()
  147. # Refresh instances after commit
  148. user = uapi.get_one(uid)
  149. workspace_api = WorkspaceApi(
  150. current_user=user,
  151. session=self.session,
  152. config=self.app_config
  153. )
  154. workspace = workspace_api.get_one(wid)
  155. api = ContentApi(
  156. current_user=user,
  157. session=self.session,
  158. config=self.app_config,
  159. )
  160. items = api.get_all(None, ContentType.Any, workspace)
  161. eq_(1, len(items))
  162. transaction.commit()
  163. # Test that the item is still available if "show deleted" is activated
  164. # Refresh instances after commit
  165. user = uapi.get_one(uid)
  166. workspace_api = WorkspaceApi(
  167. current_user=user,
  168. session=self.session,
  169. config=self.app_config,
  170. )
  171. api = ContentApi(
  172. current_user=user,
  173. session=self.session,
  174. config=self.app_config,
  175. show_deleted=True,
  176. )
  177. items = api.get_all(None, ContentType.Any, workspace)
  178. eq_(2, len(items))
  179. def test_archive(self):
  180. uapi = UserApi(
  181. session=self.session,
  182. config=self.app_config,
  183. current_user=None,
  184. )
  185. group_api = GroupApi(
  186. current_user=None,
  187. session=self.session,
  188. config=self.app_config,
  189. )
  190. groups = [group_api.get_one(Group.TIM_USER),
  191. group_api.get_one(Group.TIM_MANAGER),
  192. group_api.get_one(Group.TIM_ADMIN)]
  193. user = uapi.create_minimal_user(
  194. email='this.is@user',
  195. groups=groups,
  196. save_now=True,
  197. )
  198. workspace_api = WorkspaceApi(
  199. current_user=user,
  200. session=self.session,
  201. config=self.app_config,
  202. )
  203. workspace = workspace_api.create_workspace(
  204. 'test workspace',
  205. save_now=True
  206. )
  207. api = ContentApi(
  208. current_user=user,
  209. session=self.session,
  210. config=self.app_config,
  211. )
  212. item = api.create(
  213. content_type=ContentType.Folder,
  214. workspace=workspace,
  215. parent=None,
  216. label='not_archived',
  217. do_save=True
  218. )
  219. item2 = api.create(
  220. content_type=ContentType.Folder,
  221. workspace=workspace,
  222. parent=None,
  223. label='to_archive',
  224. do_save=True
  225. )
  226. uid = user.user_id
  227. wid = workspace.workspace_id
  228. transaction.commit()
  229. # Refresh instances after commit
  230. user = uapi.get_one(uid)
  231. workspace_api = WorkspaceApi(
  232. current_user=user,
  233. session=self.session,
  234. config=self.app_config,
  235. )
  236. api = ContentApi(
  237. session=self.session,
  238. current_user=user,
  239. config=self.app_config,
  240. )
  241. items = api.get_all(None, ContentType.Any, workspace)
  242. eq_(2, len(items))
  243. items = api.get_all(None, ContentType.Any, workspace)
  244. with new_revision(
  245. session=self.session,
  246. tm=transaction.manager,
  247. content=items[0],
  248. ):
  249. api.archive(items[0])
  250. transaction.commit()
  251. # Refresh instances after commit
  252. user = uapi.get_one(uid)
  253. workspace_api = WorkspaceApi(
  254. current_user=user,
  255. session=self.session,
  256. config=self.app_config,
  257. )
  258. workspace = workspace_api.get_one(wid)
  259. api = ContentApi(
  260. current_user=user,
  261. session=self.session,
  262. config=self.app_config,
  263. )
  264. items = api.get_all(None, ContentType.Any, workspace)
  265. eq_(1, len(items))
  266. transaction.commit()
  267. # Refresh instances after commit
  268. user = uapi.get_one(uid)
  269. workspace_api = WorkspaceApi(
  270. current_user=user,
  271. session=self.session,
  272. config=self.app_config,
  273. )
  274. workspace = workspace_api.get_one(wid)
  275. api = ContentApi(
  276. current_user=user,
  277. session=self.session,
  278. config=self.app_config,
  279. )
  280. # Test that the item is still available if "show deleted" is activated
  281. api = ContentApi(
  282. current_user=None,
  283. session=self.session,
  284. config=self.app_config,
  285. show_archived=True,
  286. )
  287. items = api.get_all(None, ContentType.Any, workspace)
  288. eq_(2, len(items))
  289. def test_get_all_with_filter(self):
  290. uapi = UserApi(
  291. session=self.session,
  292. config=self.app_config,
  293. current_user=None,
  294. )
  295. group_api = GroupApi(
  296. current_user=None,
  297. session=self.session,
  298. config=self.app_config,
  299. )
  300. groups = [group_api.get_one(Group.TIM_USER),
  301. group_api.get_one(Group.TIM_MANAGER),
  302. group_api.get_one(Group.TIM_ADMIN)]
  303. user = uapi.create_minimal_user(
  304. email='this.is@user',
  305. groups=groups,
  306. save_now=True
  307. )
  308. workspace = WorkspaceApi(
  309. current_user=user,
  310. session=self.session,
  311. config=self.app_config,
  312. ).create_workspace(
  313. 'test workspace',
  314. save_now=True
  315. )
  316. api = ContentApi(
  317. current_user=user,
  318. session=self.session,
  319. config=self.app_config,
  320. )
  321. item = api.create(
  322. content_type=ContentType.Folder,
  323. workspace=workspace,
  324. parent=None,
  325. label='thefolder',
  326. do_save=True
  327. )
  328. item2 = api.create(
  329. content_type=ContentType.File,
  330. workspace=workspace,
  331. parent=None,
  332. label='thefile',
  333. do_save=True
  334. )
  335. uid = user.user_id
  336. wid = workspace.workspace_id
  337. transaction.commit()
  338. # Refresh instances after commit
  339. user = uapi.get_one(uid)
  340. workspace_api = WorkspaceApi(
  341. current_user=user,
  342. session=self.session,
  343. config=self.app_config,
  344. )
  345. workspace = workspace_api.get_one(wid)
  346. api = ContentApi(
  347. current_user=user,
  348. session=self.session,
  349. config=self.app_config,
  350. )
  351. items = api.get_all(None, ContentType.Any, workspace)
  352. eq_(2, len(items))
  353. items2 = api.get_all(None, ContentType.File, workspace)
  354. eq_(1, len(items2))
  355. eq_('thefile', items2[0].label)
  356. items3 = api.get_all(None, ContentType.Folder, workspace)
  357. eq_(1, len(items3))
  358. eq_('thefolder', items3[0].label)
  359. def test_get_all_with_parent_id(self):
  360. uapi = UserApi(
  361. session=self.session,
  362. config=self.app_config,
  363. current_user=None,
  364. )
  365. group_api = GroupApi(
  366. current_user=None,
  367. session=self.session,
  368. config=self.app_config
  369. )
  370. groups = [group_api.get_one(Group.TIM_USER),
  371. group_api.get_one(Group.TIM_MANAGER),
  372. group_api.get_one(Group.TIM_ADMIN)]
  373. user = uapi.create_minimal_user(email='this.is@user',
  374. groups=groups, save_now=True)
  375. workspace = WorkspaceApi(
  376. current_user=user,
  377. session=self.session,
  378. config=self.app_config
  379. ).create_workspace('test workspace', save_now=True)
  380. api = ContentApi(
  381. current_user=user,
  382. session=self.session,
  383. config=self.app_config,
  384. )
  385. item = api.create(
  386. ContentType.Folder,
  387. workspace,
  388. None,
  389. 'parent',
  390. do_save=True,
  391. )
  392. item2 = api.create(
  393. ContentType.File,
  394. workspace,
  395. item,
  396. 'file1',
  397. do_save=True,
  398. )
  399. item3 = api.create(
  400. ContentType.File,
  401. workspace,
  402. None,
  403. 'file2',
  404. do_save=True,
  405. )
  406. parent_id = item.content_id
  407. child_id = item2.content_id
  408. uid = user.user_id
  409. wid = workspace.workspace_id
  410. transaction.commit()
  411. # Refresh instances after commit
  412. user = uapi.get_one(uid)
  413. workspace_api = WorkspaceApi(
  414. current_user=user,
  415. session=self.session,
  416. config=self.app_config,
  417. )
  418. workspace = workspace_api.get_one(wid)
  419. api = ContentApi(
  420. current_user=user,
  421. session=self.session,
  422. config=self.app_config,
  423. )
  424. items = api.get_all(None, ContentType.Any, workspace)
  425. eq_(3, len(items))
  426. items2 = api.get_all(parent_id, ContentType.File, workspace)
  427. eq_(1, len(items2))
  428. eq_(child_id, items2[0].content_id)
  429. def test_set_status_unknown_status(self):
  430. uapi = UserApi(
  431. session=self.session,
  432. config=self.app_config,
  433. current_user=None,
  434. )
  435. group_api = GroupApi(
  436. current_user=None,
  437. session=self.session,
  438. config=self.app_config,
  439. )
  440. groups = [group_api.get_one(Group.TIM_USER),
  441. group_api.get_one(Group.TIM_MANAGER),
  442. group_api.get_one(Group.TIM_ADMIN)]
  443. user = uapi.create_minimal_user(email='this.is@user',
  444. groups=groups, save_now=True)
  445. workspace = WorkspaceApi(
  446. current_user=user,
  447. session=self.session,
  448. config=self.app_config,
  449. ).create_workspace(
  450. 'test workspace',
  451. save_now=True
  452. )
  453. api = ContentApi(
  454. current_user=user,
  455. session=self.session,
  456. config=self.app_config,
  457. )
  458. c = api.create(ContentType.Folder, workspace, None, 'parent', '', True)
  459. with new_revision(
  460. session=self.session,
  461. tm=transaction.manager,
  462. content=c,
  463. ):
  464. with pytest.raises(ValueError):
  465. api.set_status(c, 'unknown-status')
  466. def test_set_status_ok(self):
  467. uapi = UserApi(
  468. session=self.session,
  469. config=self.app_config,
  470. current_user=None,
  471. )
  472. group_api = GroupApi(
  473. current_user=None,
  474. session=self.session,
  475. config=self.app_config,
  476. )
  477. groups = [group_api.get_one(Group.TIM_USER),
  478. group_api.get_one(Group.TIM_MANAGER),
  479. group_api.get_one(Group.TIM_ADMIN)]
  480. user = uapi.create_minimal_user(email='this.is@user',
  481. groups=groups, save_now=True)
  482. workspace = WorkspaceApi(
  483. current_user=user,
  484. session=self.session,
  485. config=self.app_config,
  486. ).create_workspace(
  487. 'test workspace',
  488. save_now=True
  489. )
  490. api = ContentApi(
  491. current_user=user,
  492. session=self.session,
  493. config=self.app_config,
  494. )
  495. c = api.create(ContentType.Folder, workspace, None, 'parent', '', True)
  496. with new_revision(
  497. session=self.session,
  498. tm=transaction.manager,
  499. content=c,
  500. ):
  501. for new_status in ['open', 'closed-validated', 'closed-unvalidated',
  502. 'closed-deprecated']:
  503. api.set_status(c, new_status)
  504. eq_(new_status, c.status)
  505. eq_(ActionDescription.STATUS_UPDATE, c.revision_type)
  506. def test_create_comment_ok(self):
  507. uapi = UserApi(
  508. session=self.session,
  509. config=self.app_config,
  510. current_user=None,
  511. )
  512. group_api = GroupApi(
  513. current_user=None,
  514. session=self.session,
  515. config=self.config,
  516. )
  517. groups = [group_api.get_one(Group.TIM_USER),
  518. group_api.get_one(Group.TIM_MANAGER),
  519. group_api.get_one(Group.TIM_ADMIN)]
  520. user = uapi.create_minimal_user(email='this.is@user',
  521. groups=groups, save_now=True)
  522. workspace = WorkspaceApi(
  523. current_user=user,
  524. session=self.session,
  525. config=self.app_config,
  526. ).create_workspace(
  527. 'test workspace',
  528. save_now=True
  529. )
  530. api = ContentApi(
  531. current_user=user,
  532. session=self.session,
  533. config=self.app_config,
  534. )
  535. p = api.create(ContentType.Page, workspace, None, 'this_is_a_page')
  536. c = api.create_comment(workspace, p, 'this is the comment', True)
  537. eq_(Content, c.__class__)
  538. eq_(p.content_id, c.parent_id)
  539. eq_(user, c.owner)
  540. eq_(workspace, c.workspace)
  541. eq_(ContentType.Comment, c.type)
  542. eq_('this is the comment', c.description)
  543. eq_('', c.label)
  544. eq_(ActionDescription.COMMENT, c.revision_type)
  545. def test_unit_copy_file_different_label_different_parent_ok(self):
  546. uapi = UserApi(
  547. session=self.session,
  548. config=self.app_config,
  549. current_user=None,
  550. )
  551. group_api = GroupApi(
  552. current_user=None,
  553. session=self.session,
  554. config=self.app_config
  555. )
  556. groups = [group_api.get_one(Group.TIM_USER),
  557. group_api.get_one(Group.TIM_MANAGER),
  558. group_api.get_one(Group.TIM_ADMIN)]
  559. user = uapi.create_minimal_user(
  560. email='user1@user',
  561. groups=groups,
  562. save_now=True
  563. )
  564. user2 = uapi.create_minimal_user(
  565. email='user2@user',
  566. groups=groups,
  567. save_now=True
  568. )
  569. workspace = WorkspaceApi(
  570. current_user=user,
  571. session=self.session,
  572. config=self.app_config,
  573. ).create_workspace(
  574. 'test workspace',
  575. save_now=True
  576. )
  577. RoleApi(
  578. current_user=user,
  579. session=self.session,
  580. config=self.app_config,
  581. ).create_one(
  582. user2,
  583. workspace,
  584. UserRoleInWorkspace.WORKSPACE_MANAGER,
  585. with_notif=False
  586. )
  587. api = ContentApi(
  588. current_user=user,
  589. session=self.session,
  590. config=self.app_config,
  591. )
  592. foldera = api.create(
  593. ContentType.Folder,
  594. workspace,
  595. None,
  596. 'folder a',
  597. '',
  598. True
  599. )
  600. with self.session.no_autoflush:
  601. text_file = api.create(
  602. content_type=ContentType.File,
  603. workspace=workspace,
  604. parent=foldera,
  605. label='test_file',
  606. do_save=False,
  607. )
  608. api.update_file_data(
  609. text_file,
  610. 'test_file',
  611. 'text/plain',
  612. b'test_content'
  613. )
  614. api.save(text_file, ActionDescription.CREATION)
  615. api2 = ContentApi(
  616. current_user=user2,
  617. session=self.session,
  618. config=self.app_config,
  619. )
  620. workspace2 = WorkspaceApi(
  621. current_user=user2,
  622. session=self.session,
  623. config=self.app_config,
  624. ).create_workspace(
  625. 'test workspace2',
  626. save_now=True
  627. )
  628. folderb = api2.create(
  629. ContentType.Folder,
  630. workspace2,
  631. None,
  632. 'folder b',
  633. '',
  634. True
  635. )
  636. api2.copy(
  637. item=text_file,
  638. new_parent=folderb,
  639. new_label='test_file_copy'
  640. )
  641. transaction.commit()
  642. text_file_copy = api2.get_one_by_label_and_parent(
  643. 'test_file_copy',
  644. folderb,
  645. )
  646. assert text_file != text_file_copy
  647. assert text_file_copy.content_id != text_file.content_id
  648. assert text_file_copy.workspace_id == workspace2.workspace_id
  649. assert text_file_copy.depot_file.file.read() == text_file.depot_file.file.read() # nopep8
  650. assert text_file_copy.depot_file.path != text_file.depot_file.path
  651. assert text_file_copy.label == 'test_file_copy'
  652. assert text_file_copy.type == text_file.type
  653. assert text_file_copy.parent.content_id == folderb.content_id
  654. assert text_file_copy.owner.user_id == user.user_id
  655. assert text_file_copy.description == text_file.description
  656. assert text_file_copy.file_extension == text_file.file_extension
  657. assert text_file_copy.file_mimetype == text_file.file_mimetype
  658. assert text_file_copy.revision_type == ActionDescription.COPY
  659. assert len(text_file_copy.revisions) == len(text_file.revisions) + 1
  660. def test_unit_copy_file__same_label_different_parent_ok(self):
  661. uapi = UserApi(
  662. session=self.session,
  663. config=self.app_config,
  664. current_user=None,
  665. )
  666. group_api = GroupApi(
  667. current_user=None,
  668. session=self.session,
  669. config=self.app_config,
  670. )
  671. groups = [group_api.get_one(Group.TIM_USER),
  672. group_api.get_one(Group.TIM_MANAGER),
  673. group_api.get_one(Group.TIM_ADMIN)]
  674. user = uapi.create_minimal_user(
  675. email='user1@user',
  676. groups=groups,
  677. save_now=True
  678. )
  679. user2 = uapi.create_minimal_user(
  680. email='user2@user',
  681. groups=groups,
  682. save_now=True
  683. )
  684. workspace = WorkspaceApi(
  685. current_user=user,
  686. session=self.session,
  687. config=self.app_config,
  688. ).create_workspace(
  689. 'test workspace',
  690. save_now=True
  691. )
  692. RoleApi(
  693. current_user=user,
  694. session=self.session,
  695. config=self.app_config,
  696. ).create_one(
  697. user2,
  698. workspace,
  699. UserRoleInWorkspace.WORKSPACE_MANAGER,
  700. with_notif=False
  701. )
  702. api = ContentApi(
  703. current_user=user,
  704. session=self.session,
  705. config=self.app_config,
  706. )
  707. foldera = api.create(
  708. ContentType.Folder,
  709. workspace,
  710. None,
  711. 'folder a',
  712. '',
  713. True
  714. )
  715. with self.session.no_autoflush:
  716. text_file = api.create(
  717. content_type=ContentType.File,
  718. workspace=workspace,
  719. parent=foldera,
  720. label='test_file',
  721. do_save=False,
  722. )
  723. api.update_file_data(
  724. text_file,
  725. 'test_file',
  726. 'text/plain',
  727. b'test_content'
  728. )
  729. api.save(text_file, ActionDescription.CREATION)
  730. api2 = ContentApi(
  731. current_user=user2,
  732. session=self.session,
  733. config=self.app_config,
  734. )
  735. workspace2 = WorkspaceApi(
  736. current_user=user2,
  737. session=self.session,
  738. config=self.app_config,
  739. ).create_workspace(
  740. 'test workspace2',
  741. save_now=True
  742. )
  743. folderb = api2.create(
  744. ContentType.Folder,
  745. workspace2,
  746. None,
  747. 'folder b',
  748. '',
  749. True
  750. )
  751. api2.copy(
  752. item=text_file,
  753. new_parent=folderb,
  754. )
  755. transaction.commit()
  756. text_file_copy = api2.get_one_by_label_and_parent(
  757. 'test_file',
  758. folderb,
  759. )
  760. assert text_file != text_file_copy
  761. assert text_file_copy.content_id != text_file.content_id
  762. assert text_file_copy.workspace_id == workspace2.workspace_id
  763. assert text_file_copy.depot_file.file.read() == text_file.depot_file.file.read() # nopep8
  764. assert text_file_copy.depot_file.path != text_file.depot_file.path
  765. assert text_file_copy.label == text_file.label
  766. assert text_file_copy.type == text_file.type
  767. assert text_file_copy.parent.content_id == folderb.content_id
  768. assert text_file_copy.owner.user_id == user.user_id
  769. assert text_file_copy.description == text_file.description
  770. assert text_file_copy.file_extension == text_file.file_extension
  771. assert text_file_copy.file_mimetype == text_file.file_mimetype
  772. assert text_file_copy.revision_type == ActionDescription.COPY
  773. assert len(text_file_copy.revisions) == len(text_file.revisions) + 1
  774. def test_unit_copy_file_different_label_same_parent_ok(self):
  775. uapi = UserApi(
  776. session=self.session,
  777. config=self.app_config,
  778. current_user=None,
  779. )
  780. group_api = GroupApi(
  781. current_user=None,
  782. session=self.session,
  783. config=self.app_config,
  784. )
  785. groups = [group_api.get_one(Group.TIM_USER),
  786. group_api.get_one(Group.TIM_MANAGER),
  787. group_api.get_one(Group.TIM_ADMIN)]
  788. user = uapi.create_minimal_user(
  789. email='user1@user',
  790. groups=groups,
  791. save_now=True,
  792. )
  793. user2 = uapi.create_minimal_user(
  794. email='user2@user',
  795. groups=groups,
  796. save_now=True
  797. )
  798. workspace = WorkspaceApi(
  799. current_user=user,
  800. session=self.session,
  801. config=self.app_config,
  802. ).create_workspace(
  803. 'test workspace',
  804. save_now=True
  805. )
  806. RoleApi(
  807. current_user=user,
  808. session=self.session,
  809. config=self.app_config,
  810. ).create_one(
  811. user2, workspace,
  812. UserRoleInWorkspace.WORKSPACE_MANAGER,
  813. with_notif=False
  814. )
  815. api = ContentApi(
  816. current_user=user,
  817. session=self.session,
  818. config=self.app_config,
  819. )
  820. foldera = api.create(
  821. ContentType.Folder,
  822. workspace,
  823. None,
  824. 'folder a',
  825. '',
  826. True
  827. )
  828. with self.session.no_autoflush:
  829. text_file = api.create(
  830. content_type=ContentType.File,
  831. workspace=workspace,
  832. parent=foldera,
  833. label='test_file',
  834. do_save=False,
  835. )
  836. api.update_file_data(
  837. text_file,
  838. 'test_file',
  839. 'text/plain',
  840. b'test_content'
  841. )
  842. api.save(
  843. text_file,
  844. ActionDescription.CREATION
  845. )
  846. api2 = ContentApi(
  847. current_user=user2,
  848. session=self.session,
  849. config=self.app_config,
  850. )
  851. api2.copy(
  852. item=text_file,
  853. new_label='test_file_copy'
  854. )
  855. transaction.commit()
  856. text_file_copy = api2.get_one_by_label_and_parent(
  857. 'test_file_copy',
  858. foldera,
  859. )
  860. assert text_file != text_file_copy
  861. assert text_file_copy.content_id != text_file.content_id
  862. assert text_file_copy.workspace_id == workspace.workspace_id
  863. assert text_file_copy.depot_file.file.read() == text_file.depot_file.file.read() # nopep8
  864. assert text_file_copy.depot_file.path != text_file.depot_file.path
  865. assert text_file_copy.label == 'test_file_copy'
  866. assert text_file_copy.type == text_file.type
  867. assert text_file_copy.parent.content_id == foldera.content_id
  868. assert text_file_copy.owner.user_id == user.user_id
  869. assert text_file_copy.description == text_file.description
  870. assert text_file_copy.file_extension == text_file.file_extension
  871. assert text_file_copy.file_mimetype == text_file.file_mimetype
  872. assert text_file_copy.revision_type == ActionDescription.COPY
  873. assert len(text_file_copy.revisions) == len(text_file.revisions) + 1
  874. def test_mark_read__workspace(self):
  875. uapi = UserApi(
  876. session=self.session,
  877. config=self.app_config,
  878. current_user=None,
  879. )
  880. group_api = GroupApi(
  881. current_user=None,
  882. session=self.session,
  883. config=self.app_config,
  884. )
  885. groups = [group_api.get_one(Group.TIM_USER),
  886. group_api.get_one(Group.TIM_MANAGER),
  887. group_api.get_one(Group.TIM_ADMIN)]
  888. user_a = uapi.create_minimal_user(email='this.is@user',
  889. groups=groups, save_now=True)
  890. user_b = uapi.create_minimal_user(email='this.is@another.user',
  891. groups=groups, save_now=True)
  892. wapi = WorkspaceApi(
  893. current_user=user_a,
  894. session=self.session,
  895. config=self.app_config,
  896. )
  897. workspace1 = wapi.create_workspace(
  898. 'test workspace n°1',
  899. save_now=True)
  900. workspace2 = wapi.create_workspace(
  901. 'test workspace n°2',
  902. save_now=True)
  903. role_api1 = RoleApi(
  904. current_user=user_a,
  905. session=self.session,
  906. config=self.app_config,
  907. )
  908. role_api1.create_one(
  909. user_b,
  910. workspace1,
  911. UserRoleInWorkspace.READER,
  912. False
  913. )
  914. role_api2 = RoleApi(
  915. current_user=user_b,
  916. session=self.session,
  917. config=self.app_config,
  918. )
  919. role_api2.create_one(user_b, workspace2, UserRoleInWorkspace.READER,
  920. False)
  921. cont_api_a = ContentApi(
  922. current_user=user_a,
  923. session=self.session,
  924. config=self.app_config,
  925. )
  926. cont_api_b = ContentApi(
  927. current_user=user_b,
  928. session=self.session,
  929. config=self.app_config,
  930. )
  931. # Creates page_1 & page_2 in workspace 1
  932. # and page_3 & page_4 in workspace 2
  933. page_1 = cont_api_a.create(ContentType.Page, workspace1, None,
  934. 'this is a page', do_save=True)
  935. page_2 = cont_api_a.create(ContentType.Page, workspace1, None,
  936. 'this is page1', do_save=True)
  937. page_3 = cont_api_a.create(ContentType.Thread, workspace2, None,
  938. 'this is page2', do_save=True)
  939. page_4 = cont_api_a.create(ContentType.File, workspace2, None,
  940. 'this is page3', do_save=True)
  941. for rev in page_1.revisions:
  942. eq_(user_b not in rev.read_by.keys(), True)
  943. for rev in page_2.revisions:
  944. eq_(user_b not in rev.read_by.keys(), True)
  945. for rev in page_3.revisions:
  946. eq_(user_b not in rev.read_by.keys(), True)
  947. for rev in page_4.revisions:
  948. eq_(user_b not in rev.read_by.keys(), True)
  949. # Set as read the workspace n°1
  950. cont_api_b.mark_read__workspace(workspace=workspace1)
  951. for rev in page_1.revisions:
  952. eq_(user_b in rev.read_by.keys(), True)
  953. for rev in page_2.revisions:
  954. eq_(user_b in rev.read_by.keys(), True)
  955. for rev in page_3.revisions:
  956. eq_(user_b not in rev.read_by.keys(), True)
  957. for rev in page_4.revisions:
  958. eq_(user_b not in rev.read_by.keys(), True)
  959. # Set as read the workspace n°2
  960. cont_api_b.mark_read__workspace(workspace=workspace2)
  961. for rev in page_1.revisions:
  962. eq_(user_b in rev.read_by.keys(), True)
  963. for rev in page_2.revisions:
  964. eq_(user_b in rev.read_by.keys(), True)
  965. for rev in page_3.revisions:
  966. eq_(user_b in rev.read_by.keys(), True)
  967. for rev in page_4.revisions:
  968. eq_(user_b in rev.read_by.keys(), True)
  969. def test_mark_read(self):
  970. uapi = UserApi(
  971. session=self.session,
  972. config=self.app_config,
  973. current_user=None,
  974. )
  975. group_api = GroupApi(
  976. current_user=None,
  977. session=self.session,
  978. config = self.app_config,
  979. )
  980. groups = [group_api.get_one(Group.TIM_USER),
  981. group_api.get_one(Group.TIM_MANAGER),
  982. group_api.get_one(Group.TIM_ADMIN)]
  983. user_a = uapi.create_minimal_user(
  984. email='this.is@user',
  985. groups=groups,
  986. save_now=True
  987. )
  988. user_b = uapi.create_minimal_user(
  989. email='this.is@another.user',
  990. groups=groups,
  991. save_now=True
  992. )
  993. wapi = WorkspaceApi(
  994. current_user=user_a,
  995. session=self.session,
  996. config=self.app_config,
  997. )
  998. workspace_api = WorkspaceApi(
  999. current_user=user_a,
  1000. session=self.session,
  1001. config=self.app_config,
  1002. )
  1003. workspace = wapi.create_workspace(
  1004. 'test workspace',
  1005. save_now=True)
  1006. role_api = RoleApi(
  1007. current_user=user_a,
  1008. session=self.session,
  1009. config=self.app_config,
  1010. )
  1011. role_api.create_one(
  1012. user_b,
  1013. workspace,
  1014. UserRoleInWorkspace.READER,
  1015. False
  1016. )
  1017. cont_api_a = ContentApi(
  1018. current_user=user_a,
  1019. session=self.session,
  1020. config=self.app_config,
  1021. )
  1022. cont_api_b = ContentApi(
  1023. current_user=user_b,
  1024. session=self.session,
  1025. config=self.app_config,
  1026. )
  1027. page_1 = cont_api_a.create(ContentType.Page, workspace, None,
  1028. 'this is a page', do_save=True)
  1029. for rev in page_1.revisions:
  1030. eq_(user_b not in rev.read_by.keys(), True)
  1031. cont_api_b.mark_read(page_1)
  1032. for rev in page_1.revisions:
  1033. eq_(user_b in rev.read_by.keys(), True)
  1034. def test_mark_read__all(self):
  1035. uapi = UserApi(
  1036. session=self.session,
  1037. config=self.app_config,
  1038. current_user=None,
  1039. )
  1040. group_api = GroupApi(
  1041. current_user=None,
  1042. session=self.session,
  1043. config=self.app_config,
  1044. )
  1045. groups = [group_api.get_one(Group.TIM_USER),
  1046. group_api.get_one(Group.TIM_MANAGER),
  1047. group_api.get_one(Group.TIM_ADMIN)]
  1048. user_a = uapi.create_minimal_user(
  1049. email='this.is@user',
  1050. groups=groups,
  1051. save_now=True
  1052. )
  1053. user_b = uapi.create_minimal_user(
  1054. email='this.is@another.user',
  1055. groups=groups,
  1056. save_now=True
  1057. )
  1058. wapi = WorkspaceApi(
  1059. current_user=user_a,
  1060. session=self.session,
  1061. config=self.app_config,
  1062. )
  1063. workspace = wapi.create_workspace(
  1064. 'test workspace',
  1065. save_now=True)
  1066. role_api = RoleApi(
  1067. current_user=user_a,
  1068. session=self.session,
  1069. config=self.app_config,
  1070. )
  1071. role_api.create_one(
  1072. user_b,
  1073. workspace,
  1074. UserRoleInWorkspace.READER,
  1075. False
  1076. )
  1077. cont_api_a = ContentApi(
  1078. current_user=user_a,
  1079. session=self.session,
  1080. config=self.app_config,
  1081. )
  1082. cont_api_b = ContentApi(
  1083. current_user=user_b,
  1084. session=self.session,
  1085. config=self.app_config,
  1086. )
  1087. page_2 = cont_api_a.create(
  1088. ContentType.Page,
  1089. workspace,
  1090. None,
  1091. 'this is page1',
  1092. do_save=True
  1093. )
  1094. page_3 = cont_api_a.create(
  1095. ContentType.Thread,
  1096. workspace,
  1097. None,
  1098. 'this is page2',
  1099. do_save=True
  1100. )
  1101. page_4 = cont_api_a.create(
  1102. ContentType.File,
  1103. workspace,
  1104. None,
  1105. 'this is page3',
  1106. do_save=True
  1107. )
  1108. for rev in page_2.revisions:
  1109. eq_(user_b not in rev.read_by.keys(), True)
  1110. for rev in page_3.revisions:
  1111. eq_(user_b not in rev.read_by.keys(), True)
  1112. for rev in page_4.revisions:
  1113. eq_(user_b not in rev.read_by.keys(), True)
  1114. self.session.refresh(page_2)
  1115. self.session.refresh(page_3)
  1116. self.session.refresh(page_4)
  1117. cont_api_b.mark_read__all()
  1118. for rev in page_2.revisions:
  1119. eq_(user_b in rev.read_by.keys(), True)
  1120. for rev in page_3.revisions:
  1121. eq_(user_b in rev.read_by.keys(), True)
  1122. for rev in page_4.revisions:
  1123. eq_(user_b in rev.read_by.keys(), True)
  1124. def test_update(self):
  1125. uapi = UserApi(
  1126. session=self.session,
  1127. config=self.app_config,
  1128. current_user=None,
  1129. )
  1130. group_api = GroupApi(
  1131. current_user=None,
  1132. session=self.session,
  1133. config=self.app_config,
  1134. )
  1135. groups = [group_api.get_one(Group.TIM_USER),
  1136. group_api.get_one(Group.TIM_MANAGER),
  1137. group_api.get_one(Group.TIM_ADMIN)]
  1138. user1 = uapi.create_minimal_user(
  1139. email='this.is@user',
  1140. groups=groups,
  1141. save_now=True
  1142. )
  1143. workspace_api = WorkspaceApi(
  1144. current_user=user1,
  1145. session=self.session,
  1146. config=self.app_config,
  1147. )
  1148. workspace = workspace_api.create_workspace(
  1149. 'test workspace',
  1150. save_now=True
  1151. )
  1152. wid = workspace.workspace_id
  1153. user2 = uapi.create_minimal_user('this.is@another.user')
  1154. uapi.save(user2)
  1155. RoleApi(
  1156. current_user=user1,
  1157. session=self.session,
  1158. config=self.app_config,
  1159. ).create_one(
  1160. user2,
  1161. workspace,
  1162. UserRoleInWorkspace.CONTENT_MANAGER,
  1163. with_notif=False,
  1164. flush=True
  1165. )
  1166. # Test starts here
  1167. api = ContentApi(
  1168. current_user=user1,
  1169. session=self.session,
  1170. config=self.app_config,
  1171. )
  1172. p = api.create(
  1173. content_type=ContentType.Page,
  1174. workspace=workspace,
  1175. parent=None,
  1176. label='this_is_a_page',
  1177. do_save=True
  1178. )
  1179. u1id = user1.user_id
  1180. u2id = user2.user_id
  1181. pcid = p.content_id
  1182. poid = p.owner_id
  1183. transaction.commit()
  1184. # Refresh instances after commit
  1185. user1 = uapi.get_one(u1id)
  1186. workspace = WorkspaceApi(
  1187. current_user=user1,
  1188. session=self.session,
  1189. config=self.app_config,
  1190. ).get_one(wid)
  1191. api = ContentApi(
  1192. current_user=user1,
  1193. session=self.session,
  1194. config=self.app_config,
  1195. )
  1196. content = api.get_one(pcid, ContentType.Any, workspace)
  1197. eq_(u1id, content.owner_id)
  1198. eq_(poid, content.owner_id)
  1199. u2 = UserApi(
  1200. session=self.session,
  1201. config=self.app_config,
  1202. current_user=None,
  1203. ).get_one(u2id)
  1204. api2 = ContentApi(
  1205. current_user=u2,
  1206. session=self.session,
  1207. config=self.app_config,
  1208. )
  1209. content2 = api2.get_one(pcid, ContentType.Any, workspace)
  1210. with new_revision(
  1211. session=self.session,
  1212. tm=transaction.manager,
  1213. content=content2,
  1214. ):
  1215. api2.update_content(
  1216. content2,
  1217. 'this is an updated page',
  1218. 'new content'
  1219. )
  1220. api2.save(content2)
  1221. transaction.commit()
  1222. # Refresh instances after commit
  1223. user1 = uapi.get_one(u1id)
  1224. workspace = WorkspaceApi(
  1225. current_user=user1,
  1226. session=self.session,
  1227. config=self.app_config,
  1228. ).get_one(wid)
  1229. api = ContentApi(
  1230. current_user=user1,
  1231. session=self.session,
  1232. config=self.app_config,
  1233. )
  1234. updated = api.get_one(pcid, ContentType.Any, workspace)
  1235. eq_(u2id, updated.owner_id,
  1236. 'the owner id should be {} (found {})'.format(u2id,
  1237. updated.owner_id))
  1238. eq_('this is an updated page', updated.label)
  1239. eq_('new content', updated.description)
  1240. eq_(ActionDescription.EDITION, updated.revision_type)
  1241. def test_update_no_change(self):
  1242. uapi = UserApi(
  1243. session=self.session,
  1244. config=self.app_config,
  1245. current_user=None,
  1246. )
  1247. group_api = GroupApi(
  1248. current_user=None,
  1249. session=self.session,
  1250. config = self.app_config,
  1251. )
  1252. groups = [group_api.get_one(Group.TIM_USER),
  1253. group_api.get_one(Group.TIM_MANAGER),
  1254. group_api.get_one(Group.TIM_ADMIN)]
  1255. user1 = uapi.create_minimal_user(
  1256. email='this.is@user',
  1257. groups=groups,
  1258. save_now=True,
  1259. )
  1260. workspace = WorkspaceApi(
  1261. current_user=user1,
  1262. session=self.session,
  1263. config=self.app_config,
  1264. ).create_workspace(
  1265. 'test workspace',
  1266. save_now=True
  1267. )
  1268. user2 = uapi.create_minimal_user('this.is@another.user')
  1269. uapi.save(user2)
  1270. RoleApi(
  1271. current_user=user1,
  1272. session=self.session,
  1273. config=self.app_config,
  1274. ).create_one(
  1275. user2,
  1276. workspace,
  1277. UserRoleInWorkspace.CONTENT_MANAGER,
  1278. with_notif=False,
  1279. flush=True
  1280. )
  1281. api = ContentApi(
  1282. current_user=user1,
  1283. session=self.session,
  1284. config=self.app_config,
  1285. )
  1286. with self.session.no_autoflush:
  1287. page = api.create(
  1288. content_type=ContentType.Page,
  1289. workspace=workspace,
  1290. label="same_content",
  1291. do_save=False
  1292. )
  1293. page.description = "Same_content_here"
  1294. api.save(page, ActionDescription.CREATION, do_notify=True)
  1295. transaction.commit()
  1296. api2 = ContentApi(
  1297. current_user=user2,
  1298. session=self.session,
  1299. config=self.app_config,
  1300. )
  1301. content2 = api2.get_one(page.content_id, ContentType.Any, workspace)
  1302. with new_revision(
  1303. session=self.session,
  1304. tm=transaction.manager,
  1305. content=content2,
  1306. ):
  1307. with pytest.raises(SameValueError):
  1308. api2.update_content(
  1309. item=content2,
  1310. new_label='same_content',
  1311. new_content='Same_content_here'
  1312. )
  1313. api2.save(content2)
  1314. transaction.commit()
  1315. def test_update_file_data(self):
  1316. uapi = UserApi(
  1317. session=self.session,
  1318. config=self.app_config,
  1319. current_user=None,
  1320. )
  1321. group_api = GroupApi(
  1322. current_user=None,
  1323. session=self.session,
  1324. config=self.app_config,
  1325. )
  1326. groups = [group_api.get_one(Group.TIM_USER),
  1327. group_api.get_one(Group.TIM_MANAGER),
  1328. group_api.get_one(Group.TIM_ADMIN)]
  1329. user1 = uapi.create_minimal_user(
  1330. email='this.is@user',
  1331. groups=groups,
  1332. save_now=True
  1333. )
  1334. workspace_api = WorkspaceApi(
  1335. current_user=user1,
  1336. session=self.session,
  1337. config=self.app_config,
  1338. )
  1339. workspace = workspace_api.create_workspace(
  1340. 'test workspace',
  1341. save_now=True
  1342. )
  1343. wid = workspace.workspace_id
  1344. user2 = uapi.create_minimal_user('this.is@another.user')
  1345. uapi.save(user2)
  1346. RoleApi(
  1347. current_user=user1,
  1348. session=self.session,
  1349. config=self.app_config,
  1350. ).create_one(
  1351. user2,
  1352. workspace,
  1353. UserRoleInWorkspace.CONTENT_MANAGER,
  1354. with_notif=True,
  1355. flush=True
  1356. )
  1357. # Test starts here
  1358. api = ContentApi(
  1359. current_user=user1,
  1360. session=self.session,
  1361. config=self.app_config,
  1362. )
  1363. p = api.create(
  1364. content_type=ContentType.File,
  1365. workspace=workspace,
  1366. parent=None,
  1367. label='this_is_a_page',
  1368. do_save=True
  1369. )
  1370. u1id = user1.user_id
  1371. u2id = user2.user_id
  1372. pcid = p.content_id
  1373. poid = p.owner_id
  1374. api.save(p)
  1375. transaction.commit()
  1376. # Refresh instances after commit
  1377. user1 = uapi.get_one(u1id)
  1378. workspace_api2 = WorkspaceApi(
  1379. current_user=user1,
  1380. session=self.session,
  1381. config=self.app_config,
  1382. )
  1383. workspace = workspace_api2.get_one(wid)
  1384. api = ContentApi(
  1385. current_user=user1,
  1386. session=self.session,
  1387. config=self.app_config,
  1388. )
  1389. content = api.get_one(pcid, ContentType.Any, workspace)
  1390. eq_(u1id, content.owner_id)
  1391. eq_(poid, content.owner_id)
  1392. u2 = UserApi(
  1393. current_user=None,
  1394. session=self.session,
  1395. config=self.app_config,
  1396. ).get_one(u2id)
  1397. api2 = ContentApi(
  1398. current_user=u2,
  1399. session=self.session,
  1400. config=self.app_config,
  1401. )
  1402. content2 = api2.get_one(pcid, ContentType.Any, workspace)
  1403. with new_revision(
  1404. session=self.session,
  1405. tm=transaction.manager,
  1406. content=content2,
  1407. ):
  1408. api2.update_file_data(
  1409. content2,
  1410. 'index.html',
  1411. 'text/html',
  1412. b'<html>hello world</html>'
  1413. )
  1414. api2.save(content2)
  1415. transaction.commit()
  1416. # Refresh instances after commit
  1417. user1 = uapi.get_one(u1id)
  1418. workspace = WorkspaceApi(
  1419. current_user=user1,
  1420. session=self.session,
  1421. config=self.app_config,
  1422. ).get_one(wid)
  1423. updated = api.get_one(pcid, ContentType.Any, workspace)
  1424. eq_(u2id, updated.owner_id,
  1425. 'the owner id should be {} (found {})'.format(u2id,
  1426. updated.owner_id))
  1427. eq_('this_is_a_page.html', updated.file_name)
  1428. eq_('text/html', updated.file_mimetype)
  1429. eq_(b'<html>hello world</html>', updated.depot_file.file.read())
  1430. eq_(ActionDescription.REVISION, updated.revision_type)
  1431. def test_update_no_change(self):
  1432. uapi = UserApi(
  1433. session=self.session,
  1434. config=self.app_config,
  1435. current_user=None,
  1436. )
  1437. group_api = GroupApi(
  1438. current_user=None,
  1439. session=self.session,
  1440. config=self.app_config,
  1441. )
  1442. groups = [group_api.get_one(Group.TIM_USER),
  1443. group_api.get_one(Group.TIM_MANAGER),
  1444. group_api.get_one(Group.TIM_ADMIN)]
  1445. user1 = uapi.create_minimal_user(
  1446. email='this.is@user',
  1447. groups=groups,
  1448. save_now=True,
  1449. )
  1450. workspace_api = WorkspaceApi(
  1451. current_user=user1,
  1452. session=self.session,
  1453. config=self.app_config,
  1454. )
  1455. workspace = workspace_api.create_workspace(
  1456. 'test workspace',
  1457. save_now=True
  1458. )
  1459. user2 = uapi.create_minimal_user('this.is@another.user')
  1460. uapi.save(user2)
  1461. RoleApi(
  1462. current_user=user1,
  1463. session=self.session,
  1464. config=self.app_config,
  1465. ).create_one(
  1466. user2,
  1467. workspace,
  1468. UserRoleInWorkspace.CONTENT_MANAGER,
  1469. with_notif=False,
  1470. flush=True
  1471. )
  1472. api = ContentApi(
  1473. current_user=user1,
  1474. session=self.session,
  1475. config=self.app_config,
  1476. )
  1477. with self.session.no_autoflush:
  1478. page = api.create(
  1479. content_type=ContentType.Page,
  1480. workspace=workspace,
  1481. label="same_content",
  1482. do_save=False
  1483. )
  1484. api.update_file_data(
  1485. page,
  1486. 'index.html',
  1487. 'text/html',
  1488. b'<html>Same Content Here</html>'
  1489. )
  1490. api.save(page, ActionDescription.CREATION, do_notify=True)
  1491. transaction.commit()
  1492. api2 = ContentApi(
  1493. current_user=user2,
  1494. session=self.session,
  1495. config=self.app_config,
  1496. )
  1497. content2 = api2.get_one(page.content_id, ContentType.Any, workspace)
  1498. with new_revision(
  1499. session=self.session,
  1500. tm=transaction.manager,
  1501. content=content2,
  1502. ):
  1503. with pytest.raises(SameValueError):
  1504. api2.update_file_data(
  1505. page,
  1506. 'index.html',
  1507. 'text/html',
  1508. b'<html>Same Content Here</html>'
  1509. )
  1510. api2.save(content2)
  1511. transaction.commit()
  1512. def test_archive_unarchive(self):
  1513. uapi = UserApi(
  1514. session=self.session,
  1515. config=self.app_config,
  1516. current_user=None,
  1517. )
  1518. group_api = GroupApi(
  1519. current_user=None,
  1520. session=self.session,
  1521. config=self.app_config,
  1522. )
  1523. groups = [group_api.get_one(Group.TIM_USER),
  1524. group_api.get_one(Group.TIM_MANAGER),
  1525. group_api.get_one(Group.TIM_ADMIN)]
  1526. user1 = uapi.create_minimal_user(
  1527. email='this.is@user',
  1528. groups=groups,
  1529. save_now=True
  1530. )
  1531. u1id = user1.user_id
  1532. workspace_api = WorkspaceApi(
  1533. current_user=user1,
  1534. session=self.session,
  1535. config=self.app_config,
  1536. )
  1537. workspace = workspace_api.create_workspace(
  1538. 'test workspace',
  1539. save_now=True
  1540. )
  1541. wid = workspace.workspace_id
  1542. user2 = uapi.create_minimal_user('this.is@another.user')
  1543. uapi.save(user2)
  1544. RoleApi(
  1545. current_user=user1,
  1546. session=self.session,
  1547. config=self.app_config,
  1548. ).create_one(
  1549. user2,
  1550. workspace,
  1551. UserRoleInWorkspace.CONTENT_MANAGER,
  1552. with_notif=True,
  1553. flush=True
  1554. )
  1555. # show archived is used at the top end of the test
  1556. api = ContentApi(
  1557. current_user=user1,
  1558. session=self.session,
  1559. show_archived=True,
  1560. config=self.app_config,
  1561. )
  1562. p = api.create(
  1563. content_type=ContentType.File,
  1564. workspace=workspace,
  1565. parent=None,
  1566. label='this_is_a_page',
  1567. do_save=True
  1568. )
  1569. u1id = user1.user_id
  1570. u2id = user2.user_id
  1571. pcid = p.content_id
  1572. poid = p.owner_id
  1573. transaction.commit()
  1574. ####
  1575. # refresh after commit
  1576. user1 = UserApi(
  1577. current_user=None,
  1578. config=self.app_config,
  1579. session=self.session
  1580. ).get_one(u1id)
  1581. workspace = WorkspaceApi(
  1582. current_user=user1,
  1583. session=self.session,
  1584. config=self.app_config,
  1585. ).get_one(wid)
  1586. content = api.get_one(pcid, ContentType.Any, workspace)
  1587. eq_(u1id, content.owner_id)
  1588. eq_(poid, content.owner_id)
  1589. u2api = UserApi(
  1590. session=self.session,
  1591. config=self.app_config,
  1592. current_user=None,
  1593. )
  1594. u2 = u2api.get_one(u2id)
  1595. api2 = ContentApi(
  1596. current_user=u2,
  1597. session=self.session,
  1598. config=self.app_config,
  1599. show_archived=True,
  1600. )
  1601. content2 = api2.get_one(pcid, ContentType.Any, workspace)
  1602. with new_revision(
  1603. session=self.session,
  1604. tm=transaction.manager,
  1605. content=content2,
  1606. ):
  1607. api2.archive(content2)
  1608. api2.save(content2)
  1609. transaction.commit()
  1610. # refresh after commit
  1611. user1 = UserApi(
  1612. current_user=None,
  1613. session=self.session,
  1614. config=self.app_config,
  1615. ).get_one(u1id)
  1616. workspace = WorkspaceApi(
  1617. current_user=user1,
  1618. session=self.session,
  1619. config=self.app_config,
  1620. ).get_one(wid)
  1621. u2 = UserApi(
  1622. current_user=None,
  1623. session=self.session,
  1624. config=self.app_config,
  1625. ).get_one(u2id)
  1626. api = ContentApi(
  1627. current_user=user1,
  1628. session=self.session,
  1629. config=self.app_config,
  1630. show_archived=True,
  1631. )
  1632. api2 = ContentApi(
  1633. current_user=u2,
  1634. session=self.session,
  1635. config=self.app_config,
  1636. show_archived=True,
  1637. )
  1638. updated = api2.get_one(pcid, ContentType.Any, workspace)
  1639. eq_(u2id, updated.owner_id,
  1640. 'the owner id should be {} (found {})'.format(u2id,
  1641. updated.owner_id))
  1642. eq_(True, updated.is_archived)
  1643. eq_(ActionDescription.ARCHIVING, updated.revision_type)
  1644. ####
  1645. updated2 = api.get_one(pcid, ContentType.Any, workspace)
  1646. with new_revision(
  1647. session=self.session,
  1648. tm=transaction.manager,
  1649. content=updated,
  1650. ):
  1651. api.unarchive(updated)
  1652. api.save(updated2)
  1653. eq_(False, updated2.is_archived)
  1654. eq_(ActionDescription.UNARCHIVING, updated2.revision_type)
  1655. eq_(u1id, updated2.owner_id)
  1656. def test_delete_undelete(self):
  1657. uapi = UserApi(
  1658. session=self.session,
  1659. config=self.app_config,
  1660. current_user=None,
  1661. )
  1662. group_api = GroupApi(
  1663. current_user=None,
  1664. session=self.session,
  1665. config=self.app_config,
  1666. )
  1667. groups = [group_api.get_one(Group.TIM_USER),
  1668. group_api.get_one(Group.TIM_MANAGER),
  1669. group_api.get_one(Group.TIM_ADMIN)]
  1670. user1 = uapi.create_minimal_user(
  1671. email='this.is@user',
  1672. groups=groups,
  1673. save_now=True
  1674. )
  1675. u1id = user1.user_id
  1676. workspace_api = WorkspaceApi(
  1677. current_user=user1,
  1678. session=self.session,
  1679. config=self.app_config,
  1680. )
  1681. workspace = workspace_api.create_workspace(
  1682. 'test workspace',
  1683. save_now=True
  1684. )
  1685. wid = workspace.workspace_id
  1686. user2 = uapi.create_minimal_user('this.is@another.user')
  1687. uapi.save(user2)
  1688. RoleApi(
  1689. current_user=user1,
  1690. session=self.session,
  1691. config=self.app_config,
  1692. ).create_one(
  1693. user2,
  1694. workspace,
  1695. UserRoleInWorkspace.CONTENT_MANAGER,
  1696. with_notif=True,
  1697. flush=True
  1698. )
  1699. # show archived is used at the top end of the test
  1700. api = ContentApi(
  1701. current_user=user1,
  1702. session=self.session,
  1703. config=self.app_config,
  1704. show_deleted=True,
  1705. )
  1706. p = api.create(
  1707. content_type=ContentType.File,
  1708. workspace=workspace,
  1709. parent=None,
  1710. label='this_is_a_page',
  1711. do_save=True
  1712. )
  1713. u1id = user1.user_id
  1714. u2id = user2.user_id
  1715. pcid = p.content_id
  1716. poid = p.owner_id
  1717. transaction.commit()
  1718. ####
  1719. user1 = UserApi(
  1720. current_user=None,
  1721. session=self.session,
  1722. config=self.app_config,
  1723. ).get_one(u1id)
  1724. workspace = WorkspaceApi(
  1725. current_user=user1,
  1726. session=self.session,
  1727. config=self.app_config,
  1728. ).get_one(wid)
  1729. content = api.get_one(pcid, ContentType.Any, workspace)
  1730. eq_(u1id, content.owner_id)
  1731. eq_(poid, content.owner_id)
  1732. u2 = UserApi(
  1733. current_user=None,
  1734. session=self.session,
  1735. config=self.app_config,
  1736. ).get_one(u2id)
  1737. api2 = ContentApi(
  1738. current_user=u2,
  1739. session=self.session,
  1740. config=self.app_config,
  1741. show_deleted=True,
  1742. )
  1743. content2 = api2.get_one(pcid, ContentType.Any, workspace)
  1744. with new_revision(
  1745. session=self.session,
  1746. tm=transaction.manager,
  1747. content=content2,
  1748. ):
  1749. api2.delete(content2)
  1750. api2.save(content2)
  1751. transaction.commit()
  1752. ####
  1753. user1 = UserApi(
  1754. current_user=None,
  1755. session=self.session,
  1756. config=self.app_config,
  1757. ).get_one(u1id)
  1758. workspace = WorkspaceApi(
  1759. current_user=user1,
  1760. session=self.session,
  1761. config=self.app_config,
  1762. ).get_one(wid)
  1763. # show archived is used at the top end of the test
  1764. api = ContentApi(
  1765. current_user=user1,
  1766. session=self.session,
  1767. config=self.app_config,
  1768. show_deleted=True,
  1769. )
  1770. u2 = UserApi(
  1771. current_user=None,
  1772. session=self.session,
  1773. config=self.app_config,
  1774. ).get_one(u2id)
  1775. api2 = ContentApi(
  1776. current_user=u2,
  1777. session=self.session,
  1778. config=self.app_config,
  1779. show_deleted=True
  1780. )
  1781. updated = api2.get_one(pcid, ContentType.Any, workspace)
  1782. eq_(u2id, updated.owner_id,
  1783. 'the owner id should be {} (found {})'.format(u2id,
  1784. updated.owner_id))
  1785. eq_(True, updated.is_deleted)
  1786. eq_(ActionDescription.DELETION, updated.revision_type)
  1787. ####
  1788. updated2 = api.get_one(pcid, ContentType.Any, workspace)
  1789. with new_revision(
  1790. tm=transaction.manager,
  1791. session=self.session,
  1792. content=updated2,
  1793. ):
  1794. api.undelete(updated2)
  1795. api.save(updated2)
  1796. eq_(False, updated2.is_deleted)
  1797. eq_(ActionDescription.UNDELETION, updated2.revision_type)
  1798. eq_(u1id, updated2.owner_id)
  1799. def test_search_in_label(self):
  1800. # HACK - D.A. - 2015-03-09
  1801. # This test is based on a bug which does NOT return results found
  1802. # at root of a workspace (eg a folder)
  1803. uapi = UserApi(
  1804. session=self.session,
  1805. config=self.app_config,
  1806. current_user=None,
  1807. )
  1808. group_api = GroupApi(
  1809. current_user=None,
  1810. session=self.session,
  1811. config=self.app_config,
  1812. )
  1813. groups = [group_api.get_one(Group.TIM_USER),
  1814. group_api.get_one(Group.TIM_MANAGER),
  1815. group_api.get_one(Group.TIM_ADMIN)]
  1816. user = uapi.create_minimal_user(email='this.is@user',
  1817. groups=groups, save_now=True)
  1818. workspace = WorkspaceApi(
  1819. current_user=user,
  1820. session=self.session,
  1821. config=self.app_config,
  1822. ).create_workspace(
  1823. 'test workspace',
  1824. save_now=True
  1825. )
  1826. api = ContentApi(
  1827. current_user=user,
  1828. session=self.session,
  1829. config=self.app_config,
  1830. )
  1831. a = api.create(ContentType.Folder, workspace, None,
  1832. 'this is randomized folder', '', True)
  1833. p = api.create(ContentType.Page, workspace, a,
  1834. 'this is randomized label content', '', True)
  1835. with new_revision(
  1836. session=self.session,
  1837. tm=transaction.manager,
  1838. content=p,
  1839. ):
  1840. p.description = 'This is some amazing test'
  1841. api.save(p)
  1842. original_id = p.content_id
  1843. res = api.search(['randomized'])
  1844. eq_(1, len(res.all()))
  1845. item = res.all()[0]
  1846. eq_(original_id, item.content_id)
  1847. def test_search_in_description(self):
  1848. # HACK - D.A. - 2015-03-09
  1849. # This test is based on a bug which does NOT return results found
  1850. # at root of a workspace (eg a folder)
  1851. uapi = UserApi(
  1852. session=self.session,
  1853. config=self.app_config,
  1854. current_user=None,
  1855. )
  1856. group_api = GroupApi(
  1857. current_user=None,
  1858. session=self.session,
  1859. config=self.app_config,
  1860. )
  1861. groups = [group_api.get_one(Group.TIM_USER),
  1862. group_api.get_one(Group.TIM_MANAGER),
  1863. group_api.get_one(Group.TIM_ADMIN)]
  1864. user = uapi.create_minimal_user(email='this.is@user',
  1865. groups=groups, save_now=True)
  1866. workspace = WorkspaceApi(
  1867. current_user=user,
  1868. session=self.session,
  1869. config=self.app_config,
  1870. ).create_workspace(
  1871. 'test workspace',
  1872. save_now=True,
  1873. )
  1874. api = ContentApi(
  1875. current_user=user,
  1876. session=self.session,
  1877. config=self.app_config,
  1878. )
  1879. a = api.create(ContentType.Folder, workspace, None,
  1880. 'this is randomized folder', '', True)
  1881. p = api.create(ContentType.Page, workspace, a,
  1882. 'this is dummy label content', '', True)
  1883. with new_revision(
  1884. tm=transaction.manager,
  1885. session=self.session,
  1886. content=p,
  1887. ):
  1888. p.description = 'This is some amazing test'
  1889. api.save(p)
  1890. original_id = p.content_id
  1891. res = api.search(['dummy'])
  1892. eq_(1, len(res.all()))
  1893. item = res.all()[0]
  1894. eq_(original_id, item.content_id)
  1895. def test_search_in_label_or_description(self):
  1896. # HACK - D.A. - 2015-03-09
  1897. # This test is based on a bug which does NOT return results found
  1898. # at root of a workspace (eg a folder)
  1899. uapi = UserApi(
  1900. session=self.session,
  1901. config=self.app_config,
  1902. current_user=None,
  1903. )
  1904. group_api = GroupApi(
  1905. current_user=None,
  1906. session=self.session,
  1907. config=self.app_config,
  1908. )
  1909. groups = [group_api.get_one(Group.TIM_USER),
  1910. group_api.get_one(Group.TIM_MANAGER),
  1911. group_api.get_one(Group.TIM_ADMIN)]
  1912. user = uapi.create_minimal_user(email='this.is@user',
  1913. groups=groups, save_now=True)
  1914. workspace = WorkspaceApi(
  1915. current_user=user,
  1916. session=self.session,
  1917. config=self.app_config,
  1918. ).create_workspace('test workspace', save_now=True)
  1919. api = ContentApi(
  1920. current_user=user,
  1921. session=self.session,
  1922. config=self.app_config,
  1923. )
  1924. a = api.create(
  1925. content_type=ContentType.Folder,
  1926. workspace=workspace,
  1927. parent=None,
  1928. label='this is randomized folder',
  1929. do_save=True
  1930. )
  1931. p1 = api.create(
  1932. content_type=ContentType.Page,
  1933. workspace=workspace,
  1934. parent=a,
  1935. label='this is dummy label content',
  1936. do_save=True
  1937. )
  1938. p2 = api.create(
  1939. content_type=ContentType.Page,
  1940. workspace=workspace,
  1941. parent=a,
  1942. label='Hey ! Jon !',
  1943. do_save=True
  1944. )
  1945. with new_revision(
  1946. session=self.session,
  1947. tm=transaction.manager,
  1948. content=p1,
  1949. ):
  1950. p1.description = 'This is some amazing test'
  1951. with new_revision(
  1952. session=self.session,
  1953. tm=transaction.manager,
  1954. content=p2,
  1955. ):
  1956. p2.description = 'What\'s up?'
  1957. api.save(p1)
  1958. api.save(p2)
  1959. id1 = p1.content_id
  1960. id2 = p2.content_id
  1961. eq_(1, self.session.query(Workspace).filter(Workspace.label == 'test workspace').count())
  1962. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'this is randomized folder').count())
  1963. eq_(2, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'this is dummy label content').count())
  1964. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.description == 'This is some amazing test').count())
  1965. eq_(2, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'Hey ! Jon !').count())
  1966. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.description == 'What\'s up?').count())
  1967. res = api.search(['dummy', 'jon'])
  1968. eq_(2, len(res.all()))
  1969. eq_(True, id1 in [o.content_id for o in res.all()])
  1970. eq_(True, id2 in [o.content_id for o in res.all()])
  1971. def test_unit__search_exclude_content_under_deleted_or_archived_parents__ok(self): # nopep8
  1972. admin = self.session.query(User)\
  1973. .filter(User.email == 'admin@admin.admin').one()
  1974. workspace = self._create_workspace_and_test(
  1975. 'workspace_1',
  1976. admin
  1977. )
  1978. folder_1 = self._create_content_and_test(
  1979. 'folder_1',
  1980. workspace=workspace,
  1981. type=ContentType.Folder
  1982. )
  1983. folder_2 = self._create_content_and_test(
  1984. 'folder_2',
  1985. workspace=workspace,
  1986. type=ContentType.Folder
  1987. )
  1988. page_1 = self._create_content_and_test(
  1989. 'foo', workspace=workspace,
  1990. type=ContentType.Page,
  1991. parent=folder_1
  1992. )
  1993. page_2 = self._create_content_and_test(
  1994. 'bar',
  1995. workspace=workspace,
  1996. type=ContentType.Page,
  1997. parent=folder_2
  1998. )
  1999. api = ContentApi(
  2000. current_user=admin,
  2001. session=self.session,
  2002. config=self.app_config,
  2003. )
  2004. foo_result = api.search(['foo']).all()
  2005. eq_(1, len(foo_result))
  2006. assert page_1 in foo_result
  2007. bar_result = api.search(['bar']).all()
  2008. eq_(1, len(bar_result))
  2009. assert page_2 in bar_result
  2010. with new_revision(
  2011. session=self.session,
  2012. tm=transaction.manager,
  2013. content=folder_1,
  2014. ):
  2015. api.delete(folder_1)
  2016. with new_revision(
  2017. session=self.session,
  2018. tm=transaction.manager,
  2019. content=folder_2,
  2020. ):
  2021. api.archive(folder_2)
  2022. # Actually ContentApi.search don't filter it
  2023. foo_result = api.search(['foo']).all()
  2024. eq_(1, len(foo_result))
  2025. assert page_1 in foo_result
  2026. bar_result = api.search(['bar']).all()
  2027. eq_(1, len(bar_result))
  2028. assert page_2 in bar_result
  2029. # ContentApi offer exclude_unavailable method to do it
  2030. foo_result = api.search(['foo']).all()
  2031. api.exclude_unavailable(foo_result)
  2032. eq_(0, len(foo_result))
  2033. bar_result = api.search(['bar']).all()
  2034. api.exclude_unavailable(bar_result)
  2035. eq_(0, len(bar_result))
  2036. class TestContentApiSecurity(DefaultTest):
  2037. fixtures = [FixtureTest, ]
  2038. def test_unit__cant_get_non_access_content__ok__nominal_case(self):
  2039. admin = self.session.query(User)\
  2040. .filter(User.email == 'admin@admin.admin').one()
  2041. bob = self.session.query(User)\
  2042. .filter(User.email == 'bob@fsf.local').one()
  2043. bob_workspace = WorkspaceApi(
  2044. current_user=bob,
  2045. session=self.session,
  2046. config=self.app_config,
  2047. ).create_workspace(
  2048. 'bob_workspace',
  2049. save_now=True,
  2050. )
  2051. admin_workspace = WorkspaceApi(
  2052. current_user=admin,
  2053. session=self.session,
  2054. config=self.app_config,
  2055. ).create_workspace(
  2056. 'admin_workspace',
  2057. save_now=True,
  2058. )
  2059. bob_page = ContentApi(
  2060. current_user=bob,
  2061. session=self.session,
  2062. config=self.app_config,
  2063. ).create(
  2064. content_type=ContentType.Page,
  2065. workspace=bob_workspace,
  2066. label='bob_page',
  2067. do_save=True,
  2068. )
  2069. admin_page = ContentApi(
  2070. current_user=admin,
  2071. session=self.session,
  2072. config=self.app_config,
  2073. ).create(
  2074. content_type=ContentType.Page,
  2075. workspace=admin_workspace,
  2076. label='admin_page',
  2077. do_save=True,
  2078. )
  2079. bob_viewable = ContentApi(
  2080. current_user=bob,
  2081. session=self.session,
  2082. config=self.app_config,
  2083. ).get_all()
  2084. eq_(1, len(bob_viewable), 'Bob should view only one content')
  2085. eq_(
  2086. 'bob_page',
  2087. bob_viewable[0].label,
  2088. 'Bob should not view "{0}" content'.format(
  2089. bob_viewable[0].label,
  2090. )
  2091. )