summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-17 20:06:16 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-17 20:06:16 -0400
commit530d3f07e0c1e70e0f9b80d3b5986253e06dcaf2 (patch)
treefccbb61ff4f3d869a7475e42f095421d37f4c270 /test
parent2de7f94739ec1873e1dce48797e1e6f12044cf4c (diff)
downloadsqlalchemy-530d3f07e0c1e70e0f9b80d3b5986253e06dcaf2.tar.gz
- Fixed bug where attribute "set" events or columns with
``@validates`` would have events triggered within the flush process, when those columns were the targets of a "fetch and populate" operation, such as an autoincremented primary key, a Python side default, or a server-side default "eagerly" fetched via RETURNING. fixes #3167
Diffstat (limited to 'test')
-rw-r--r--test/orm/test_unitofworkv2.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py
index c643e6a87..122fe2514 100644
--- a/test/orm/test_unitofworkv2.py
+++ b/test/orm/test_unitofworkv2.py
@@ -9,8 +9,9 @@ from sqlalchemy import Integer, String, ForeignKey, func
from sqlalchemy.orm import mapper, relationship, backref, \
create_session, unitofwork, attributes,\
Session, exc as orm_exc
-
+from sqlalchemy.testing.mock import Mock
from sqlalchemy.testing.assertsql import AllOf, CompiledSQL
+from sqlalchemy import event
class AssertsUOW(object):
@@ -1703,3 +1704,46 @@ class LoadersUsingCommittedTest(UOWTest):
sess.flush()
except AvoidReferencialError:
pass
+
+
+class NoAttrEventInFlushTest(fixtures.MappedTest):
+ """test [ticket:3167]"""
+
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table(
+ 'test', metadata,
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
+ Column('prefetch_val', Integer, default=5),
+ Column('returning_val', Integer, server_default="5")
+ )
+
+ @classmethod
+ def setup_classes(cls):
+ class Thing(cls.Basic):
+ pass
+
+ @classmethod
+ def setup_mappers(cls):
+ Thing = cls.classes.Thing
+
+ mapper(Thing, cls.tables.test, eager_defaults=True)
+
+ def test_no_attr_events_flush(self):
+ Thing = self.classes.Thing
+ mock = Mock()
+ event.listen(Thing.id, "set", mock.id)
+ event.listen(Thing.prefetch_val, "set", mock.prefetch_val)
+ event.listen(Thing.returning_val, "set", mock.prefetch_val)
+ t1 = Thing()
+ s = Session()
+ s.add(t1)
+ s.flush()
+
+ eq_(len(mock.mock_calls), 0)
+ eq_(t1.id, 1)
+ eq_(t1.prefetch_val, 5)
+ eq_(t1.returning_val, 5)