summaryrefslogtreecommitdiff
path: root/test/orm/dynamic.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/dynamic.py')
-rw-r--r--test/orm/dynamic.py142
1 files changed, 86 insertions, 56 deletions
diff --git a/test/orm/dynamic.py b/test/orm/dynamic.py
index 2cd616c12..958f5b159 100644
--- a/test/orm/dynamic.py
+++ b/test/orm/dynamic.py
@@ -16,7 +16,7 @@ class DynamicTest(QueryTest):
def test_basic(self):
mapper(User, users, properties={
- 'addresses':relation(mapper(Address, addresses), lazy='dynamic')
+ 'addresses':dynamic_loader(mapper(Address, addresses))
})
sess = create_session()
q = sess.query(User)
@@ -29,8 +29,11 @@ class DynamicTest(QueryTest):
class FlushTest(FixtureTest):
def test_basic(self):
+ class Fixture(Base):
+ pass
+
mapper(User, users, properties={
- 'addresses':relation(mapper(Address, addresses), lazy='dynamic')
+ 'addresses':dynamic_loader(mapper(Address, addresses))
})
sess = create_session()
u1 = User(name='jack')
@@ -42,88 +45,115 @@ class FlushTest(FixtureTest):
sess.flush()
sess.clear()
+
+ # test the test fixture a little bit
+ assert User(name='jack', addresses=[Address(email_address='wrong')]) != sess.query(User).first()
+ assert User(name='jack', addresses=[Address(email_address='lala@hoho.com')]) == sess.query(User).first()
- def go():
- assert [
- User(name='jack', addresses=[Address(email_address='lala@hoho.com')]),
- User(name='ed', addresses=[Address(email_address='foo@bar.com')])
- ] == sess.query(User).all()
-
- # one query for the query(User).all(), one query for each address
- # iter(), also one query for a count() on each address (the count()
- # is an artifact of the fixtures.Base class, its not intrinsic to the
- # property)
- self.assert_sql_count(testbase.db, go, 5)
-
- def test_backref_unsaved_u(self):
+ assert [
+ User(name='jack', addresses=[Address(email_address='lala@hoho.com')]),
+ User(name='ed', addresses=[Address(email_address='foo@bar.com')])
+ ] == sess.query(User).all()
+
+ def test_delete(self):
mapper(User, users, properties={
- 'addresses':relation(mapper(Address, addresses), lazy='dynamic',
- backref='user')
+ 'addresses':dynamic_loader(mapper(Address, addresses), backref='user')
})
- sess = create_session()
-
- u = User(name='buffy')
-
- a = Address(email_address='foo@bar.com')
- a.user = u
-
+ sess = create_session(autoflush=True)
+ u = User(name='ed')
+ u.addresses.append(Address(email_address='a'))
+ u.addresses.append(Address(email_address='b'))
+ u.addresses.append(Address(email_address='c'))
+ u.addresses.append(Address(email_address='d'))
+ u.addresses.append(Address(email_address='e'))
+ u.addresses.append(Address(email_address='f'))
sess.save(u)
- sess.flush()
+
+ assert Address(email_address='c') == u.addresses[2]
+ sess.delete(u.addresses[2])
+ sess.delete(u.addresses[4])
+ sess.delete(u.addresses[3])
+ assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='d')] == list(u.addresses)
+
+ sess.close()
- def test_backref_unsaved_a(self):
+ def test_remove_orphans(self):
mapper(User, users, properties={
- 'addresses':relation(mapper(Address, addresses), lazy='dynamic',
- backref='user')
+ 'addresses':dynamic_loader(mapper(Address, addresses), cascade="all, delete-orphan", backref='user')
})
- sess = create_session()
-
- u = User(name='buffy')
-
- a = Address(email_address='foo@bar.com')
- a.user = u
+ sess = create_session(autoflush=True)
+ u = User(name='ed')
+ u.addresses.append(Address(email_address='a'))
+ u.addresses.append(Address(email_address='b'))
+ u.addresses.append(Address(email_address='c'))
+ u.addresses.append(Address(email_address='d'))
+ u.addresses.append(Address(email_address='e'))
+ u.addresses.append(Address(email_address='f'))
+ sess.save(u)
- self.assert_(list(u.addresses) == [a])
- self.assert_(u.addresses[0] == a)
+ assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='c'),
+ Address(email_address='d'), Address(email_address='e'), Address(email_address='f')] == sess.query(Address).all()
- sess.save(a)
- sess.flush()
+ assert Address(email_address='c') == u.addresses[2]
- self.assert_(list(u.addresses) == [a])
-
- a.user = None
- self.assert_(list(u.addresses) == [a])
+ try:
+ del u.addresses[3]
+ assert False
+ except TypeError, e:
+ assert str(e) == "object doesn't support item deletion"
+
+ for a in u.addresses.filter(Address.email_address.in_('c', 'e', 'f')):
+ u.addresses.remove(a)
+
+ assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='d')] == list(u.addresses)
- sess.flush()
- self.assert_(list(u.addresses) == [])
+ assert [Address(email_address='a'), Address(email_address='b'), Address(email_address='d')] == sess.query(Address).all()
+ sess.close()
- def test_backref_unsaved_u(self):
+def create_backref_test(autoflush, saveuser):
+ def test_backref(self):
mapper(User, users, properties={
- 'addresses':relation(mapper(Address, addresses), lazy='dynamic',
- backref='user')
+ 'addresses':dynamic_loader(mapper(Address, addresses), backref='user')
})
- sess = create_session()
+ sess = create_session(autoflush=autoflush)
u = User(name='buffy')
a = Address(email_address='foo@bar.com')
a.user = u
- self.assert_(list(u.addresses) == [a])
- self.assert_(u.addresses[0] == a)
+ if saveuser:
+ sess.save(u)
+ else:
+ sess.save(a)
- sess.save(u)
- sess.flush()
+ if not autoflush:
+ sess.flush()
+
+ assert u in sess
+ assert a in sess
- assert list(u.addresses) == [a]
+ self.assert_(list(u.addresses) == [a])
a.user = None
- self.assert_(list(u.addresses) == [a])
+ if not autoflush:
+ self.assert_(list(u.addresses) == [a])
- sess.flush()
+ if not autoflush:
+ sess.flush()
self.assert_(list(u.addresses) == [])
-
+ test_backref.__name__ = "test_%s%s" % (
+ (autoflush and "autoflush" or ""),
+ (saveuser and "_saveuser" or "_savead"),
+ )
+ setattr(FlushTest, test_backref.__name__, test_backref)
+
+for autoflush in (False, True):
+ for saveuser in (False, True):
+ create_backref_test(autoflush, saveuser)
+
if __name__ == '__main__':
testbase.main()