test_content.py 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. # -*- coding: utf-8 -*-
  2. import time
  3. from depot.fields.upload import UploadedFile
  4. from nose.tools import ok_
  5. from nose.tools import raises
  6. from sqlalchemy.sql.elements import and_
  7. from sqlalchemy.testing import eq_
  8. # from tracim.lib.content import ContentApi
  9. from tracim.exceptions import ContentRevisionUpdateError
  10. from tracim.models import Content
  11. from tracim.models.revision_protection import new_revision
  12. from tracim.models import User
  13. from tracim.models.data import ActionDescription
  14. from tracim.models.data import ContentRevisionRO
  15. from tracim.models.data import ContentType
  16. from tracim.models.data import Workspace
  17. from tracim.tests import BaseTest
  18. class TestContent(BaseTest):
  19. @raises(ContentRevisionUpdateError)
  20. def test_update_without_prepare(self):
  21. content1 = self.test_create()
  22. content1.description = 'FOO' # Raise ContentRevisionUpdateError because revision can't be updated
  23. # TODO - G.M - 28-03-2018 - Reenable this test when libContent is available
  24. # def test_query(self):
  25. # content1 = self.test_create()
  26. # with new_revision(content1):
  27. # content1.description = 'TEST_CONTENT_DESCRIPTION_1_UPDATED'
  28. # DBSession.flush()
  29. #
  30. # content2 = self.test_create(key='2')
  31. # with new_revision(content2):
  32. # content2.description = 'TEST_CONTENT_DESCRIPTION_2_UPDATED'
  33. # DBSession.flush()
  34. #
  35. # workspace1 = DBSession.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_1').one()
  36. # workspace2 = DBSession.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_2').one()
  37. #
  38. # # To get Content in database we have to join Content and ContentRevisionRO with particular condition:
  39. # # Join have to be on most recent revision
  40. # join_sub_query = DBSession.query(ContentRevisionRO.revision_id)\
  41. # .filter(ContentRevisionRO.content_id == Content.id)\
  42. # .order_by(ContentRevisionRO.revision_id.desc())\
  43. # .limit(1)\
  44. # .correlate(Content)
  45. #
  46. # base_query = DBSession.query(Content)\
  47. # .join(ContentRevisionRO, and_(Content.id == ContentRevisionRO.content_id,
  48. # ContentRevisionRO.revision_id == join_sub_query))
  49. #
  50. # pattern = 'TEST_CONTENT_DESCRIPTION_%_UPDATED'
  51. # eq_(2, base_query.filter(Content.description.like(pattern)).count())
  52. #
  53. # eq_(1, base_query.filter(Content.workspace == workspace1).count())
  54. # eq_(1, base_query.filter(Content.workspace == workspace2).count())
  55. #
  56. # content1_from_query = base_query.filter(Content.workspace == workspace1).one()
  57. # eq_(content1.id, content1_from_query.id)
  58. # eq_('TEST_CONTENT_DESCRIPTION_1_UPDATED', content1_from_query.description)
  59. #
  60. # user_admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
  61. #
  62. # api = ContentApi(None)
  63. #
  64. # content1_from_api = api.get_one(content1.id, ContentType.Page, workspace1)
  65. def test_update(self):
  66. created_content = self.test_create()
  67. content = self.session.query(Content).filter(Content.id == created_content.id).one()
  68. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_1').count())
  69. with new_revision(content):
  70. time.sleep(0.00001)
  71. content.description = 'TEST_CONTENT_DESCRIPTION_1_UPDATED'
  72. self.session.flush()
  73. eq_(2, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_1').count())
  74. eq_(1, self.session.query(Content).filter(Content.id == created_content.id).count())
  75. with new_revision(content):
  76. time.sleep(0.00001)
  77. content.description = 'TEST_CONTENT_DESCRIPTION_1_UPDATED_2'
  78. content.label = 'TEST_CONTENT_1_UPDATED_2'
  79. self.session.flush()
  80. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_1_UPDATED_2').count())
  81. eq_(1, self.session.query(Content).filter(Content.id == created_content.id).count())
  82. revision_1 = self.session.query(ContentRevisionRO)\
  83. .filter(ContentRevisionRO.description == 'TEST_CONTENT_DESCRIPTION_1').one()
  84. revision_2 = self.session.query(ContentRevisionRO)\
  85. .filter(ContentRevisionRO.description == 'TEST_CONTENT_DESCRIPTION_1_UPDATED').one()
  86. revision_3 = self.session.query(ContentRevisionRO)\
  87. .filter(ContentRevisionRO.description == 'TEST_CONTENT_DESCRIPTION_1_UPDATED_2').one()
  88. # Updated dates must be different
  89. ok_(revision_1.updated < revision_2.updated < revision_3.updated)
  90. # Created dates must be equal
  91. ok_(revision_1.created == revision_2.created == revision_3.created)
  92. def test_creates(self):
  93. eq_(0, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_1').count())
  94. eq_(0, self.session.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_1').count())
  95. user_admin = self.session.query(User).filter(User.email == 'admin@admin.admin').one()
  96. workspace = Workspace(label="TEST_WORKSPACE_1")
  97. self.session.add(workspace)
  98. self.session.flush()
  99. eq_(1, self.session.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_1').count())
  100. first_content = self._create_content(
  101. owner=user_admin,
  102. workspace=workspace,
  103. type=ContentType.Page,
  104. label='TEST_CONTENT_1',
  105. description='TEST_CONTENT_DESCRIPTION_1',
  106. revision_type=ActionDescription.CREATION,
  107. is_deleted=False,
  108. is_archived=False,
  109. )
  110. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_1').count())
  111. content = self.session.query(Content).filter(Content.id == first_content.id).one()
  112. eq_('TEST_CONTENT_1', content.label)
  113. eq_('TEST_CONTENT_DESCRIPTION_1', content.description)
  114. # Create a second content
  115. second_content = self._create_content(
  116. owner=user_admin,
  117. workspace=workspace,
  118. type=ContentType.Page,
  119. label='TEST_CONTENT_2',
  120. description='TEST_CONTENT_DESCRIPTION_2',
  121. revision_type=ActionDescription.CREATION
  122. )
  123. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_2').count())
  124. content = self.session.query(Content).filter(Content.id == second_content.id).one()
  125. eq_('TEST_CONTENT_2', content.label)
  126. eq_('TEST_CONTENT_DESCRIPTION_2', content.description)
  127. def test_create(self, key='1'):
  128. eq_(0, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_%s' % key).count())
  129. eq_(0, self.session.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_%s' % key).count())
  130. user_admin = self.session.query(User).filter(User.email == 'admin@admin.admin').one()
  131. workspace = Workspace(label="TEST_WORKSPACE_%s" % key)
  132. self.session.add(workspace)
  133. self.session.flush()
  134. eq_(1, self.session.query(Workspace).filter(Workspace.label == 'TEST_WORKSPACE_%s' % key).count())
  135. created_content = self._create_content(
  136. owner=user_admin,
  137. workspace=workspace,
  138. type=ContentType.Page,
  139. label='TEST_CONTENT_%s' % key,
  140. description='TEST_CONTENT_DESCRIPTION_%s' % key,
  141. revision_type=ActionDescription.CREATION
  142. )
  143. eq_(1, self.session.query(ContentRevisionRO).filter(ContentRevisionRO.label == 'TEST_CONTENT_%s' % key).count())
  144. content = self.session.query(Content).filter(Content.id == created_content.id).one()
  145. eq_('TEST_CONTENT_%s' % key, content.label)
  146. eq_('TEST_CONTENT_DESCRIPTION_%s' % key, content.description)
  147. return created_content
  148. def _get_user(self):
  149. email = 'admin@admin.admin'
  150. user_query = self.session.query(User)
  151. user_filter = user_query.filter(User.email == email)
  152. user = user_filter.one()
  153. return user
  154. def _create_content(self, *args, **kwargs):
  155. content = Content(*args, **kwargs)
  156. self.session.add(content)
  157. self.session.flush()
  158. return content
  159. def _create_content_from_nothing(self):
  160. user_admin = self._get_user()
  161. workspace = Workspace(label="TEST_WORKSPACE_1")
  162. content = self._create_content(
  163. owner=user_admin,
  164. workspace=workspace,
  165. type=ContentType.File,
  166. label='TEST_CONTENT_1',
  167. description='TEST_CONTENT_DESCRIPTION_1',
  168. revision_type=ActionDescription.CREATION,
  169. )
  170. return content
  171. def test_unit__content_depot_file(self):
  172. """ Depot file access thought content property methods. """
  173. content = self._create_content_from_nothing()
  174. # tests uninitialized depot file
  175. eq_(content.depot_file, None)
  176. # initializes depot file
  177. # which is able to behave like a python file object
  178. content.depot_file = b'test'
  179. # tests initialized depot file
  180. ok_(content.depot_file)
  181. # tests type of initialized depot file
  182. eq_(type(content.depot_file), UploadedFile)
  183. # tests content of initialized depot file
  184. # using depot_file.file of type StoredFile to fetch content back
  185. eq_(content.depot_file.file.read(), b'test')