server/test/unittest_repository.py
changeset 5121 a63d7886fcf5
parent 5115 2e43ef618d14
child 5126 c869d8e7d166
equal deleted inserted replaced
5082:d6fd82a5a4e8 5121:a63d7886fcf5
     4 :organization: Logilab
     4 :organization: Logilab
     5 :copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     5 :copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     6 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     8 """
     8 """
       
     9 from __future__ import with_statement
       
    10 
       
    11 from __future__ import with_statement
     9 
    12 
    10 import os
    13 import os
    11 import sys
    14 import sys
    12 import threading
    15 import threading
    13 import time
    16 import time
    18 
    21 
    19 from yams.constraints import UniqueConstraint
    22 from yams.constraints import UniqueConstraint
    20 
    23 
    21 from cubicweb import (BadConnectionId, RepositoryError, ValidationError,
    24 from cubicweb import (BadConnectionId, RepositoryError, ValidationError,
    22                       UnknownEid, AuthenticationError)
    25                       UnknownEid, AuthenticationError)
       
    26 from cubicweb.selectors import implements
    23 from cubicweb.schema import CubicWebSchema, RQLConstraint
    27 from cubicweb.schema import CubicWebSchema, RQLConstraint
    24 from cubicweb.dbapi import connect, multiple_connections_unfix
    28 from cubicweb.dbapi import connect, multiple_connections_unfix
    25 from cubicweb.devtools.testlib import CubicWebTC
    29 from cubicweb.devtools.testlib import CubicWebTC
    26 from cubicweb.devtools.repotest import tuplify
    30 from cubicweb.devtools.repotest import tuplify
    27 from cubicweb.server import repository, hook
    31 from cubicweb.server import repository, hook
    28 from cubicweb.server.sqlutils import SQL_PREFIX
    32 from cubicweb.server.sqlutils import SQL_PREFIX
       
    33 from cubicweb.server.hook import Hook
    29 from cubicweb.server.sources import native
    34 from cubicweb.server.sources import native
    30 
    35 
    31 # start name server anyway, process will fail if already running
    36 # start name server anyway, process will fail if already running
    32 os.system('pyro-ns >/dev/null 2>/dev/null &')
    37 os.system('pyro-ns >/dev/null 2>/dev/null &')
    33 
    38 
   270         finally:
   275         finally:
   271             repository.pyro_unregister(self.repo.config)
   276             repository.pyro_unregister(self.repo.config)
   272             from logilab.common import pyro_ext
   277             from logilab.common import pyro_ext
   273             pyro_ext._DAEMONS.clear()
   278             pyro_ext._DAEMONS.clear()
   274 
   279 
       
   280 
   275     def _pyro_client(self, done):
   281     def _pyro_client(self, done):
   276         cnx = connect(self.repo.config.appid, u'admin', password='gingkow')
   282         cnx = connect(self.repo.config.appid, u'admin', password='gingkow',
       
   283                       initlog=False) # don't reset logging configuration
   277         try:
   284         try:
   278             # check we can get the schema
   285             # check we can get the schema
   279             schema = cnx.get_schema()
   286             schema = cnx.get_schema()
   280             self.assertEquals(schema.__hashmode__, None)
   287             self.assertEquals(schema.__hashmode__, None)
   281             cu = cnx.cursor()
   288             cu = cnx.cursor()
   282             rset = cu.execute('Any U,G WHERE U in_group G')
   289             rset = cu.execute('Any U,G WHERE U in_group G')
   283             cnx.close()
   290             cnx.close()
   284             done.append(True)
   291             done.append(True)
   285         finally:
   292         finally:
   286             # connect monkey path some method by default, remove them
   293             # connect monkey patch some method by default, remove them
   287             multiple_connections_unfix()
   294             multiple_connections_unfix()
   288 
   295 
   289     def test_internal_api(self):
   296     def test_internal_api(self):
   290         repo = self.repo
   297         repo = self.repo
   291         cnxid = repo.connect(self.admlogin, password=self.admpassword)
   298         cnxid = repo.connect(self.admlogin, password=self.admpassword)
   355                             {'x': note.eid})
   362                             {'x': note.eid})
   356         self.assertEquals(len(rset), 1)
   363         self.assertEquals(len(rset), 1)
   357         self.assertEquals(rset.rows[0][0], p2.eid)
   364         self.assertEquals(rset.rows[0][0], p2.eid)
   358 
   365 
   359 
   366 
       
   367     def test_set_attributes_in_before_update(self):
       
   368         # local hook
       
   369         class DummyBeforeHook(Hook):
       
   370             __regid__ = 'dummy-before-hook'
       
   371             __select__ = Hook.__select__ & implements('EmailAddress')
       
   372             events = ('before_update_entity',)
       
   373             def __call__(self):
       
   374                 # safety belt: avoid potential infinite recursion if the test
       
   375                 #              fails (i.e. RuntimeError not raised)
       
   376                 pendings = self._cw.transaction_data.setdefault('pending', set())
       
   377                 if self.entity.eid not in pendings:
       
   378                     pendings.add(self.entity.eid)
       
   379                     self.entity.set_attributes(alias=u'foo')
       
   380         with self.temporary_appobjects(DummyBeforeHook):
       
   381             req = self.request()
       
   382             addr = req.create_entity('EmailAddress', address=u'a@b.fr')
       
   383             addr.set_attributes(address=u'a@b.com')
       
   384             rset = self.execute('Any A,AA WHERE X eid %(x)s, X address A, X alias AA',
       
   385                                 {'x': addr.eid})
       
   386             self.assertEquals(rset.rows, [[u'a@b.com', u'foo']])
       
   387 
       
   388     def test_set_attributes_in_before_add(self):
       
   389         # local hook
       
   390         class DummyBeforeHook(Hook):
       
   391             __regid__ = 'dummy-before-hook'
       
   392             __select__ = Hook.__select__ & implements('EmailAddress')
       
   393             events = ('before_add_entity',)
       
   394             def __call__(self):
       
   395                 # set_attributes is forbidden within before_add_entity()
       
   396                 self.entity.set_attributes(alias=u'foo')
       
   397         with self.temporary_appobjects(DummyBeforeHook):
       
   398             req = self.request()
       
   399             self.assertRaises(RepositoryError, req.create_entity,
       
   400                               'EmailAddress', address=u'a@b.fr')
       
   401 
       
   402 
   360 class DataHelpersTC(CubicWebTC):
   403 class DataHelpersTC(CubicWebTC):
   361 
   404 
   362     def test_create_eid(self):
   405     def test_create_eid(self):
   363         self.session.set_pool()
   406         self.session.set_pool()
   364         self.assert_(self.repo.system_source.create_eid(self.session))
   407         self.assert_(self.repo.system_source.create_eid(self.session))
   400 
   443 
   401 
   444 
   402 class FTITC(CubicWebTC):
   445 class FTITC(CubicWebTC):
   403 
   446 
   404     def test_reindex_and_modified_since(self):
   447     def test_reindex_and_modified_since(self):
       
   448         self.repo.system_source.multisources_etypes.add('Personne')
   405         eidp = self.execute('INSERT Personne X: X nom "toto", X prenom "tutu"')[0][0]
   449         eidp = self.execute('INSERT Personne X: X nom "toto", X prenom "tutu"')[0][0]
   406         self.commit()
   450         self.commit()
   407         ts = datetime.now()
   451         ts = datetime.now()
   408         self.assertEquals(len(self.execute('Personne X WHERE X has_text "tutu"')), 1)
   452         self.assertEquals(len(self.execute('Personne X WHERE X has_text "tutu"')), 1)
   409         self.session.set_pool()
   453         self.session.set_pool()
   482 class InlineRelHooksTC(CubicWebTC):
   526 class InlineRelHooksTC(CubicWebTC):
   483     """test relation hooks are called for inlined relations
   527     """test relation hooks are called for inlined relations
   484     """
   528     """
   485     def setUp(self):
   529     def setUp(self):
   486         CubicWebTC.setUp(self)
   530         CubicWebTC.setUp(self)
   487         self.hm = self.repo.hm
       
   488         CALLED[:] = ()
   531         CALLED[:] = ()
   489 
   532 
   490     def _after_relation_hook(self, pool, fromeid, rtype, toeid):
   533     def _after_relation_hook(self, pool, fromeid, rtype, toeid):
   491         self.called.append((fromeid, rtype, toeid))
   534         self.called.append((fromeid, rtype, toeid))
   492 
   535 
   498             events = ('before_add_relation', 'after_add_relation',
   541             events = ('before_add_relation', 'after_add_relation',
   499                       'before_delete_relation', 'after_delete_relation')
   542                       'before_delete_relation', 'after_delete_relation')
   500             def __call__(self):
   543             def __call__(self):
   501                 CALLED.append((self.event, self.eidfrom, self.rtype, self.eidto))
   544                 CALLED.append((self.event, self.eidfrom, self.rtype, self.eidto))
   502 
   545 
   503         self.hm.register(EcritParHook)
   546         with self.temporary_appobjects(EcritParHook):
   504         eidp = self.execute('INSERT Personne X: X nom "toto"')[0][0]
   547             eidp = self.execute('INSERT Personne X: X nom "toto"')[0][0]
   505         eidn = self.execute('INSERT Note X: X type "T"')[0][0]
   548             eidn = self.execute('INSERT Note X: X type "T"')[0][0]
   506         self.execute('SET N ecrit_par Y WHERE N type "T", Y nom "toto"')
   549             self.execute('SET N ecrit_par Y WHERE N type "T", Y nom "toto"')
   507         self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp),
   550             self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp),
   508                                    ('after_add_relation', eidn, 'ecrit_par', eidp)])
   551                                        ('after_add_relation', eidn, 'ecrit_par', eidp)])
   509         CALLED[:] = ()
   552             CALLED[:] = ()
   510         self.execute('DELETE N ecrit_par Y WHERE N type "T", Y nom "toto"')
   553             self.execute('DELETE N ecrit_par Y WHERE N type "T", Y nom "toto"')
   511         self.assertEquals(CALLED, [('before_delete_relation', eidn, 'ecrit_par', eidp),
   554             self.assertEquals(CALLED, [('before_delete_relation', eidn, 'ecrit_par', eidp),
   512                                    ('after_delete_relation', eidn, 'ecrit_par', eidp)])
   555                                        ('after_delete_relation', eidn, 'ecrit_par', eidp)])
   513         CALLED[:] = ()
   556             CALLED[:] = ()
   514         eidn = self.execute('INSERT Note N: N ecrit_par P WHERE P nom "toto"')[0][0]
   557             eidn = self.execute('INSERT Note N: N ecrit_par P WHERE P nom "toto"')[0][0]
   515         self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp),
   558             self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp),
   516                                    ('after_add_relation', eidn, 'ecrit_par', eidp)])
   559                                        ('after_add_relation', eidn, 'ecrit_par', eidp)])
   517 
   560 
   518 
   561 
   519 if __name__ == '__main__':
   562 if __name__ == '__main__':
   520     unittest_main()
   563     unittest_main()