--- a/server/test/unittest_repository.py Wed Mar 31 14:32:19 2010 +0200
+++ b/server/test/unittest_repository.py Wed Mar 31 14:46:04 2010 +0200
@@ -8,6 +8,8 @@
"""
from __future__ import with_statement
+from __future__ import with_statement
+
import os
import sys
import threading
@@ -21,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
@@ -273,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()
@@ -284,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):
@@ -358,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):