diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-17 20:06:16 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-17 20:06:16 -0400 |
| commit | 530d3f07e0c1e70e0f9b80d3b5986253e06dcaf2 (patch) | |
| tree | fccbb61ff4f3d869a7475e42f095421d37f4c270 /test | |
| parent | 2de7f94739ec1873e1dce48797e1e6f12044cf4c (diff) | |
| download | sqlalchemy-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.py | 46 |
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) |
