summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-06-19 17:47:21 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-06-19 17:47:21 +0000
commite2b5b9d0e40fe9ad6dcc5d3bfa1fddc89a1883bc (patch)
tree4820be33975af5d0272cf913121d23957edfcb44 /test
parentf5c5c4e6a7041d10a83719a572b823d8cfbebb6c (diff)
downloadsqlalchemy-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.py1
-rw-r--r--test/orm/compile.py121
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()