Przeglądaj źródła

Fixtures management

Bastien Sevajol 9 lat temu
rodzic
commit
b2a8c1d9cc

+ 39 - 0
tracim/tracim/fixtures/__init__.py Wyświetl plik

@@ -0,0 +1,39 @@
1
+import transaction
2
+
3
+from tracim.model import DBSession
4
+
5
+
6
+class Fixture(object):
7
+
8
+    """ Fixture classes (list) required for this fixtures"""
9
+    require = NotImplemented
10
+
11
+    def __init__(self, session):
12
+        self._session = session
13
+
14
+    def insert(self):
15
+        raise NotImplementedError()
16
+
17
+
18
+class FixturesLoader(object):
19
+    """
20
+    Fixtures loader. Load each fixture once.
21
+    """
22
+
23
+    def __init__(self, loaded=None):
24
+        loaded = [] if loaded is None else loaded
25
+        self._loaded = loaded
26
+
27
+    def loads(self, fixtures_classes):
28
+        for fixture_class in fixtures_classes:
29
+            for required_fixture_class in fixture_class.require:
30
+                self._load(required_fixture_class)
31
+            self._load(fixture_class)
32
+
33
+    def _load(self, fixture_class):
34
+        if fixture_class not in self._loaded:
35
+            fixture = fixture_class(DBSession)
36
+            fixture.insert()
37
+            self._loaded.append(fixture_class)
38
+            DBSession.flush()
39
+            transaction.commit()

+ 49 - 0
tracim/tracim/fixtures/users_and_groups.py Wyświetl plik

@@ -0,0 +1,49 @@
1
+# -*- coding: utf-8 -*-
2
+from tracim import model
3
+from tracim.fixtures import Fixture
4
+
5
+
6
+class Base(Fixture):
7
+    require = []
8
+
9
+    def insert(self):
10
+        u = model.User()
11
+        u.display_name = 'Global manager'
12
+        u.email = 'admin@admin.admin'
13
+        u.password = 'admin@admin.admin'
14
+        self._session.add(u)
15
+
16
+        g1 = model.Group()
17
+        g1.group_id = 1
18
+        g1.group_name = 'users'
19
+        g1.display_name = 'Users'
20
+        g1.users.append(u)
21
+        self._session.add(g1)
22
+
23
+        g2 = model.Group()
24
+        g2.group_id = 2
25
+        g2.group_name = 'managers'
26
+        g2.display_name = 'Global Managers'
27
+        g2.users.append(u)
28
+        self._session.add(g2)
29
+
30
+        g3 = model.Group()
31
+        g3.group_id = 3
32
+        g3.group_name = 'administrators'
33
+        g3.display_name = 'Administrators'
34
+        g3.users.append(u)
35
+        self._session.add(g3)
36
+
37
+
38
+class Test(Fixture):
39
+    require = [Base, ]
40
+
41
+    def insert(self):
42
+        g2 = self._session.query(model.Group).filter(model.Group.group_name == 'managers').one()
43
+
44
+        lawrence = model.User()
45
+        lawrence.display_name = 'Lawrence L.'
46
+        lawrence.email = 'lawrence-not-real-email@fsf.org'
47
+        lawrence.password = 'foobarbaz'
48
+        self._session.add(lawrence)
49
+        g2.users.append(lawrence)

+ 12 - 1
tracim/tracim/tests/__init__.py Wyświetl plik

@@ -25,7 +25,8 @@ from tg.util import Bunch
25 25
 from webtest import TestApp as BaseTestApp, AppError
26 26
 from who_ldap import make_connection
27 27
 
28
-from tracim.command import BaseCommand
28
+from tracim.fixtures import FixturesLoader
29
+from tracim.fixtures.users_and_groups import Base as BaseFixture
29 30
 from tracim.lib.base import logger
30 31
 from tracim.model import DBSession
31 32
 
@@ -149,6 +150,7 @@ def teardown_db():
149 150
 class TestStandard(object):
150 151
 
151 152
     application_under_test = application_name
153
+    fixtures = [BaseFixture, ]
152 154
 
153 155
     def setUp(self):
154 156
         self.app = load_app(self.application_under_test)
@@ -168,6 +170,11 @@ class TestStandard(object):
168 170
         setup_db()
169 171
         logger.debug(self, 'Start Database Setup... -> done')
170 172
 
173
+        logger.debug(self, 'Load extra fixtures...')
174
+        fixtures_loader = FixturesLoader([BaseFixture])  # BaseFixture is already loaded in bootstrap
175
+        fixtures_loader.loads(self.fixtures)
176
+        logger.debug(self, 'Load extra fixtures... -> done')
177
+
171 178
         self.app.get('/_test_vars')  # Allow to create fake context
172 179
         tg.i18n.set_lang('en')  # Set a default lang
173 180
 
@@ -207,6 +214,7 @@ class TestController(object):
207 214
     """
208 215
 
209 216
     application_under_test = application_name
217
+    fixtures = [BaseFixture, ]
210 218
 
211 219
     def setUp(self):
212 220
         """Setup test fixture for each functional test method."""
@@ -220,6 +228,9 @@ class TestController(object):
220 228
         setup_app(section_name=self.application_under_test)
221 229
         setup_db()
222 230
 
231
+        fixtures_loader = FixturesLoader([BaseFixture])  # BaseFixture is already loaded in bootstrap
232
+        fixtures_loader.loads(self.fixtures)
233
+
223 234
 
224 235
     def tearDown(self):
225 236
         """Tear down test fixture for each functional test method."""

+ 2 - 0
tracim/tracim/tests/functional/test_ldap_authentication.py Wyświetl plik

@@ -5,6 +5,7 @@ Integration tests for the ldap authentication sub-system.
5 5
 from tracim.fixtures.ldap import ldap_test_server_fixtures
6 6
 from nose.tools import eq_, ok_
7 7
 
8
+from tracim.fixtures.users_and_groups import Test as TestFixture
8 9
 from tracim.model import DBSession, User
9 10
 from tracim.tests import LDAPTest, TracimTestController
10 11
 
@@ -12,6 +13,7 @@ from tracim.tests import LDAPTest, TracimTestController
12 13
 class TestAuthentication(LDAPTest, TracimTestController):
13 14
     application_under_test = 'ldap'
14 15
     ldap_server_data = ldap_test_server_fixtures
16
+    fixtures = [TestFixture, ]
15 17
 
16 18
     def test_ldap_auth_fail_no_account(self):
17 19
         # User is unknown in tracim database

+ 2 - 0
tracim/tracim/tests/functional/test_ldap_restrictions.py Wyświetl plik

@@ -5,6 +5,7 @@ from bs4 import BeautifulSoup
5 5
 from nose.tools import eq_, ok_
6 6
 
7 7
 from tracim.fixtures.ldap import ldap_test_server_fixtures
8
+from tracim.fixtures.users_and_groups import Test as TestFixture
8 9
 from tracim.lib.base import current_user
9 10
 from tracim.model import DBSession, User
10 11
 from tracim.tests import LDAPTest, TracimTestController
@@ -13,6 +14,7 @@ from tracim.tests import LDAPTest, TracimTestController
13 14
 class TestAuthentication(LDAPTest, TracimTestController):
14 15
     application_under_test = 'ldap'
15 16
     ldap_server_data = ldap_test_server_fixtures
17
+    fixtures = [TestFixture, ]
16 18
 
17 19
     def test_password_disabled(self):
18 20
         """

+ 2 - 0
tracim/tracim/tests/library/test_ldap_without_ldap_groups.py Wyświetl plik

@@ -3,6 +3,7 @@ from nose.tools import eq_
3 3
 from tg import config
4 4
 
5 5
 from tracim.fixtures.ldap import ldap_test_server_fixtures
6
+from tracim.fixtures.users_and_groups import Test as TestFixtures
6 7
 from tracim.lib.auth.ldap import LDAPAuth
7 8
 from tracim.lib.helpers import ini_conf_to_bool
8 9
 from tracim.model import DBSession, User, Group
@@ -15,6 +16,7 @@ class TestContentApi(LDAPTest, TestStandard):
15 16
     """
16 17
     application_under_test = 'ldap'
17 18
     ldap_server_data = ldap_test_server_fixtures
19
+    fixtures = [TestFixtures]
18 20
 
19 21
     def _check_db_user(self, email, count=1):
20 22
         eq_(count, DBSession.query(User).filter(User.email == email).count())

+ 6 - 43
tracim/tracim/websetup/bootstrap.py Wyświetl plik

@@ -2,57 +2,20 @@
2 2
 """Setup the tracim application"""
3 3
 from __future__ import print_function
4 4
 
5
-import logging
6
-from tg import config
7
-from tracim import model
8 5
 import transaction
9 6
 
7
+from tracim.fixtures import FixturesLoader
8
+from tracim.fixtures.users_and_groups import Base as BaseFixture
9
+
10
+
10 11
 def bootstrap(command, conf, vars):
11 12
     """Place any commands to setup tracim here"""
12 13
 
13 14
     # <websetup.bootstrap.before.auth
14 15
     from sqlalchemy.exc import IntegrityError
15 16
     try:
16
-        u = model.User()
17
-        u.display_name = 'Global manager'
18
-        u.email = 'admin@admin.admin'
19
-        u.password = 'admin@admin.admin'
20
-        model.DBSession.add(u)
21
-
22
-        g1 = model.Group()
23
-        g1.group_id = 1
24
-        g1.group_name = 'users'
25
-        g1.display_name = 'Users'
26
-        g1.users.append(u)
27
-        model.DBSession.add(g1)
28
-
29
-        g2 = model.Group()
30
-        g2.group_id = 2
31
-        g2.group_name = 'managers'
32
-        g2.display_name = 'Global Managers'
33
-        g2.users.append(u)
34
-        model.DBSession.add(g2)
35
-
36
-        g3 = model.Group()
37
-        g3.group_id = 3
38
-        g3.group_name = 'administrators'
39
-        g3.display_name = 'Administrators'
40
-        g3.users.append(u)
41
-        model.DBSession.add(g3)
42
-
43
-        # TODO: - B.S. - 20160212: Following fixture is LDAP tests specific, should make an little fixture management
44
-        # for tests
45
-        lawrence = model.User()
46
-        lawrence.display_name = 'Lawrence L.'
47
-        lawrence.email = 'lawrence-not-real-email@fsf.org'
48
-        lawrence.password = 'foobarbaz'
49
-        model.DBSession.add(lawrence)
50
-        g2.users.append(lawrence)
51
-
52
-        model.DBSession.flush()
53
-        transaction.commit()
54
-        pass
55
-
17
+        fixtures_loader = FixturesLoader()
18
+        fixtures_loader.loads([BaseFixture])
56 19
     except IntegrityError:
57 20
         print('Warning, there was a problem adding your auth data, it may have already been added:')
58 21
         import traceback