[Sqlalchemy-commits] [2366] sqlalchemy/trunk/test/orm: a generating testcase that tests a three-lev
Brought to you by:
zzzeek
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[2366] sqlalchemy/trunk/test/orm: a generating testcase that tests a three-level inheritance chain (A->B->C) and all one-to-many and many-to-one relationships between </title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>2366</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2007-02-27 21:35:32 -0600 (Tue, 27 Feb 2007)</dd> </dl> <h3>Log Message</h3> <pre>a generating testcase that tests a three-level inheritance chain (A->B->C) and all one-to-many and many-to-one relationships between all distinct A,B,C. still needs support for foreign key to parent table not the same col as the pk col</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunktestormalltestspy">sqlalchemy/trunk/test/orm/alltests.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemytrunktestormabc_inheritancepy">sqlalchemy/trunk/test/orm/abc_inheritance.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunktestormabc_inheritancepy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/test/orm/abc_inheritance.py (2365 => 2366)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/orm/abc_inheritance.py 2007-02-28 01:25:52 UTC (rev 2365) +++ sqlalchemy/trunk/test/orm/abc_inheritance.py 2007-02-28 03:35:32 UTC (rev 2366) </span><span class="lines">@@ -0,0 +1,146 @@ </span><ins>+from sqlalchemy import * +from sqlalchemy.orm.sync import ONETOMANY, MANYTOONE +import testbase + +def produce_test(parent, child, direction, fkeyinline): + class ABCTest(testbase.ORMTest): + def define_tables(self, meta): + global ta, tb, tc + ta = ["a", meta] + ta.append(Column('id', Integer, primary_key=True)), + ta.append(Column('data', String(30))) + if "a"== parent and direction == MANYTOONE: + ta.append(Column('child_id', Integer, ForeignKey("%s.id" % child, use_alter=True, name="foo"))) + elif "a" == child and direction == ONETOMANY: + ta.append(Column('parent_id', Integer, ForeignKey("%s.id" % parent, use_alter=True, name="foo"))) + ta = Table(*ta) + + tb = ["b", meta] + if fkeyinline: + tb.append(Column('id', Integer, ForeignKey("a.id"), primary_key=True, )) + else: + tb.append(Column('id', Integer, primary_key=True)) + tb.append(Column('a_id', Integer, ForeignKey("a.id"), primary_key=True)) + + tb.append(Column('data', String(30))) + + if "b"== parent and direction == MANYTOONE: + tb.append(Column('child_id', Integer, ForeignKey("%s.id" % child, use_alter=True, name="foo"))) + elif "b" == child and direction == ONETOMANY: + tb.append(Column('parent_id', Integer, ForeignKey("%s.id" % parent, use_alter=True, name="foo"))) + tb = Table(*tb) + + tc = ["c", meta] + if fkeyinline: + tc.append(Column('id', Integer, ForeignKey("b.id"), primary_key=True, )) + else: + tc.append(Column('id', Integer, primary_key=True)) + tc.append(Column('b_id', Integer, ForeignKey("b.id"), primary_key=True)) + + tc.append(Column('data', String(30))) + + if "c"== parent and direction == MANYTOONE: + tc.append(Column('child_id', Integer, ForeignKey("%s.id" % child, use_alter=True, name="foo"))) + elif "c" == child and direction == ONETOMANY: + tc.append(Column('parent_id', Integer, ForeignKey("%s.id" % parent, use_alter=True, name="foo"))) + tc = Table(*tc) + + def test_basic(self): + parent_table = {"a":ta, "b":tb, "c": tc}[parent] + child_table = {"a":ta, "b":tb, "c": tc}[child] + + if direction == MANYTOONE: + foreign_keys = [parent_table.c.child_id] + elif direction == ONETOMANY: + foreign_keys = [child_table.c.parent_id] + + if fkeyinline: + atob = ta.c.id==tb.c.id + btoc = tc.c.id==tb.c.id + else: + atob = ta.c.id==tb.c.a_id + btoc = tc.c.b_id==tb.c.id + + if direction == ONETOMANY: + relationjoin = parent_table.c.id==child_table.c.parent_id + elif direction == MANYTOONE: + relationjoin = parent_table.c.child_id==child_table.c.id + + abcjoin = polymorphic_union( + {"a":ta.select(tb.c.id==None, from_obj=[ta.outerjoin(tb, onclause=atob)]), + "b":ta.join(tb, onclause=atob).outerjoin(tc, onclause=btoc).select(tc.c.id==None), + "c":tc.join(tb, onclause=btoc).join(ta, onclause=atob) + },"type", "abcjoin" + ) + + bcjoin = polymorphic_union( + { + "b":ta.join(tb, onclause=atob).outerjoin(tc, onclause=btoc).select(tc.c.id==None), + "c":tc.join(tb, onclause=btoc).join(ta, onclause=atob) + },"type", "bcjoin" + ) + + class A(object):pass + class B(A):pass + class C(B):pass + + mapper(A, ta, polymorphic_on=abcjoin.c.type, select_table=abcjoin, polymorphic_identity="a") + mapper(B, tb, polymorphic_on=bcjoin.c.type, select_table=bcjoin, polymorphic_identity="b", inherits=A, inherit_condition=atob) + mapper(C, tc, polymorphic_identity="c", inherits=B, inherit_condition=btoc) + + parent_mapper = class_mapper({ta:A, tb:B, tc:C}[parent_table]) + child_mapper = class_mapper({ta:A, tb:B, tc:C}[child_table]) + + parent_class = parent_mapper.class_ + child_class = child_mapper.class_ + + parent_mapper.add_property("collection", relation(child_mapper, primaryjoin=relationjoin, foreign_keys=foreign_keys, uselist=True)) + + sess = create_session() + + parent_obj = parent_class() + child_obj = child_class() + somea = A() + someb = B() + somec = C() + print "APPENDING", parent.__class__.__name__ , "TO", child.__class__.__name__ + sess.save(parent_obj) + parent_obj.collection.append(child_obj) + if direction == ONETOMANY: + child2 = child_class() + parent_obj.collection.append(child2) + sess.save(child2) + elif direction == MANYTOONE: + parent2 = parent_class() + parent2.collection.append(child_obj) + sess.save(parent2) + sess.save(somea) + sess.save(someb) + sess.save(somec) + sess.flush() + sess.clear() + + result = sess.query(parent_class).get(parent_obj.id) + assert result.id == parent_obj.id + assert result.collection[0].id == child_obj.id + if direction == ONETOMANY: + assert result.collection[1].id == child2.id + elif direction == MANYTOONE: + result2 = sess.query(parent_class).get(parent2.id) + assert result2.id == parent2.id + assert result2.collection[0].id == child_obj.id + ABCTest.__name__ = "Test%s%s%d%sTest" % (parent, child, direction, fkeyinline) + return ABCTest + +for parent in ["a", "b", "c"]: + for child in ["a", "b", "c"]: + if parent == child: + continue + for fkeyinline in [True]: #, False]: + for direction in [ONETOMANY, MANYTOONE]: + testclass = produce_test(parent, child, direction, fkeyinline) + exec("%s = testclass" % testclass.__name__) + + +if __name__ == "__main__": + testbase.main() </ins></span></pre></div> <a id="sqlalchemytrunktestormalltestspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/orm/alltests.py (2365 => 2366)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/orm/alltests.py 2007-02-28 01:25:52 UTC (rev 2365) +++ sqlalchemy/trunk/test/orm/alltests.py 2007-02-28 03:35:32 UTC (rev 2366) </span><span class="lines">@@ -31,6 +31,7 @@ </span><span class="cx"> 'orm.inheritance3', </span><span class="cx"> 'orm.inheritance4', </span><span class="cx"> 'orm.inheritance5', </span><ins>+ 'orm.abc_inheritance', </ins><span class="cx"> 'orm.single', </span><span class="cx"> 'orm.polymorph' </span><span class="cx"> ) </span></span></pre> </div> </div> </body> </html> |