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() |