summaryrefslogtreecommitdiff
path: root/test/ext/test_mutable.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-06-04 19:43:39 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-06-04 19:43:39 -0400
commit5cac2468b6ef9e7ab4c0f3400477b697cd2d4ec6 (patch)
tree8097715208803eba6d8baeddc5dfe50d3fd5bade /test/ext/test_mutable.py
parentc25412d90a1ad13fd09618aa5f21a0d109251002 (diff)
downloadsqlalchemy-5cac2468b6ef9e7ab4c0f3400477b697cd2d4ec6.tar.gz
- Repaired new "mutable" extension to propagate
events to subclasses correctly; don't create multiple event listeners for subclasses either. [ticket:2180]
Diffstat (limited to 'test/ext/test_mutable.py')
-rw-r--r--test/ext/test_mutable.py110
1 files changed, 107 insertions, 3 deletions
diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py
index 494e46347..dec955bab 100644
--- a/test/ext/test_mutable.py
+++ b/test/ext/test_mutable.py
@@ -1,4 +1,4 @@
-from sqlalchemy import Integer
+from sqlalchemy import Integer, ForeignKey
from sqlalchemy.types import PickleType, TypeDecorator, VARCHAR
from sqlalchemy.orm import mapper, Session, composite
from sqlalchemy.orm.mapper import Mapper
@@ -14,6 +14,9 @@ import pickle
class Foo(fixtures.BasicEntity):
pass
+class SubFoo(Foo):
+ pass
+
class _MutableDictTestBase(object):
run_define_tables = 'each'
@@ -171,6 +174,51 @@ class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
def test_non_mutable(self):
self._test_non_mutable()
+class MutableAssocWithAttrInheritTest(_MutableDictTestBase, fixtures.MappedTest):
+ @classmethod
+ def define_tables(cls, metadata):
+ MutationDict = cls._type_fixture()
+
+ Table('foo', metadata,
+ Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
+ Column('data', PickleType),
+ Column('non_mutable_data', PickleType)
+ )
+
+ Table('subfoo', metadata,
+ Column('id', Integer, ForeignKey('foo.id'), primary_key=True),
+ )
+
+ def setup_mappers(cls):
+ foo = cls.tables.foo
+ subfoo = cls.tables.subfoo
+
+ mapper(Foo, foo)
+ mapper(SubFoo, subfoo, inherits=Foo)
+ MutationDict.associate_with_attribute(Foo.data)
+
+ def test_in_place_mutation(self):
+ sess = Session()
+
+ f1 = SubFoo(data={'a':'b'})
+ sess.add(f1)
+ sess.commit()
+
+ f1.data['a'] = 'c'
+ sess.commit()
+
+ eq_(f1.data, {'a':'c'})
+
+ def test_replace(self):
+ sess = Session()
+ f1 = SubFoo(data={'a':'b'})
+ sess.add(f1)
+ sess.flush()
+
+ f1.data = {'b':'c'}
+ sess.commit()
+ eq_(f1.data, {'b':'c'})
+
class MutableAssociationScalarPickleTest(_MutableDictTestBase, fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -228,8 +276,6 @@ class _CompositeTestBase(object):
ClassManager.dispatch._clear()
super(_CompositeTestBase, self).teardown()
-class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
-
@classmethod
def _type_fixture(cls):
@@ -264,6 +310,8 @@ class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
other.y == self.y
return Point
+class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
+
@classmethod
def setup_mappers(cls):
foo = cls.tables.foo
@@ -303,3 +351,59 @@ class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
sess.add(f2)
f2.data.y = 12
assert f2 in sess.dirty
+
+
+class MutableInheritedCompositesTest(_CompositeTestBase, fixtures.MappedTest):
+ @classmethod
+ def define_tables(cls, metadata):
+ Table('foo', metadata,
+ Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
+ Column('x', Integer),
+ Column('y', Integer)
+ )
+ Table('subfoo', metadata,
+ Column('id', Integer, ForeignKey('foo.id'), primary_key=True),
+ )
+
+ @classmethod
+ def setup_mappers(cls):
+ foo = cls.tables.foo
+ subfoo = cls.tables.subfoo
+
+ Point = cls._type_fixture()
+
+ mapper(Foo, foo, properties={
+ 'data':composite(Point, foo.c.x, foo.c.y)
+ })
+ mapper(SubFoo, subfoo, inherits=Foo)
+
+ def test_in_place_mutation_subclass(self):
+ sess = Session()
+ d = Point(3, 4)
+ f1 = SubFoo(data=d)
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.y = 5
+ sess.commit()
+
+ eq_(f1.data, Point(3, 5))
+
+ def test_pickle_of_parent_subclass(self):
+ sess = Session()
+ d = Point(3, 4)
+ f1 = SubFoo(data=d)
+ sess.add(f1)
+ sess.commit()
+
+ f1.data
+ assert 'data' in f1.__dict__
+ sess.close()
+
+ for loads, dumps in picklers():
+ sess = Session()
+ f2 = loads(dumps(f1))
+ sess.add(f2)
+ f2.data.y = 12
+ assert f2 in sess.dirty
+