diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-19 17:47:21 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-19 17:47:21 +0000 |
| commit | e2b5b9d0e40fe9ad6dcc5d3bfa1fddc89a1883bc (patch) | |
| tree | 4820be33975af5d0272cf913121d23957edfcb44 /test | |
| parent | f5c5c4e6a7041d10a83719a572b823d8cfbebb6c (diff) | |
| download | sqlalchemy-e2b5b9d0e40fe9ad6dcc5d3bfa1fddc89a1883bc.tar.gz | |
added check for conflicting backrefs + unit test
identified unit test where mapper properties must be set up before the surrogate mapper is created
Diffstat (limited to 'test')
| -rw-r--r-- | test/orm/alltests.py | 1 | ||||
| -rw-r--r-- | test/orm/compile.py | 121 |
2 files changed, 122 insertions, 0 deletions
diff --git a/test/orm/alltests.py b/test/orm/alltests.py index 4c038f122..cfbfdb70b 100644 --- a/test/orm/alltests.py +++ b/test/orm/alltests.py @@ -19,6 +19,7 @@ def suite(): 'orm.poly_linked_list', 'orm.entity', + 'orm.compile', 'orm.manytomany', 'orm.onetoone', 'orm.inheritance', diff --git a/test/orm/compile.py b/test/orm/compile.py new file mode 100644 index 000000000..c927ae53b --- /dev/null +++ b/test/orm/compile.py @@ -0,0 +1,121 @@ +from sqlalchemy import * +import testbase + +class CompileTest(testbase.AssertMixin): + """test various mapper compilation scenarios""" + def tearDownAll(self): + clear_mappers() + + def testone(self): + global metadata, order, employee, product, tax, orderproduct + metadata = BoundMetaData(engine) + + order = Table('orders', metadata, + Column('id', Integer, primary_key=True), + Column('employee_id', Integer, ForeignKey('employees.id'), nullable=False), + Column('type', Unicode(16))) + + employee = Table('employees', metadata, + Column('id', Integer, primary_key=True), + Column('name', Unicode(16), unique=True, nullable=False)) + + product = Table('products', metadata, + Column('id', Integer, primary_key=True), + ) + + orderproduct = Table('orderproducts', metadata, + Column('id', Integer, primary_key=True), + Column('order_id', Integer, ForeignKey("orders.id"), nullable=False), + Column('product_id', Integer, ForeignKey("products.id"), nullable=False), + ) + + class Order(object): + pass + + class Employee(object): + pass + + class Product(object): + pass + + class OrderProduct(object): + pass + + order_join = order.select().alias('pjoin') + + order_mapper = mapper(Order, order, + select_table=order_join, + polymorphic_on=order_join.c.type, + polymorphic_identity='order', + properties={ + 'orderproducts': relation(OrderProduct, lazy=True, backref='order')} + ) + + mapper(Product, product, + properties={ + 'orderproducts': relation(OrderProduct, lazy=True, backref='product')} + ) + + mapper(Employee, employee, + properties={ + 'orders': relation(Order, lazy=True, backref='employee')}) + + mapper(OrderProduct, orderproduct) + + # this requires that the compilation of order_mapper's "surrogate mapper" occur after + # the initial setup of MapperProperty objects on the mapper. + class_mapper(Product).compile() + + def testtwo(self): + """test that conflicting backrefs raises an exception""" + global metadata, order, employee, product, tax, orderproduct + metadata = BoundMetaData(engine) + + order = Table('orders', metadata, + Column('id', Integer, primary_key=True), + Column('type', Unicode(16))) + + product = Table('products', metadata, + Column('id', Integer, primary_key=True), + ) + + orderproduct = Table('orderproducts', metadata, + Column('id', Integer, primary_key=True), + Column('order_id', Integer, ForeignKey("orders.id"), nullable=False), + Column('product_id', Integer, ForeignKey("products.id"), nullable=False), + ) + + class Order(object): + pass + + class Product(object): + pass + + class OrderProduct(object): + pass + + order_join = order.select().alias('pjoin') + + order_mapper = mapper(Order, order, + select_table=order_join, + polymorphic_on=order_join.c.type, + polymorphic_identity='order', + properties={ + 'orderproducts': relation(OrderProduct, lazy=True, backref='product')} + ) + + mapper(Product, product, + properties={ + 'orderproducts': relation(OrderProduct, lazy=True, backref='product')} + ) + + mapper(OrderProduct, orderproduct) + + try: + class_mapper(Product).compile() + assert False + except exceptions.ArgumentError, e: + assert str(e).index("Backrefs do not match") > -1 + +if __name__ == '__main__': + testbase.main() |
