summaryrefslogtreecommitdiff
path: root/test/orm/association.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/association.py')
-rw-r--r--test/orm/association.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/test/orm/association.py b/test/orm/association.py
new file mode 100644
index 000000000..e33151ed4
--- /dev/null
+++ b/test/orm/association.py
@@ -0,0 +1,143 @@
+import testbase
+
+from sqlalchemy import *
+
+
+class AssociationTest(testbase.PersistTest):
+ def setUpAll(self):
+ global items, item_keywords, keywords, metadata, Item, Keyword, KeywordAssociation
+ metadata = BoundMetaData(testbase.db)
+ items = Table('items', metadata,
+ Column('item_id', Integer, primary_key=True),
+ Column('name', String(40)),
+ )
+ item_keywords = Table('item_keywords', metadata,
+ Column('item_id', Integer, ForeignKey('items.item_id')),
+ Column('keyword_id', Integer, ForeignKey('keywords.keyword_id')),
+ Column('data', String(40))
+ )
+ keywords = Table('keywords', metadata,
+ Column('keyword_id', Integer, primary_key=True),
+ Column('name', String(40))
+ )
+ metadata.create_all()
+
+ class Item(object):
+ def __init__(self, name):
+ self.name = name
+ def __repr__(self):
+ return "Item id=%d name=%s keywordassoc=%s" % (self.item_id, self.name, repr(self.keywords))
+ class Keyword(object):
+ def __init__(self, name):
+ self.name = name
+ def __repr__(self):
+ return "Keyword id=%d name=%s" % (self.keyword_id, self.name)
+ class KeywordAssociation(object):
+ def __init__(self, keyword, data):
+ self.keyword = keyword
+ self.data = data
+ def __repr__(self):
+ return "KeywordAssociation itemid=%d keyword=%s data=%s" % (self.item_id, repr(self.keyword), self.data)
+
+ mapper(Keyword, keywords)
+ mapper(KeywordAssociation, item_keywords, properties={
+ 'keyword':relation(Keyword, lazy=False)
+ }, primary_key=[item_keywords.c.item_id, item_keywords.c.keyword_id], order_by=[item_keywords.c.data])
+ mapper(Item, items, properties={
+ 'keywords' : relation(KeywordAssociation, association=Keyword)
+ })
+
+ def tearDown(self):
+ for t in metadata.table_iterator(reverse=True):
+ t.delete().execute()
+ def tearDownAll(self):
+ clear_mappers()
+ metadata.drop_all()
+
+ def testinsert(self):
+ sess = create_session()
+ item1 = Item('item1')
+ item2 = Item('item2')
+ item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
+ item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
+ item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
+ sess.save(item1)
+ sess.save(item2)
+ sess.flush()
+ saved = repr([item1, item2])
+ sess.clear()
+ l = sess.query(Item).select()
+ loaded = repr(l)
+ print saved
+ print loaded
+ self.assert_(saved == loaded)
+
+ def testreplace(self):
+ sess = create_session()
+ item1 = Item('item1')
+ item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
+ item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
+ sess.save(item1)
+ sess.flush()
+
+ red_keyword = item1.keywords[1].keyword
+ del item1.keywords[1]
+ item1.keywords.append(KeywordAssociation(red_keyword, 'new_red_assoc'))
+ sess.flush()
+ saved = repr([item1])
+ sess.clear()
+ l = sess.query(Item).select()
+ loaded = repr(l)
+ print saved
+ print loaded
+ self.assert_(saved == loaded)
+
+ def testmodify(self):
+ sess = create_session()
+ item1 = Item('item1')
+ item2 = Item('item2')
+ item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
+ item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
+ item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
+ sess.save(item1)
+ sess.save(item2)
+ sess.flush()
+
+ red_keyword = item1.keywords[1].keyword
+ del item1.keywords[0]
+ del item1.keywords[0]
+ purple_keyword = Keyword('purple')
+ item1.keywords.append(KeywordAssociation(red_keyword, 'new_red_assoc'))
+ item2.keywords.append(KeywordAssociation(purple_keyword, 'purple_item2_assoc'))
+ item1.keywords.append(KeywordAssociation(purple_keyword, 'purple_item1_assoc'))
+ item1.keywords.append(KeywordAssociation(Keyword('yellow'), 'yellow_assoc'))
+
+ sess.flush()
+ saved = repr([item1, item2])
+ sess.clear()
+ l = sess.query(Item).select()
+ loaded = repr(l)
+ print saved
+ print loaded
+ self.assert_(saved == loaded)
+
+ def testdelete(self):
+ sess = create_session()
+ item1 = Item('item1')
+ item2 = Item('item2')
+ item1.keywords.append(KeywordAssociation(Keyword('blue'), 'blue_assoc'))
+ item1.keywords.append(KeywordAssociation(Keyword('red'), 'red_assoc'))
+ item2.keywords.append(KeywordAssociation(Keyword('green'), 'green_assoc'))
+ sess.save(item1)
+ sess.save(item2)
+ sess.flush()
+ self.assert_(item_keywords.count().scalar() == 3)
+
+ sess.delete(item1)
+ sess.delete(item2)
+ sess.flush()
+ self.assert_(item_keywords.count().scalar() == 0)
+
+
+if __name__ == "__main__":
+ testbase.main()