diff -r d6fd82a5a4e8 -r a63d7886fcf5 server/test/unittest_repository.py --- a/server/test/unittest_repository.py Tue Mar 30 14:32:03 2010 +0200 +++ b/server/test/unittest_repository.py Wed Mar 31 15:39:09 2010 +0200 @@ -6,6 +6,9 @@ :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses """ +from __future__ import with_statement + +from __future__ import with_statement import os import sys @@ -20,12 +23,14 @@ from cubicweb import (BadConnectionId, RepositoryError, ValidationError, UnknownEid, AuthenticationError) +from cubicweb.selectors import implements from cubicweb.schema import CubicWebSchema, RQLConstraint from cubicweb.dbapi import connect, multiple_connections_unfix from cubicweb.devtools.testlib import CubicWebTC from cubicweb.devtools.repotest import tuplify from cubicweb.server import repository, hook from cubicweb.server.sqlutils import SQL_PREFIX +from cubicweb.server.hook import Hook from cubicweb.server.sources import native # start name server anyway, process will fail if already running @@ -272,8 +277,10 @@ from logilab.common import pyro_ext pyro_ext._DAEMONS.clear() + def _pyro_client(self, done): - cnx = connect(self.repo.config.appid, u'admin', password='gingkow') + cnx = connect(self.repo.config.appid, u'admin', password='gingkow', + initlog=False) # don't reset logging configuration try: # check we can get the schema schema = cnx.get_schema() @@ -283,7 +290,7 @@ cnx.close() done.append(True) finally: - # connect monkey path some method by default, remove them + # connect monkey patch some method by default, remove them multiple_connections_unfix() def test_internal_api(self): @@ -357,6 +364,42 @@ self.assertEquals(rset.rows[0][0], p2.eid) + def test_set_attributes_in_before_update(self): + # local hook + class DummyBeforeHook(Hook): + __regid__ = 'dummy-before-hook' + __select__ = Hook.__select__ & implements('EmailAddress') + events = ('before_update_entity',) + def __call__(self): + # safety belt: avoid potential infinite recursion if the test + # fails (i.e. RuntimeError not raised) + pendings = self._cw.transaction_data.setdefault('pending', set()) + if self.entity.eid not in pendings: + pendings.add(self.entity.eid) + self.entity.set_attributes(alias=u'foo') + with self.temporary_appobjects(DummyBeforeHook): + req = self.request() + addr = req.create_entity('EmailAddress', address=u'a@b.fr') + addr.set_attributes(address=u'a@b.com') + rset = self.execute('Any A,AA WHERE X eid %(x)s, X address A, X alias AA', + {'x': addr.eid}) + self.assertEquals(rset.rows, [[u'a@b.com', u'foo']]) + + def test_set_attributes_in_before_add(self): + # local hook + class DummyBeforeHook(Hook): + __regid__ = 'dummy-before-hook' + __select__ = Hook.__select__ & implements('EmailAddress') + events = ('before_add_entity',) + def __call__(self): + # set_attributes is forbidden within before_add_entity() + self.entity.set_attributes(alias=u'foo') + with self.temporary_appobjects(DummyBeforeHook): + req = self.request() + self.assertRaises(RepositoryError, req.create_entity, + 'EmailAddress', address=u'a@b.fr') + + class DataHelpersTC(CubicWebTC): def test_create_eid(self): @@ -402,6 +445,7 @@ class FTITC(CubicWebTC): def test_reindex_and_modified_since(self): + self.repo.system_source.multisources_etypes.add('Personne') eidp = self.execute('INSERT Personne X: X nom "toto", X prenom "tutu"')[0][0] self.commit() ts = datetime.now() @@ -484,7 +528,6 @@ """ def setUp(self): CubicWebTC.setUp(self) - self.hm = self.repo.hm CALLED[:] = () def _after_relation_hook(self, pool, fromeid, rtype, toeid): @@ -500,20 +543,20 @@ def __call__(self): CALLED.append((self.event, self.eidfrom, self.rtype, self.eidto)) - self.hm.register(EcritParHook) - eidp = self.execute('INSERT Personne X: X nom "toto"')[0][0] - eidn = self.execute('INSERT Note X: X type "T"')[0][0] - self.execute('SET N ecrit_par Y WHERE N type "T", Y nom "toto"') - self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp), - ('after_add_relation', eidn, 'ecrit_par', eidp)]) - CALLED[:] = () - self.execute('DELETE N ecrit_par Y WHERE N type "T", Y nom "toto"') - self.assertEquals(CALLED, [('before_delete_relation', eidn, 'ecrit_par', eidp), - ('after_delete_relation', eidn, 'ecrit_par', eidp)]) - CALLED[:] = () - eidn = self.execute('INSERT Note N: N ecrit_par P WHERE P nom "toto"')[0][0] - self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp), - ('after_add_relation', eidn, 'ecrit_par', eidp)]) + with self.temporary_appobjects(EcritParHook): + eidp = self.execute('INSERT Personne X: X nom "toto"')[0][0] + eidn = self.execute('INSERT Note X: X type "T"')[0][0] + self.execute('SET N ecrit_par Y WHERE N type "T", Y nom "toto"') + self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp), + ('after_add_relation', eidn, 'ecrit_par', eidp)]) + CALLED[:] = () + self.execute('DELETE N ecrit_par Y WHERE N type "T", Y nom "toto"') + self.assertEquals(CALLED, [('before_delete_relation', eidn, 'ecrit_par', eidp), + ('after_delete_relation', eidn, 'ecrit_par', eidp)]) + CALLED[:] = () + eidn = self.execute('INSERT Note N: N ecrit_par P WHERE P nom "toto"')[0][0] + self.assertEquals(CALLED, [('before_add_relation', eidn, 'ecrit_par', eidp), + ('after_add_relation', eidn, 'ecrit_par', eidp)]) if __name__ == '__main__':