]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Modified fails_on testing decorator to take a reason for the failure.
authorMichael Trier <mtrier@gmail.com>
Fri, 12 Dec 2008 03:41:05 +0000 (03:41 +0000)
committerMichael Trier <mtrier@gmail.com>
Fri, 12 Dec 2008 03:41:05 +0000 (03:41 +0000)
This should assist with helping to document the reasons for testing failures.
Currently unspecified failures are defaulted to 'FIXME: unknown'.

24 files changed:
test/engine/execute.py
test/engine/reconnect.py
test/engine/reflection.py
test/engine/transaction.py
test/orm/assorted_eager.py
test/orm/cascade.py
test/orm/dynamic.py
test/orm/eager_relations.py
test/orm/expire.py
test/orm/generative.py
test/orm/inheritance/basic.py
test/orm/inheritance/manytomany.py
test/orm/inheritance/poly_linked_list.py
test/orm/mapper.py
test/orm/naturalpks.py
test/orm/query.py
test/orm/session.py
test/orm/unitofwork.py
test/sql/case_statement.py
test/sql/constraints.py
test/sql/defaults.py
test/sql/query.py
test/sql/testtypes.py
test/testlib/testing.py

index c45c0744d240915ce75876826986abf0e8998012..5b3478c56cc51adeebca9847d34dcb8b46297918 100644 (file)
@@ -78,14 +78,14 @@ class ExecuteTest(TestBase):
             except tsa.exc.DBAPIError:
                 assert True
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'rowcount returns -1')
     def test_empty_insert(self):
         """test that execute() interprets [] as a list with no params"""
         result = testing.db.execute(users.insert().values(user_name=bindparam('name')), [])
         self.assertEquals(result.rowcount, 1)
 
 class ProxyConnectionTest(TestBase):
-    @testing.fails_on('firebird') # Data type unknown
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_proxy(self):
         
         stmts = []
index 936ea97e49b755ab18cb1219cabe8bb2b6d9bd79..64d3fb79430aa1c22ae3d00b7ab159a63fdcbe3d 100644 (file)
@@ -315,7 +315,7 @@ class InvalidateDuringResultTest(TestBase):
         meta.drop_all()
         engine.dispose()
 
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_invalidate_on_results(self):
         conn = engine.connect()
 
index e478e7c7a6d258cca5820926d1f927d0ce155621..a04e218541cf5b9bbfc43cb6d162ceebe3577c11 100644 (file)
@@ -675,9 +675,10 @@ class SchemaTest(TestBase):
             assert buf.index("CREATE TABLE someschema.table2") > -1
 
     @testing.crashes('firebird', 'No schema support')
-    @testing.fails_on('sqlite')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     # fixme: revisit these below.
-    @testing.fails_on('access', 'sybase')
+    @testing.fails_on('access', 'FIXME: unknown')
+    @testing.fails_on('sybase', 'FIXME: unknown')
     def test_explicit_default_schema(self):
         engine = testing.db
 
index 7d8d6bd61ac2f71e94c91659d878d0947d12f0db..1fa3856108524d5f01e41b60a183c9a56fb5c0e1 100644 (file)
@@ -271,7 +271,7 @@ class TransactionTest(TestBase):
         connection.close()
 
     @testing.requires.two_phase_transactions
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_two_phase_recover(self):
         # MySQL recovery doesn't currently seem to work correctly
         # Prepared transactions disappear when connections are closed and even
@@ -816,7 +816,7 @@ class ForUpdateTest(TestBase):
         self.assert_(len(errors) == 0)
 
     @testing.crashes('mssql', 'FIXME: unknown')
-    @testing.fails_on('mysql') # no support for NOWAIT
+    @testing.fails_on('mysql', 'No support for NOWAIT')
     @testing.crashes('firebird', 'FIXME: unknown')
     @testing.crashes('sybase', 'FIXME: unknown')
     @testing.crashes('access', 'FIXME: unknown')
index a0c049fdd6d1730db6997609cdfffdba862d2aa1..1fc05380abd6dc4a49ea9f0177d6c035f9ee46ce 100644 (file)
@@ -244,7 +244,7 @@ class EagerTest2(_base.MappedTest):
                            lazy=False,
                            backref=backref('middle', lazy=False)))),
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_eager_terminate(self):
         """Eager query generation does not include the same mapper's table twice.
@@ -293,7 +293,7 @@ class EagerTest3(_base.MappedTest):
         class Stat(_base.BasicEntity):
             pass
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_nesting_with_functions(self):
         mapper(Data, datas)
@@ -367,7 +367,7 @@ class EagerTest4(_base.MappedTest):
         class Employee(_base.BasicEntity):
             pass
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_basic(self):
         mapper(Employee, employees)
@@ -753,7 +753,7 @@ class EagerTest8(_base.MappedTest):
         class Joined(_base.ComparableEntity):
             pass
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_nested_joins(self):
         # this is testing some subtle column resolution stuff,
@@ -831,7 +831,7 @@ class EagerTest9(_base.MappedTest):
                                  backref=backref('entries', lazy=False,
                                                  order_by=entries.c.entry_id))))
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_eagerload_on_path(self):
         session = create_session()
index 56337b9ba4a7c0c3e654fcbf5fe26b7571b52814..0a3f800d3ff0b1860f9b40c937b2363c9803e64b 100644 (file)
@@ -364,7 +364,7 @@ class M2OCascadeTest(_base.MappedTest):
         sess.flush()
         sess.close()
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_orphan(self):
         sess = create_session()
@@ -376,7 +376,7 @@ class M2OCascadeTest(_base.MappedTest):
         assert prefs.count().scalar() == 2
         assert extra.count().scalar() == 2
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_orphan_on_update(self):
         sess = create_session()
index 4f7880e4c50bcacff8bf02eac98fa436f96867b6..1ad00d74866a7d7b45928276258233a8a597ba46 100644 (file)
@@ -171,7 +171,7 @@ class FlushTest(_fixtures.FixtureTest):
         sess.rollback()
         eq_(u1.addresses.all(), [Address(email_address='lala@hoho.com')])
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_delete_nocascade(self):
         mapper(User, users, properties={
@@ -205,7 +205,7 @@ class FlushTest(_fixtures.FixtureTest):
 
         assert testing.db.scalar(addresses.count(addresses.c.user_id != None)) ==0
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_delete_cascade(self):
         mapper(User, users, properties={
@@ -239,7 +239,7 @@ class FlushTest(_fixtures.FixtureTest):
 
         assert testing.db.scalar(addresses.count()) ==0
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_remove_orphans(self):
         mapper(User, users, properties={
index d704f9992516bc8f7b75742ba22603996550d934..0083d3848be4a84c4d068c9ad6d1fef7c18d82f8 100644 (file)
@@ -440,7 +440,7 @@ class EagerTest(_fixtures.FixtureTest):
         assert 'orders' not in noeagers[0].__dict__
         assert 'addresses' not in noeagers[0].__dict__
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_limit(self):
         """Limit operations combined with lazy-load relationships."""
@@ -490,7 +490,7 @@ class EagerTest(_fixtures.FixtureTest):
             assert self.static.user_address_result == l
         self.assert_sql_count(testing.db, go, 1)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_limit_2(self):
         mapper(Keyword, keywords)
@@ -505,7 +505,7 @@ class EagerTest(_fixtures.FixtureTest):
 
         assert self.static.item_keyword_result[1:3] == l
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_limit_3(self):
         """test that the ORDER BY is propagated from the inner select to the outer select, when using the
@@ -576,7 +576,7 @@ class EagerTest(_fixtures.FixtureTest):
             assert [User(id=7, address=Address(id=1))] == l
         self.assert_sql_count(testing.db, go, 1)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_many_to_one(self):
         mapper(Address, addresses, properties = dict(
@@ -871,7 +871,7 @@ class SelfReferentialEagerTest(_base.MappedTest):
             Column('parent_id', Integer, ForeignKey('nodes.id')),
             Column('data', String(30)))
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_basic(self):
         class Node(_base.ComparableEntity):
@@ -1029,7 +1029,7 @@ class SelfReferentialEagerTest(_base.MappedTest):
             )
         )
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_no_depth(self):
         class Node(_base.ComparableEntity):
index f49df84b6522ca50119cce31ad316248d507c6fc..7db714506c14d2441a7b22afb703166945947424 100644 (file)
@@ -827,7 +827,7 @@ class RefreshTest(_fixtures.FixtureTest):
         s.expire(u)
         assert len(u.addresses) == 3
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_refresh2(self):
         """test a hang condition that was occuring on expire/refresh"""
index 282b94d3c9db10c2c7f181a2f62a6b70e904a52a..99523674141c5e061308b01bb9d996f4aea1f82c 100644 (file)
@@ -34,7 +34,7 @@ class GenerativeQueryTest(_base.MappedTest):
         assert res.order_by([Foo.bar])[0].bar == 5
         assert res.order_by([sa.desc(Foo.bar)])[0].bar == 95
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_slice(self):
         sess = create_session()
@@ -76,14 +76,15 @@ class GenerativeQueryTest(_base.MappedTest):
         query = create_session().query(func.sum(foo.c.bar))
         assert query.filter(foo.c.bar<30).one() == (435,)
 
-    @testing.fails_on('firebird', 'mssql')
+    @testing.fails_on('firebird', 'FIXME: unknown')
+    @testing.fails_on('mssql', 'AVG produces an average as the original column type on mssql.')
     @testing.resolve_artifact_names
     def test_aggregate_2(self):
         query = create_session().query(func.avg(foo.c.bar))
         avg = query.filter(foo.c.bar < 30).one()[0]
         eq_(round(avg, 1), 14.5)
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'AVG produces an average as the original column type on mssql.')
     @testing.resolve_artifact_names
     def test_aggregate_3(self):
         query = create_session().query(Foo)
index 8e51105c9e0ec585c27d8efac1625a99399ffd20..eb53aacfcaa606cfa1f14fd0a6b675dafb90309e 100644 (file)
@@ -292,7 +292,7 @@ class EagerLazyTest(ORMTest):
                         Column('foo_id', Integer, ForeignKey('foo.id'))
         )
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testbasic(self):
         class Foo(object): pass
         class Bar(Foo): pass
index f1bbc2ae7761276d7310ba357a30056276793681..43d36e9aa71790b1a14ebf5eb91da5fcf6d6d551 100644 (file)
@@ -196,7 +196,7 @@ class InheritTest3(ORMTest):
         found = repr(l[0]) + repr(sorted([repr(o) for o in l[0].foos]))
         self.assertEqual(found, compare)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testadvanced(self):
         class Foo(object):
             def __init__(self, data=None):
index f4b85dc95141566eb8649725349611acf8100664..5e9f016c18c19759a600c092f82057133ad9904d 100644 (file)
@@ -110,19 +110,19 @@ class PolymorphicCircularTest(ORMTest):
         table1_mapper.compile()
         assert table1_mapper.primary_key == [table1.c.id], table1_mapper.primary_key
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testone(self):
         self.do_testlist([Table1, Table2, Table1, Table2])
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testtwo(self):
         self.do_testlist([Table3])
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testthree(self):
         self.do_testlist([Table2, Table1, Table1B, Table3, Table3, Table1B, Table1B, Table2, Table1])
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testfour(self):
         self.do_testlist([
                 Table2('t2', [Data('data1'), Data('data2')]),
index a2cac1a8e1c471de8b2616f152ad3d8f986df67c..dfa2989d7f9045a31ce142cd76078920a08902bc 100644 (file)
@@ -509,7 +509,7 @@ class MapperTest(_fixtures.FixtureTest):
 
 
     # 'Raises a "expression evaluation not supported" error at prepare time
-    @testing.fails_on('firebird')
+    @testing.fails_on('firebird', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_function(self):
         """Mapping to a SELECT statement that has functions in it."""
@@ -853,7 +853,7 @@ class MapperTest(_fixtures.FixtureTest):
 
 class OptionsTest(_fixtures.FixtureTest):
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_synonym_options(self):
         mapper(User, users, properties=dict(
@@ -888,7 +888,7 @@ class OptionsTest(_fixtures.FixtureTest):
             eq_(l, self.static.user_address_result)
         self.sql_count_(0, go)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_eager_options_with_limit(self):
         mapper(User, users, properties=dict(
@@ -910,7 +910,7 @@ class OptionsTest(_fixtures.FixtureTest):
         eq_(u.id, 8)
         eq_(len(u.addresses), 3)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_lazy_options_with_limit(self):
         mapper(User, users, properties=dict(
index b581141da576bb5f006990bcf4f03ad5ede8b484..523894ce20896fadd40ecfe8fd495e1cd7e853ff 100644 (file)
@@ -101,8 +101,8 @@ class NaturalPKTest(_base.MappedTest):
         assert sess.query(User).get('ed').fullname == 'jack'
         
 
-    @testing.fails_on('mysql')
-    @testing.fails_on('sqlite')
+    @testing.fails_on('mysql', 'FIXME: unknown')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     def test_onetomany_passive(self):
         self._test_onetomany(True)
 
@@ -153,8 +153,8 @@ class NaturalPKTest(_base.MappedTest):
         self.assertEquals(User(username='fred', fullname='jack'), u1)
         
 
-    @testing.fails_on('sqlite')
-    @testing.fails_on('mysql')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_manytoone_passive(self):
         self._test_manytoone(True)
 
@@ -198,8 +198,8 @@ class NaturalPKTest(_base.MappedTest):
         sess.clear()
         self.assertEquals([Address(username='ed'), Address(username='ed')], sess.query(Address).all())
 
-    @testing.fails_on('sqlite')
-    @testing.fails_on('mysql')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_bidirectional_passive(self):
         self._test_bidirectional(True)
 
@@ -252,8 +252,8 @@ class NaturalPKTest(_base.MappedTest):
         self.assertEquals([Address(username='fred'), Address(username='fred')], sess.query(Address).all())
 
 
-    @testing.fails_on('sqlite')
-    @testing.fails_on('mysql')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_manytomany_passive(self):
         self._test_manytomany(True)
 
@@ -368,8 +368,8 @@ class NonPKCascadeTest(_base.MappedTest):
         class Address(_base.ComparableEntity):
             pass
 
-    @testing.fails_on('sqlite')
-    @testing.fails_on('mysql')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_onetomany_passive(self):
         self._test_onetomany(True)
 
index e5de70dc08ec1c8cdc5f8c2b4c8acdcda4deea5e..0a70ddaaac7dfdb3c89ac11d1d82e4c3f9f1c920 100644 (file)
@@ -602,7 +602,7 @@ class FilterTest(QueryTest):
     def test_basic(self):
         assert [User(id=7), User(id=8), User(id=9),User(id=10)] == create_session().query(User).all()
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def test_limit(self):
         assert [User(id=8), User(id=9)] == create_session().query(User).order_by(User.id).limit(2).offset(1).all()
 
@@ -1534,7 +1534,7 @@ class MixedEntitiesTest(QueryTest):
         q2 = q.select_from(sel).filter(users.c.id==8).filter(users.c.id>sel.c.id).values(users.c.name, sel.c.name, User.name)
         self.assertEquals(list(q2), [(u'ed', u'jack', u'jack')])
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'FIXME: unknown')
     def test_values_specific_order_by(self):
         sess = create_session()
 
@@ -1546,7 +1546,7 @@ class MixedEntitiesTest(QueryTest):
         q2 = q.select_from(sel).filter(u2.id>1).order_by([User.id, sel.c.id, u2.id]).values(User.name, sel.c.name, u2.name)
         self.assertEquals(list(q2), [(u'jack', u'jack', u'jack'), (u'jack', u'jack', u'ed'), (u'jack', u'jack', u'fred'), (u'jack', u'jack', u'chuck'), (u'ed', u'ed', u'jack'), (u'ed', u'ed', u'ed'), (u'ed', u'ed', u'fred'), (u'ed', u'ed', u'chuck')])
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'FIXME: unknown')
     def test_values_with_boolean_selects(self):
         """Tests a values clause that works with select boolean evaluations"""
         sess = create_session()
@@ -2660,7 +2660,7 @@ class UpdateDeleteTest(_base.MappedTest):
         
         eq_(sess.query(User).order_by(User.id).all(), [jack,jane])
     
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_delete_fallback(self):
         sess = create_session(bind=testing.db, autocommit=False)
index 57780e4e5b0ac0eb0cd7934cb1319e0ad3731139..6114a0212917d5bcf331dd3cf474f808d6d6a4c3 100644 (file)
@@ -392,7 +392,7 @@ class SessionTest(_fixtures.FixtureTest):
         assert session.connection().execute("select count(1) from users").scalar() == 2
 
     @testing.crashes('mssql', 'test causes mssql to hang')
-    @testing.fails_on('sqlite')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_transactions_isolated(self):
         mapper(User, users)
index 7bdbe745c31b9b28190f4d911d0863f5b702db93..1083435d71f2080da4aaec0a36ae2cade1e69c25 100644 (file)
@@ -518,7 +518,7 @@ class PKTest(_base.MappedTest):
 
     # not supported on sqlite since sqlite's auto-pk generation only works with
     # single column primary keys
-    @testing.fails_on('sqlite')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_primary_key(self):
         mapper(Entry, multipk1)
@@ -884,7 +884,7 @@ class DefaultTest(_base.MappedTest):
         class Secondary(_base.ComparableEntity):
             pass
 
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown on the parameter')
     @testing.resolve_artifact_names
     def test_insert(self):
         mapper(Hoho, default_t)
@@ -929,7 +929,7 @@ class DefaultTest(_base.MappedTest):
         self.assert_(h2.foober == h3.foober == h4.foober == 'im foober')
         eq_(h5.foober, 'im the new foober')
 
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown on the parameter')
     @testing.resolve_artifact_names
     def test_eager_defaults(self):
         mapper(Hoho, default_t, eager_defaults=True)
@@ -959,7 +959,7 @@ class DefaultTest(_base.MappedTest):
             eq_(h1.foober, "im foober")
         self.sql_count_(0, go)
 
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown on the parameter')
     @testing.resolve_artifact_names
     def test_update(self):
         mapper(Hoho, default_t)
@@ -974,7 +974,7 @@ class DefaultTest(_base.MappedTest):
         session.flush()
         eq_(h1.foober, 'im the update')
 
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown on the parameter')
     @testing.resolve_artifact_names
     def test_used_in_relation(self):
         """A server-side default can be used as the target of a foreign key"""
@@ -1451,7 +1451,7 @@ class SaveTest(_fixtures.FixtureTest):
 
     # why no support on oracle ?  because oracle doesn't save
     # "blank" strings; it saves a single space character.
-    @testing.fails_on('oracle')
+    @testing.fails_on('oracle', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_dont_update_blanks(self):
         mapper(User, users)
index 4d017a977d30eb7e2e8a8836100b3c26b574d8b0..1d5383749516b657cecc2cf90c759740eccf5e1a 100644 (file)
@@ -27,7 +27,8 @@ class CaseTest(TestBase, AssertsCompiledSQL):
     def tearDownAll(self):
         info_table.drop()
 
-    @testing.fails_on('firebird', 'maxdb')
+    @testing.fails_on('firebird', 'FIXME: unknown')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.requires.subqueries
     def testcase(self):
         inner = select([case([
@@ -98,7 +99,8 @@ class CaseTest(TestBase, AssertsCompiledSQL):
         self.assert_compile(case([(t.c.col1==7, "y")], else_="z"), "CASE WHEN (test.col1 = :col1_1) THEN :param_1 ELSE :param_2 END")
 
         
-    @testing.fails_on('firebird', 'maxdb')
+    @testing.fails_on('firebird', 'FIXME: unknown')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def testcase_with_dict(self):
         query = select([case({
                     info_table.c.pk < 3: 'lessthan3',
index ab08c6d981d02f9d8b2c0ba832ca1189a76e0335..c9b52da7cba7242a3c62f4c13817fa47058f93a6 100644 (file)
@@ -63,7 +63,7 @@ class ConstraintTest(TestBase, AssertsExecutionResults):
             )
         metadata.create_all()
 
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_check_constraint(self):
         foo = Table('foo', metadata,
             Column('id', Integer, primary_key=True),
index de939f08d6138c452e8cda7c712365e5ce0a1df1..bea6dc04bea01d7eb253cec4e30a8f49afd57817 100644 (file)
@@ -167,7 +167,7 @@ class DefaultTest(testing.TestBase):
         for fn in fn1, fn2, fn3, fn4, fn5, fn6, fn7, fn8:
             c = sa.ColumnDefault(fn)
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_standalone(self):
         c = testing.db.engine.contextual_connect()
         x = c.execute(t.c.col1.default)
@@ -246,7 +246,7 @@ class DefaultTest(testing.TestBase):
         has_('col7', 'default', 'server_default', 'onupdate')
         has_('col8', 'default', 'server_default', 'onupdate', 'server_onupdate')
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_insert(self):
         r = t.insert().execute()
         assert r.lastrow_has_defaults()
@@ -277,7 +277,7 @@ class DefaultTest(testing.TestBase):
             [(54, 'imthedefault', f, ts, ts, ctexec, True, False,
               12, today, None)])
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_insertmany(self):
         # MySQL-Python 1.2.2 breaks functions in execute_many :(
         if (testing.against('mysql') and
@@ -302,7 +302,7 @@ class DefaultTest(testing.TestBase):
         l = t.select().execute()
         eq_(50, l.fetchone()['col3'])
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_updatemany(self):
         # MySQL-Python 1.2.2 breaks functions in execute_many :(
         if (testing.against('mysql') and
@@ -330,7 +330,7 @@ class DefaultTest(testing.TestBase):
              (53, 'im the update', f2, ts, ts, ctexec, True, False,
               13, today, 'py')])
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_update(self):
         r = t.insert().execute()
         pk = r.last_inserted_ids()[0]
@@ -343,7 +343,7 @@ class DefaultTest(testing.TestBase):
              13, datetime.date.today(), 'py'))
         eq_(11, f2)
 
-    @testing.fails_on('firebird') # 'Data type unknown'
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_update_values(self):
         r = t.insert().execute()
         pk = r.last_inserted_ids()[0]
@@ -396,7 +396,7 @@ class PKDefaultTest(_base.TablesTest):
                      default=sa.select([func.max(t2.c.nextid)]).as_scalar()),
               Column('data', String(30)))
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'FIXME: unknown')
     @testing.resolve_artifact_names
     def test_basic(self):
         t2.insert().execute(nextid=1)
@@ -419,7 +419,7 @@ class PKIncrementTest(_base.TablesTest):
               Column('str1', String(20)))
 
     # TODO: add coverage for increment on a secondary column in a key
-    @testing.fails_on('firebird') # data type unknown
+    @testing.fails_on('firebird', 'Data type unknown')
     @testing.resolve_artifact_names
     def _test_autoincrement(self, bind):
         ids = set()
@@ -475,7 +475,7 @@ class PKIncrementTest(_base.TablesTest):
 
 class EmptyInsertTest(testing.TestBase):
     @testing.exclude('sqlite', '<', (3, 3, 8), 'no empty insert support')
-    @testing.fails_on('oracle')
+    @testing.fails_on('oracle', 'FIXME: unknown')
     def test_empty_insert(self):
         metadata = MetaData(testing.db)
         t1 = Table('t1', metadata,
@@ -518,7 +518,7 @@ class AutoIncrementTest(_base.TablesTest):
         id_ = r.last_inserted_ids()[0]
         nodes.insert().execute(data='bar', parent_id=id_)
 
-    @testing.fails_on('sqlite')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     def test_non_autoincrement(self):
         # sqlite INT primary keys can be non-unique! (only for ints)
         nonai = Table("nonaitest", self.metadata,
@@ -592,7 +592,7 @@ class SequenceTest(testing.TestBase):
 
         cartitems.select().execute().fetchall()
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     # maxdb db-api seems to double-execute NEXTVAL internally somewhere,
     # throwing off the numbers for these tests...
     def test_implicit_sequence_exec(self):
@@ -604,7 +604,7 @@ class SequenceTest(testing.TestBase):
         finally:
             s.drop()
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def teststandalone_explicit(self):
         s = Sequence("my_sequence")
         s.create(bind=testing.db)
@@ -621,7 +621,7 @@ class SequenceTest(testing.TestBase):
         s.drop(testing.db, checkfirst=False)
         s.drop(testing.db, checkfirst=True)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def teststandalone2(self):
         x = cartitems.c.cart_id.sequence.execute()
         self.assert_(1 <= x <= 4)
index 011ced602dca38d0a07dde856dcda38375347d26..86ad02aa4ac506717285d0ba11c7a4868d2cabee 100644 (file)
@@ -140,7 +140,7 @@ class QueryTest(TestBase):
             l.append(row)
         self.assert_(len(l) == 3)
 
-    @testing.fails_on('firebird') # Data type unknown
+    @testing.fails_on('firebird', 'Data type unknown')
     @testing.requires.subqueries
     def test_anonymous_rows(self):
         users.insert().execute(
@@ -200,7 +200,8 @@ class QueryTest(TestBase):
         self.assert_(not (rp != equal))
         self.assert_(not (equal != equal))
 
-    @testing.fails_on('mssql', 'oracle')
+    @testing.fails_on('mssql', 'No support for boolean logic in column select.')
+    @testing.fails_on('oracle', 'FIXME: unknown')
     def test_or_and_as_columns(self):
         true, false = literal(True), literal(False)
         
@@ -590,7 +591,10 @@ class QueryTest(TestBase):
         r = s.execute(search_key=None).fetchall()
         assert len(r) == 0
 
-    @testing.fails_on('firebird', 'maxdb', 'oracle', 'mssql')
+    @testing.fails_on('firebird', 'FIXME: unknown')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
+    @testing.fails_on('oracle', 'FIXME: unknown')
+    @testing.fails_on('mssql', 'FIXME: unknown')
     def test_in_filtering_advanced(self):
         """test the behavior of the in_() function when comparing against an empty collection."""
 
@@ -648,7 +652,7 @@ class LimitTest(TestBase):
         r = users.select(limit=3, order_by=[users.c.user_id]).execute().fetchall()
         self.assert_(r == [(1, 'john'), (2, 'jack'), (3, 'ed')], repr(r))
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def test_select_limit_offset(self):
         """Test the interaction between limit and offset"""
 
@@ -664,7 +668,7 @@ class LimitTest(TestBase):
         self.assert_(len(r) == 3, repr(r))
         self.assert_(r[0] != r[1] and r[1] != r[2], repr(r))
 
-    @testing.fails_on('mssql')
+    @testing.fails_on('mssql', 'FIXME: unknown')
     def test_select_distinct_offset(self):
         """Test the interaction between distinct and offset"""
 
@@ -756,7 +760,7 @@ class CompoundTest(TestBase):
                   ('ccc', 'aaa')]
         self.assertEquals(u.execute().fetchall(), wanted)
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     @testing.requires.subqueries
     def test_union_ordered_alias(self):
         (s1, s2) = (
@@ -772,8 +776,8 @@ class CompoundTest(TestBase):
         self.assertEquals(u.alias('bar').select().execute().fetchall(), wanted)
 
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('mysql')
-    @testing.fails_on('sqlite')
+    @testing.fails_on('mysql', 'FIXME: unknown')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     def test_union_all(self):
         e = union_all(
             select([t1.c.col3]),
@@ -792,7 +796,7 @@ class CompoundTest(TestBase):
 
     @testing.crashes('firebird', 'Does not support intersect')
     @testing.crashes('sybase', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_intersect(self):
         i = intersect(
             select([t2.c.col3, t2.c.col4]),
@@ -810,7 +814,7 @@ class CompoundTest(TestBase):
     @testing.crashes('firebird', 'Does not support except')
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
     @testing.crashes('sybase', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_except_style1(self):
         e = except_(union(
             select([t1.c.col3, t1.c.col4]),
@@ -827,7 +831,7 @@ class CompoundTest(TestBase):
     @testing.crashes('firebird', 'Does not support except')
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
     @testing.crashes('sybase', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_except_style2(self):
         e = except_(union(
             select([t1.c.col3, t1.c.col4]),
@@ -847,8 +851,8 @@ class CompoundTest(TestBase):
     @testing.crashes('firebird', 'Does not support except')
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
     @testing.crashes('sybase', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('mysql')
-    @testing.fails_on('sqlite')
+    @testing.fails_on('mysql', 'FIXME: unknown')
+    @testing.fails_on('sqlite', 'FIXME: unknown')
     def test_except_style3(self):
         # aaa, bbb, ccc - (aaa, bbb, ccc - (ccc)) = ccc
         e = except_(
@@ -863,7 +867,7 @@ class CompoundTest(TestBase):
                           [('ccc',)])
 
     @testing.crashes('firebird', 'Does not support intersect')
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_composite(self):
         u = intersect(
             select([t2.c.col3, t2.c.col4]),
@@ -879,7 +883,7 @@ class CompoundTest(TestBase):
         self.assertEquals(found, wanted)
 
     @testing.crashes('firebird', 'Does not support intersect')
-    @testing.fails_on('mysql')
+    @testing.fails_on('mysql', 'FIXME: unknown')
     def test_composite_alias(self):
         ua = intersect(
             select([t2.c.col3, t2.c.col4]),
@@ -1184,7 +1188,7 @@ class OperatorTest(TestBase):
     def tearDownAll(self):
         metadata.drop_all()
 
-    @testing.fails_on('maxdb')
+    @testing.fails_on('maxdb', 'FIXME: unknown')
     def test_modulo(self):
         self.assertEquals(
             select([flds.c.intcol % 3],
index e66ff6b116a0b91a832ce125be08a09efe2796a0..02eebf6312dacefc4900e7370d650346cd78b6ff 100644 (file)
@@ -344,7 +344,7 @@ class UnicodeTest(TestBase, AssertsExecutionResults):
         finally:
             unicode_engine.dispose()
 
-    @testing.fails_on('oracle')
+    @testing.fails_on('oracle', 'FIXME: unknown')
     def test_blank_strings(self):
         unicode_table.insert().execute(unicode_varchar=u'')
         assert select([unicode_table.c.unicode_varchar]).scalar() == u''
@@ -374,7 +374,7 @@ class UnicodeTest(TestBase, AssertsExecutionResults):
             testing.db.engine.dialect.convert_unicode = prev_assert
 
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown')
     def test_length_function(self):
         """checks the database correctly understands the length of a unicode string"""
         teststr = u'aaa\x1234'
@@ -498,7 +498,7 @@ class ExpressionTest(TestBase, AssertsExecutionResults):
         assert expr.right.type.__class__ == test_table.c.avalue.type.__class__
         assert testing.db.execute(test_table.select().where(expr), {"somevalue":25}).fetchall() == [(1, 'somedata', datetime.date(2007, 10, 15), 25)]
 
-    @testing.fails_on('firebird') # "Data type unknown" on the parameter
+    @testing.fails_on('firebird', 'Data type unknown on the parameter')
     def test_operator_adapt(self):
         """test type-based overloading of operators"""
 
@@ -657,7 +657,8 @@ class DateTest(TestBase, AssertsExecutionResults):
             t.drop(checkfirst=True)
 
 class StringTest(TestBase, AssertsExecutionResults):
-    @testing.fails_on('mysql', 'oracle')
+    @testing.fails_on('mysql', 'FIXME: unknown')
+    @testing.fails_on('oracle', 'FIXME: unknown')
     def test_nolength_string(self):
         metadata = MetaData(testing.db)
         foo = Table('foo', metadata, Column('one', String))
index ed7669be99a03d629dc3cee19262984fc0956f3d..650fa86a7599c0a9ceaec3a3b3af16485774f0fa 100644 (file)
@@ -91,8 +91,9 @@ def future(fn):
                 "Unexpected success for future test '%s'" % fn_name)
     return _function_named(decorated, fn_name)
 
-def fails_on(*dbs):
-    """Mark a test as expected to fail on one or more database implementations.
+def fails_on(dbs, reason):
+    """Mark a test as expected to fail on the specified database 
+    implementation.
 
     Unlike ``crashes``, tests marked as ``fails_on`` will be run
     for the named databases.  The test is expected to fail and the unit test
@@ -103,7 +104,7 @@ def fails_on(*dbs):
     def decorate(fn):
         fn_name = fn.__name__
         def maybe(*args, **kw):
-            if config.db.name not in dbs:
+            if config.db.name != dbs:
                 return fn(*args, **kw)
             else:
                 try:
@@ -111,7 +112,7 @@ def fails_on(*dbs):
                 except Exception, ex:
                     print ("'%s' failed as expected on DB implementation "
                            "'%s': %s" % (
-                        fn_name, config.db.name, str(ex)))
+                        fn_name, config.db.name, reason))
                     return True
                 else:
                     raise AssertionError(