__init__.py 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # -*- coding: utf-8 -*-
  2. import unittest
  3. import transaction
  4. from depot.manager import DepotManager
  5. from pyramid import testing
  6. from nose.tools import eq_
  7. from tracim.lib.core.content import ContentApi
  8. from tracim.lib.core.workspace import WorkspaceApi
  9. from tracim.models.data import Workspace, ContentType
  10. from tracim.models.data import Content
  11. from tracim.lib.utils.logger import logger
  12. from tracim.fixtures import FixturesLoader
  13. from tracim.fixtures.users_and_groups import Base as BaseFixture
  14. from tracim.config import CFG
  15. class BaseTest(unittest.TestCase):
  16. """
  17. Pyramid default test.
  18. """
  19. def setUp(self):
  20. logger.debug(self, 'Setup Test...')
  21. self.config = testing.setUp(settings={
  22. 'sqlalchemy.url': 'sqlite:///:memory:',
  23. 'user.auth_token.validity': '604800',
  24. 'depot_storage_dir': '/tmp/test/depot',
  25. 'depot_storage_name': 'test',
  26. 'preview_cache_dir': '/tmp/test/preview_cache',
  27. })
  28. self.config.include('tracim.models')
  29. DepotManager._clear()
  30. DepotManager.configure(
  31. 'test', {'depot.backend': 'depot.io.memory.MemoryFileStorage'}
  32. )
  33. settings = self.config.get_settings()
  34. self.app_config = CFG(settings)
  35. from tracim.models import (
  36. get_engine,
  37. get_session_factory,
  38. get_tm_session,
  39. )
  40. self.engine = get_engine(settings)
  41. session_factory = get_session_factory(self.engine)
  42. self.session = get_tm_session(session_factory, transaction.manager)
  43. self.init_database()
  44. def init_database(self):
  45. logger.debug(self, 'Init Database Schema...')
  46. from tracim.models.meta import DeclarativeBase
  47. DeclarativeBase.metadata.create_all(self.engine)
  48. def tearDown(self):
  49. logger.debug(self, 'TearDown Test...')
  50. from tracim.models.meta import DeclarativeBase
  51. testing.tearDown()
  52. transaction.abort()
  53. DeclarativeBase.metadata.drop_all(self.engine)
  54. class StandardTest(BaseTest):
  55. """
  56. BaseTest with default fixtures
  57. """
  58. fixtures = [BaseFixture]
  59. def init_database(self):
  60. BaseTest.init_database(self)
  61. fixtures_loader = FixturesLoader(
  62. session=self.session,
  63. config=CFG(self.config.get_settings()))
  64. fixtures_loader.loads(self.fixtures)
  65. class DefaultTest(StandardTest):
  66. def _create_workspace_and_test(self, name, user) -> Workspace:
  67. """
  68. All extra parameters (*args, **kwargs) are for Workspace init
  69. :return: Created workspace instance
  70. """
  71. WorkspaceApi(
  72. current_user=user,
  73. session=self.session,
  74. ).create_workspace(name, save_now=True)
  75. eq_(
  76. 1,
  77. self.session.query(Workspace).filter(
  78. Workspace.label == name
  79. ).count()
  80. )
  81. return self.session.query(Workspace).filter(
  82. Workspace.label == name
  83. ).one()
  84. def _create_content_and_test(
  85. self,
  86. name,
  87. workspace,
  88. *args,
  89. **kwargs
  90. ) -> Content:
  91. """
  92. All extra parameters (*args, **kwargs) are for Content init
  93. :return: Created Content instance
  94. """
  95. content = Content(*args, **kwargs)
  96. content.label = name
  97. content.workspace = workspace
  98. self.session.add(content)
  99. self.session.flush()
  100. content_api = ContentApi(
  101. current_user=None,
  102. session=self.session,
  103. config=self.app_config,
  104. )
  105. eq_(
  106. 1,
  107. content_api.get_canonical_query().filter(
  108. Content.label == name
  109. ).count()
  110. )
  111. return content_api.get_canonical_query().filter(
  112. Content.label == name
  113. ).one()
  114. def _create_thread_and_test(self,
  115. user,
  116. workspace_name='workspace_1',
  117. folder_name='folder_1',
  118. thread_name='thread_1') -> Content:
  119. """
  120. :return: Thread
  121. """
  122. workspace = self._create_workspace_and_test(workspace_name, user)
  123. folder = self._create_content_and_test(
  124. folder_name, workspace,
  125. type=ContentType.Folder,
  126. owner=user
  127. )
  128. thread = self._create_content_and_test(
  129. thread_name,
  130. workspace,
  131. type=ContentType.Thread,
  132. parent=folder,
  133. owner=user
  134. )
  135. return thread