diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-01-21 20:10:23 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-01-21 20:10:23 -0500 |
commit | 07fb90c6cc14de6d02cf4be592c57d56831f59f7 (patch) | |
tree | 050ef65db988559c60f7aa40f2d0bfe24947e548 /test/ext/test_automap.py | |
parent | 560fd1d5ed643a1b0f95296f3b840c1963bbe67f (diff) | |
parent | ee1f4d21037690ad996c5eacf7e1200e92f2fbaa (diff) | |
download | sqlalchemy-ticket_2501.tar.gz |
Merge branch 'master' into ticket_2501ticket_2501
Conflicts:
lib/sqlalchemy/orm/mapper.py
Diffstat (limited to 'test/ext/test_automap.py')
-rw-r--r-- | test/ext/test_automap.py | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/test/ext/test_automap.py b/test/ext/test_automap.py new file mode 100644 index 000000000..9db85879d --- /dev/null +++ b/test/ext/test_automap.py @@ -0,0 +1,146 @@ +from sqlalchemy.testing import fixtures, eq_ +from ..orm._fixtures import FixtureTest +from sqlalchemy.ext.automap import automap_base +from sqlalchemy.orm import relationship, interfaces, backref +from sqlalchemy.ext.automap import generate_relationship +from sqlalchemy.testing.mock import Mock, call + +class AutomapTest(fixtures.MappedTest): + @classmethod + def define_tables(cls, metadata): + FixtureTest.define_tables(metadata) + + def test_relationship_o2m_default(self): + Base = automap_base(metadata=self.metadata) + Base.prepare() + + User = Base.classes.users + Address = Base.classes.addresses + + a1 = Address(email_address='e1') + u1 = User(name='u1', addresses_collection=[a1]) + assert a1.users is u1 + + def test_relationship_explicit_override_o2m(self): + Base = automap_base(metadata=self.metadata) + prop = relationship("addresses", collection_class=set) + class User(Base): + __tablename__ = 'users' + + addresses_collection = prop + + Base.prepare() + assert User.addresses_collection.property is prop + Address = Base.classes.addresses + + a1 = Address(email_address='e1') + u1 = User(name='u1', addresses_collection=set([a1])) + assert a1.user is u1 + + def test_relationship_explicit_override_m2o(self): + Base = automap_base(metadata=self.metadata) + + prop = relationship("users") + class Address(Base): + __tablename__ = 'addresses' + + users = prop + + Base.prepare() + User = Base.classes.users + + assert Address.users.property is prop + a1 = Address(email_address='e1') + u1 = User(name='u1', address_collection=[a1]) + assert a1.users is u1 + + + def test_relationship_self_referential(self): + Base = automap_base(metadata=self.metadata) + Base.prepare() + + Node = Base.classes.nodes + + n1 = Node() + n2 = Node() + n1.nodes_collection.append(n2) + assert n2.nodes is n1 + + def test_naming_schemes(self): + Base = automap_base(metadata=self.metadata) + + def classname_for_table(base, tablename, table): + return str("cls_" + tablename) + + def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): + return "scalar_" + referred_cls.__name__ + + def name_for_collection_relationship(base, local_cls, referred_cls, constraint): + return "coll_" + referred_cls.__name__ + + Base.prepare( + classname_for_table=classname_for_table, + name_for_scalar_relationship=name_for_scalar_relationship, + name_for_collection_relationship=name_for_collection_relationship + ) + + User = Base.classes.cls_users + Address = Base.classes.cls_addresses + + u1 = User() + a1 = Address() + u1.coll_cls_addresses.append(a1) + assert a1.scalar_cls_users is u1 + + def test_relationship_m2m(self): + Base = automap_base(metadata=self.metadata) + + Base.prepare() + + Order, Item = Base.classes.orders, Base.classes['items'] + + o1 = Order() + i1 = Item() + o1.items_collection.append(i1) + assert o1 in i1.orders_collection + + def test_relationship_explicit_override_forwards_m2m(self): + Base = automap_base(metadata=self.metadata) + + class Order(Base): + __tablename__ = 'orders' + + items_collection = relationship("items", + secondary="order_items", + collection_class=set) + Base.prepare() + + Item = Base.classes['items'] + + o1 = Order() + i1 = Item() + o1.items_collection.add(i1) + + # it's 'order_collection' because the class name is + # "Order" ! + assert isinstance(i1.order_collection, list) + assert o1 in i1.order_collection + + def test_relationship_pass_params(self): + Base = automap_base(metadata=self.metadata) + + mock = Mock() + def _gen_relationship(base, direction, return_fn, attrname, + local_cls, referred_cls, **kw): + mock(base, direction, attrname) + return generate_relationship(base, direction, return_fn, + attrname, local_cls, referred_cls, **kw) + + Base.prepare(generate_relationship=_gen_relationship) + assert set(tuple(c[1]) for c in mock.mock_calls).issuperset([ + (Base, interfaces.MANYTOONE, "nodes"), + (Base, interfaces.MANYTOMANY, "keywords_collection"), + (Base, interfaces.MANYTOMANY, "items_collection"), + (Base, interfaces.MANYTOONE, "users"), + (Base, interfaces.ONETOMANY, "addresses_collection"), + ]) |