summaryrefslogtreecommitdiff
path: root/test/ext/test_mutable.py
diff options
context:
space:
mode:
authorJeong YunWon <jeong@youknowone.org>2016-02-13 18:44:30 +0900
committerJeong YunWon <jeong@youknowone.org>2016-02-13 21:28:46 +0900
commit1b6422a603a131c4a400853e472e5958a760f99e (patch)
treee51ce102d5694fe991fb8e1925cfde8c4f9d15d7 /test/ext/test_mutable.py
parent366f97b5617af0d15cfaf594ec5ef0408c70e873 (diff)
downloadsqlalchemy-1b6422a603a131c4a400853e472e5958a760f99e.tar.gz
Add `sqlalchemy.ext.mutable.MutableList`
Diffstat (limited to 'test/ext/test_mutable.py')
-rw-r--r--test/ext/test_mutable.py219
1 files changed, 218 insertions, 1 deletions
diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py
index 602ff911a..7cdf9f12b 100644
--- a/test/ext/test_mutable.py
+++ b/test/ext/test_mutable.py
@@ -8,7 +8,7 @@ from sqlalchemy.testing import eq_, assert_raises_message, assert_raises
from sqlalchemy.testing.util import picklers
from sqlalchemy.testing import fixtures
from sqlalchemy.ext.mutable import MutableComposite
-from sqlalchemy.ext.mutable import MutableDict
+from sqlalchemy.ext.mutable import MutableDict, MutableList
class Foo(fixtures.BasicEntity):
@@ -261,6 +261,206 @@ class _MutableDictTestBase(_MutableDictTestFixture):
eq_(f1.non_mutable_data, {'a': 'b'})
+class _MutableListTestFixture(object):
+ @classmethod
+ def _type_fixture(cls):
+ return MutableList
+
+ def teardown(self):
+ # clear out mapper events
+ Mapper.dispatch._clear()
+ ClassManager.dispatch._clear()
+ super(_MutableListTestFixture, self).teardown()
+
+
+class _MutableListTestBase(_MutableListTestFixture):
+ run_define_tables = 'each'
+
+ def setup_mappers(cls):
+ foo = cls.tables.foo
+
+ mapper(Foo, foo)
+
+ def test_coerce_none(self):
+ sess = Session()
+ f1 = Foo(data=None)
+ sess.add(f1)
+ sess.commit()
+ eq_(f1.data, None)
+
+ def test_coerce_raise(self):
+ assert_raises_message(
+ ValueError,
+ "Attribute 'data' does not accept objects of type",
+ Foo, data=set([1, 2, 3])
+ )
+
+ def test_in_place_mutation(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data[0] = 3
+ sess.commit()
+
+ eq_(f1.data, [3, 2])
+
+ def test_in_place_slice_mutation(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2, 3, 4])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data[1:3] = 5, 6
+ sess.commit()
+
+ eq_(f1.data, [1, 5, 6, 4])
+
+ def test_del_slice(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2, 3, 4])
+ sess.add(f1)
+ sess.commit()
+
+ del f1.data[1:3]
+ sess.commit()
+
+ eq_(f1.data, [1, 4])
+
+ def test_clear(self):
+ if not hasattr(list, 'clear'):
+ # py2 list doesn't have 'clear'
+ return
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.clear()
+ sess.commit()
+
+ eq_(f1.data, [])
+
+ def test_pop(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2, 3])
+ sess.add(f1)
+ sess.commit()
+
+ eq_(f1.data.pop(), 3)
+ eq_(f1.data.pop(0), 1)
+ sess.commit()
+
+ assert_raises(IndexError, f1.data.pop, 5)
+
+ eq_(f1.data, [2])
+
+ def test_append(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.append(5)
+ sess.commit()
+
+ eq_(f1.data, [1, 2, 5])
+
+ def test_extend(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.extend([5])
+ sess.commit()
+
+ eq_(f1.data, [1, 2, 5])
+
+ def test_insert(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.insert(1, 5)
+ sess.commit()
+
+ eq_(f1.data, [1, 5, 2])
+
+ def test_remove(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2, 3])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.remove(2)
+ sess.commit()
+
+ eq_(f1.data, [1, 3])
+
+ def test_sort(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 3, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.sort()
+ sess.commit()
+
+ eq_(f1.data, [1, 2, 3])
+
+ def test_reverse(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 3, 2])
+ sess.add(f1)
+ sess.commit()
+
+ f1.data.reverse()
+ sess.commit()
+
+ eq_(f1.data, [2, 3, 1])
+
+ def test_pickle_parent(self):
+ sess = Session()
+
+ f1 = Foo(data=[1, 2])
+ sess.add(f1)
+ sess.commit()
+ f1.data
+ sess.close()
+
+ for loads, dumps in picklers():
+ sess = Session()
+ f2 = loads(dumps(f1))
+ sess.add(f2)
+ f2.data[0] = 3
+ assert f2 in sess.dirty
+
+ def test_unrelated_flush(self):
+ sess = Session()
+ f1 = Foo(data=[1, 2], unrelated_data="unrelated")
+ sess.add(f1)
+ sess.flush()
+ f1.unrelated_data = "unrelated 2"
+ sess.flush()
+ f1.data[0] = 3
+ sess.commit()
+ eq_(f1.data[0], 3)
+
+
class MutableColumnDefaultTest(_MutableDictTestFixture, fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -349,6 +549,23 @@ class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
self._test_non_mutable()
+class MutableListWithScalarPickleTest(_MutableListTestBase, fixtures.MappedTest):
+
+ @classmethod
+ def define_tables(cls, metadata):
+ MutableList = cls._type_fixture()
+
+ mutable_pickle = MutableList.as_mutable(PickleType)
+ Table('foo', metadata,
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
+ Column('skip', mutable_pickle),
+ Column('data', mutable_pickle),
+ Column('non_mutable_data', PickleType),
+ Column('unrelated_data', String(50))
+ )
+
+
class MutableAssocWithAttrInheritTest(_MutableDictTestBase,
fixtures.MappedTest):