summaryrefslogtreecommitdiff
path: root/test/ext
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-10-26 12:41:18 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-10-26 12:41:18 -0400
commitd9adb2a4fd3e865d3c8d4f6f2e0a12d5c4036c97 (patch)
treec00b308c373d2dae57c09e65d206e4be619b1ab6 /test/ext
parent8301651428be5396b76f7d20c8f61b5558d5a971 (diff)
downloadsqlalchemy-d9adb2a4fd3e865d3c8d4f6f2e0a12d5c4036c97.tar.gz
- [bug] the value of a composite attribute is now
expired after an insert or update operation, instead of regenerated in place. This ensures that a column value which is expired within a flush will be loaded first, before the composite is regenerated using that value. [ticket:2309] - [bug] The fix in [ticket:2309] also emits the "refresh" event when the composite value is loaded on access, even if all column values were already present, as is appropriate. This fixes the "mutable" extension which relies upon the "load" event to ensure the _parents dictionary is up to date, fixes [ticket:2308]. Thanks to Scott Torborg for the test case here.
Diffstat (limited to 'test/ext')
-rw-r--r--test/ext/test_mutable.py43
1 files changed, 36 insertions, 7 deletions
diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py
index df4006c01..129a460b0 100644
--- a/test/ext/test_mutable.py
+++ b/test/ext/test_mutable.py
@@ -1,4 +1,4 @@
-from sqlalchemy import Integer, ForeignKey
+from sqlalchemy import Integer, ForeignKey, String
from sqlalchemy.types import PickleType, TypeDecorator, VARCHAR
from sqlalchemy.orm import mapper, Session, composite
from sqlalchemy.orm.mapper import Mapper
@@ -115,6 +115,17 @@ class _MutableDictTestBase(object):
f2.data['a'] = 'c'
assert f2 in sess.dirty
+ def test_unrelated_flush(self):
+ sess = Session()
+ f1 = Foo(data={"a":"b"}, unrelated_data="unrelated")
+ sess.add(f1)
+ sess.flush()
+ f1.unrelated_data = "unrelated 2"
+ sess.flush()
+ f1.data["a"] = "c"
+ sess.commit()
+ eq_(f1.data["a"], "c")
+
def _test_non_mutable(self):
sess = Session()
@@ -137,7 +148,8 @@ class MutableWithScalarPickleTest(_MutableDictTestBase, fixtures.MappedTest):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('skip', mutable_pickle),
Column('data', mutable_pickle),
- Column('non_mutable_data', PickleType)
+ Column('non_mutable_data', PickleType),
+ Column('unrelated_data', String(50))
)
def test_non_mutable(self):
@@ -170,7 +182,8 @@ class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', MutationDict.as_mutable(JSONEncodedDict)),
- Column('non_mutable_data', JSONEncodedDict)
+ Column('non_mutable_data', JSONEncodedDict),
+ Column('unrelated_data', String(50))
)
def test_non_mutable(self):
@@ -184,7 +197,8 @@ class MutableAssocWithAttrInheritTest(_MutableDictTestBase, fixtures.MappedTest)
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', PickleType),
- Column('non_mutable_data', PickleType)
+ Column('non_mutable_data', PickleType),
+ Column('unrelated_data', String(50))
)
Table('subfoo', metadata,
@@ -230,7 +244,8 @@ class MutableAssociationScalarPickleTest(_MutableDictTestBase, fixtures.MappedTe
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('skip', PickleType),
- Column('data', PickleType)
+ Column('data', PickleType),
+ Column('unrelated_data', String(50))
)
class MutableAssociationScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
@@ -260,7 +275,8 @@ class MutableAssociationScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
- Column('data', JSONEncodedDict)
+ Column('data', JSONEncodedDict),
+ Column('unrelated_data', String(50))
)
@@ -270,7 +286,8 @@ class _CompositeTestBase(object):
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('x', Integer),
- Column('y', Integer)
+ Column('y', Integer),
+ Column('unrelated_data', String(50))
)
def teardown(self):
@@ -374,6 +391,18 @@ class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
setattr, f1, 'data', 'foo'
)
+ def test_unrelated_flush(self):
+ sess = Session()
+ f1 = Foo(data=Point(3, 4), unrelated_data="unrelated")
+ sess.add(f1)
+ sess.flush()
+ f1.unrelated_data = "unrelated 2"
+ sess.flush()
+ f1.data.x = 5
+ sess.commit()
+
+ eq_(f1.data.x, 5)
+
class MutableInheritedCompositesTest(_CompositeTestBase, fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):