diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/dialect/test_postgresql.py | 3 | ||||
-rw-r--r-- | test/lib/fixtures.py | 23 | ||||
-rw-r--r-- | test/orm/test_of_type.py | 1 | ||||
-rw-r--r-- | test/orm/test_update_delete.py | 90 |
4 files changed, 99 insertions, 18 deletions
diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index 0d46175e9..fda4002ef 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -1,4 +1,7 @@ # coding: utf-8 + +from __future__ import with_statement + from test.lib.testing import eq_, assert_raises, assert_raises_message, is_ from test.lib import engines import datetime diff --git a/test/lib/fixtures.py b/test/lib/fixtures.py index af4b0d5bb..15a3d6b03 100644 --- a/test/lib/fixtures.py +++ b/test/lib/fixtures.py @@ -116,7 +116,7 @@ class TablesTest(TestBase): def _teardown_each_tables(self): # no need to run deletes if tables are recreated on setup - if self.run_define_tables != 'each' and self.run_deletes: + if self.run_define_tables != 'each' and self.run_deletes == 'each': for table in reversed(self.metadata.sorted_tables): try: table.delete().execute().close() @@ -303,23 +303,12 @@ class MappedTest(_ORMTest, TablesTest, testing.AssertsExecutionResults): pass class DeclarativeMappedTest(MappedTest): - declarative_meta = None - run_setup_classes = 'once' run_setup_mappers = 'once' @classmethod - def setup_class(cls): - if cls.declarative_meta is None: - cls.declarative_meta = sa.MetaData() - - super(DeclarativeMappedTest, cls).setup_class() - - @classmethod - def _teardown_once_class(cls): - if cls.declarative_meta.tables: - cls.declarative_meta.drop_all(testing.db) - super(DeclarativeMappedTest, cls)._teardown_once_class() + def _setup_once_tables(cls): + pass @classmethod def _with_register_classes(cls, fn): @@ -331,10 +320,10 @@ class DeclarativeMappedTest(MappedTest): cls, classname, bases, dict_) class DeclarativeBasic(object): __table_cls__ = schema.Table - _DeclBase = declarative_base(metadata=cls.declarative_meta, + _DeclBase = declarative_base(metadata=cls.metadata, metaclass=FindFixtureDeclarative, cls=DeclarativeBasic) cls.DeclarativeBasic = _DeclBase fn() - if cls.declarative_meta.tables: - cls.declarative_meta.create_all(testing.db) + if cls.metadata.tables: + cls.metadata.create_all(testing.db) diff --git a/test/orm/test_of_type.py b/test/orm/test_of_type.py index f52fe3a8c..a6a6192d7 100644 --- a/test/orm/test_of_type.py +++ b/test/orm/test_of_type.py @@ -224,6 +224,7 @@ class SubclassRelationshipTest(testing.AssertsCompiledSQL, fixtures.DeclarativeM run_setup_classes = 'once' run_setup_mappers = 'once' run_inserts = 'once' + run_deletes = None __dialect__ = 'default' @classmethod diff --git a/test/orm/test_update_delete.py b/test/orm/test_update_delete.py index 252c1cfa3..e6a429c90 100644 --- a/test/orm/test_update_delete.py +++ b/test/orm/test_update_delete.py @@ -75,7 +75,6 @@ class UpdateDeleteTest(fixtures.MappedTest): r"Can't call Query.delete\(\) when %s\(\) has been called" % mname, q.delete) - def test_delete(self): User = self.classes.User @@ -88,6 +87,14 @@ class UpdateDeleteTest(fixtures.MappedTest): eq_(sess.query(User).order_by(User.id).all(), [jack,jane]) + def test_delete_against_metadata(self): + User = self.classes.User + users = self.tables.users + + sess = Session() + sess.query(users).delete(synchronize_session=False) + eq_(sess.query(User).count(), 0) + def test_delete_with_bindparams(self): User = self.classes.User @@ -195,6 +202,14 @@ class UpdateDeleteTest(fixtures.MappedTest): eq_([john.age, jack.age, jill.age, jane.age], [15,27,19,27]) eq_(sess.query(User.age).order_by(User.id).all(), zip([15,27,19,27])) + def test_update_against_metadata(self): + User, users = self.classes.User, self.tables.users + + sess = Session() + + sess.query(users).update({users.c.age: 29}, synchronize_session=False) + eq_(sess.query(User.age).order_by(User.id).all(), zip([29,29,29,29])) + def test_update_with_bindparams(self): User = self.classes.User @@ -553,4 +568,77 @@ class ExpressionUpdateTest(fixtures.MappedTest): eq_(d1.cnt, 2) sess.close() +class InheritTest(fixtures.DeclarativeMappedTest): + + run_inserts = 'each' + + run_deletes = 'each' + + @classmethod + def setup_classes(cls): + Base = cls.DeclarativeBasic + + class Person(Base): + __tablename__ = 'person' + id = Column(Integer, primary_key=True, test_needs_autoincrement=True) + type = Column(String(50)) + name = Column(String(50)) + + class Engineer(Person): + __tablename__ = 'engineer' + id = Column(Integer, ForeignKey('person.id'), primary_key=True) + engineer_name = Column(String(50)) + + class Manager(Person): + __tablename__ = 'manager' + id = Column(Integer, ForeignKey('person.id'), primary_key=True) + manager_name = Column(String(50)) + + @classmethod + def insert_data(cls): + Engineer, Person, Manager = cls.classes.Engineer, \ + cls.classes.Person, cls.classes.Manager + s = Session(testing.db) + s.add_all([ + Engineer(name='e1', engineer_name='e1'), + Manager(name='m1', manager_name='m1'), + Engineer(name='e2', engineer_name='e2'), + Person(name='p1'), + ]) + s.commit() + + def test_illegal_metadata(self): + person = self.classes.Person.__table__ + engineer = self.classes.Engineer.__table__ + + sess = Session() + assert_raises_message( + exc.InvalidRequestError, + "This operation requires only one Table or entity be " + "specified as the target.", + sess.query(person.join(engineer)).update, {} + ) + + def test_update_subtable_only(self): + Engineer = self.classes.Engineer + s = Session(testing.db) + s.query(Engineer).update({'engineer_name': 'e5'}) + + eq_( + s.query(Engineer.engineer_name).all(), + [('e5', ), ('e5', )] + ) + + @testing.requires.update_from + def test_update_from(self): + Engineer = self.classes.Engineer + Person = self.classes.Person + s = Session(testing.db) + s.query(Engineer).filter(Engineer.id == Person.id).\ + filter(Person.name == 'e2').update({'engineer_name': 'e5'}) + + eq_( + set(s.query(Person.name, Engineer.engineer_name)), + set([('e1', 'e1', ), ('e2', 'e5')]) + ) |