__init__.py 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # -*- coding: utf-8 -*-
  2. import unittest
  3. import transaction
  4. from depot.manager import DepotManager
  5. from pyramid import testing
  6. from sqlalchemy.exc import IntegrityError
  7. from tracim.command.initializedb import InitializeDBCommand
  8. from tracim.lib.core.content import ContentApi
  9. from tracim.lib.core.workspace import WorkspaceApi
  10. from tracim.models import get_engine, DeclarativeBase, get_session_factory, \
  11. get_tm_session
  12. from tracim.models.data import Workspace, ContentType
  13. from tracim.models.data import Content
  14. from tracim.lib.utils.logger import logger
  15. from tracim.fixtures import FixturesLoader
  16. from tracim.fixtures.users_and_groups import Base as BaseFixture
  17. from tracim.config import CFG
  18. from tracim.extensions import hapic
  19. from tracim import main
  20. from webtest import TestApp
  21. def eq_(a, b, msg=None):
  22. # TODO - G.M - 05-04-2018 - Remove this when all old nose code is removed
  23. assert a == b, msg or "%r != %r" % (a, b)
  24. class FunctionalTest(unittest.TestCase):
  25. fixtures = [BaseFixture]
  26. sqlalchemy_url = 'sqlite:///tracim_test.sqlite'
  27. def setUp(self):
  28. DepotManager._clear()
  29. settings = {
  30. 'sqlalchemy.url': self.sqlalchemy_url,
  31. 'user.auth_token.validity': '604800',
  32. 'depot_storage_dir': '/tmp/test/depot',
  33. 'depot_storage_name': 'test',
  34. 'preview_cache_dir': '/tmp/test/preview_cache',
  35. }
  36. hapic.reset_context()
  37. app = main({}, **settings)
  38. self.init_database(settings)
  39. self.testapp = TestApp(app)
  40. def init_database(self, settings):
  41. self.engine = get_engine(settings)
  42. DeclarativeBase.metadata.create_all(self.engine)
  43. session_factory = get_session_factory(self.engine)
  44. app_config = CFG(settings)
  45. with transaction.manager:
  46. dbsession = get_tm_session(session_factory, transaction.manager)
  47. try:
  48. fixtures_loader = FixturesLoader(dbsession, app_config)
  49. fixtures_loader.loads(self.fixtures)
  50. transaction.commit()
  51. print("Database initialized.")
  52. except IntegrityError:
  53. print('Warning, there was a problem when adding default data'
  54. ', it may have already been added:')
  55. import traceback
  56. print(traceback.format_exc())
  57. transaction.abort()
  58. print('Database initialization failed')
  59. def tearDown(self):
  60. logger.debug(self, 'TearDown Test...')
  61. from tracim.models.meta import DeclarativeBase
  62. testing.tearDown()
  63. transaction.abort()
  64. DeclarativeBase.metadata.drop_all(self.engine)
  65. DepotManager._clear()
  66. class FunctionalTestEmptyDB(FunctionalTest):
  67. fixtures = []
  68. class FunctionalTestNoDB(FunctionalTest):
  69. sqlalchemy_url = 'sqlite://'
  70. def init_database(self, settings):
  71. self.engine = get_engine(settings)
  72. class BaseTest(unittest.TestCase):
  73. """
  74. Pyramid default test.
  75. """
  76. def setUp(self):
  77. logger.debug(self, 'Setup Test...')
  78. self.config = testing.setUp(settings={
  79. 'sqlalchemy.url': 'sqlite:///:memory:',
  80. 'user.auth_token.validity': '604800',
  81. 'depot_storage_dir': '/tmp/test/depot',
  82. 'depot_storage_name': 'test',
  83. 'preview_cache_dir': '/tmp/test/preview_cache',
  84. })
  85. self.config.include('tracim.models')
  86. DepotManager._clear()
  87. DepotManager.configure(
  88. 'test', {'depot.backend': 'depot.io.memory.MemoryFileStorage'}
  89. )
  90. settings = self.config.get_settings()
  91. self.app_config = CFG(settings)
  92. from tracim.models import (
  93. get_engine,
  94. get_session_factory,
  95. get_tm_session,
  96. )
  97. self.engine = get_engine(settings)
  98. session_factory = get_session_factory(self.engine)
  99. self.session = get_tm_session(session_factory, transaction.manager)
  100. self.init_database()
  101. def init_database(self):
  102. logger.debug(self, 'Init Database Schema...')
  103. from tracim.models.meta import DeclarativeBase
  104. DeclarativeBase.metadata.create_all(self.engine)
  105. def tearDown(self):
  106. logger.debug(self, 'TearDown Test...')
  107. from tracim.models.meta import DeclarativeBase
  108. testing.tearDown()
  109. transaction.abort()
  110. DeclarativeBase.metadata.drop_all(self.engine)
  111. class StandardTest(BaseTest):
  112. """
  113. BaseTest with default fixtures
  114. """
  115. fixtures = [BaseFixture]
  116. def init_database(self):
  117. BaseTest.init_database(self)
  118. fixtures_loader = FixturesLoader(
  119. session=self.session,
  120. config=CFG(self.config.get_settings()))
  121. fixtures_loader.loads(self.fixtures)
  122. class DefaultTest(StandardTest):
  123. def _create_workspace_and_test(self, name, user) -> Workspace:
  124. """
  125. All extra parameters (*args, **kwargs) are for Workspace init
  126. :return: Created workspace instance
  127. """
  128. WorkspaceApi(
  129. current_user=user,
  130. session=self.session,
  131. ).create_workspace(name, save_now=True)
  132. eq_(
  133. 1,
  134. self.session.query(Workspace).filter(
  135. Workspace.label == name
  136. ).count()
  137. )
  138. return self.session.query(Workspace).filter(
  139. Workspace.label == name
  140. ).one()
  141. def _create_content_and_test(
  142. self,
  143. name,
  144. workspace,
  145. *args,
  146. **kwargs
  147. ) -> Content:
  148. """
  149. All extra parameters (*args, **kwargs) are for Content init
  150. :return: Created Content instance
  151. """
  152. content = Content(*args, **kwargs)
  153. content.label = name
  154. content.workspace = workspace
  155. self.session.add(content)
  156. self.session.flush()
  157. content_api = ContentApi(
  158. current_user=None,
  159. session=self.session,
  160. config=self.app_config,
  161. )
  162. eq_(
  163. 1,
  164. content_api.get_canonical_query().filter(
  165. Content.label == name
  166. ).count()
  167. )
  168. return content_api.get_canonical_query().filter(
  169. Content.label == name
  170. ).one()
  171. def _create_thread_and_test(self,
  172. user,
  173. workspace_name='workspace_1',
  174. folder_name='folder_1',
  175. thread_name='thread_1') -> Content:
  176. """
  177. :return: Thread
  178. """
  179. workspace = self._create_workspace_and_test(workspace_name, user)
  180. folder = self._create_content_and_test(
  181. folder_name, workspace,
  182. type=ContentType.Folder,
  183. owner=user
  184. )
  185. thread = self._create_content_and_test(
  186. thread_name,
  187. workspace,
  188. type=ContentType.Thread,
  189. parent=folder,
  190. owner=user
  191. )
  192. return thread