From: Michael Trier Date: Fri, 12 Dec 2008 03:41:05 +0000 (+0000) Subject: Modified fails_on testing decorator to take a reason for the failure. X-Git-Tag: rel_0_5_0~106 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1d90146210b0919294a99468a916d4084fc14c7d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Modified fails_on testing decorator to take a reason for the failure. This should assist with helping to document the reasons for testing failures. Currently unspecified failures are defaulted to 'FIXME: unknown'. --- diff --git a/test/engine/execute.py b/test/engine/execute.py index c45c0744d2..5b3478c56c 100644 --- a/test/engine/execute.py +++ b/test/engine/execute.py @@ -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 = [] diff --git a/test/engine/reconnect.py b/test/engine/reconnect.py index 936ea97e49..64d3fb7943 100644 --- a/test/engine/reconnect.py +++ b/test/engine/reconnect.py @@ -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() diff --git a/test/engine/reflection.py b/test/engine/reflection.py index e478e7c7a6..a04e218541 100644 --- a/test/engine/reflection.py +++ b/test/engine/reflection.py @@ -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 diff --git a/test/engine/transaction.py b/test/engine/transaction.py index 7d8d6bd61a..1fa3856108 100644 --- a/test/engine/transaction.py +++ b/test/engine/transaction.py @@ -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') diff --git a/test/orm/assorted_eager.py b/test/orm/assorted_eager.py index a0c049fdd6..1fc05380ab 100644 --- a/test/orm/assorted_eager.py +++ b/test/orm/assorted_eager.py @@ -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() diff --git a/test/orm/cascade.py b/test/orm/cascade.py index 56337b9ba4..0a3f800d3f 100644 --- a/test/orm/cascade.py +++ b/test/orm/cascade.py @@ -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() diff --git a/test/orm/dynamic.py b/test/orm/dynamic.py index 4f7880e4c5..1ad00d7486 100644 --- a/test/orm/dynamic.py +++ b/test/orm/dynamic.py @@ -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={ diff --git a/test/orm/eager_relations.py b/test/orm/eager_relations.py index d704f99925..0083d3848b 100644 --- a/test/orm/eager_relations.py +++ b/test/orm/eager_relations.py @@ -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): diff --git a/test/orm/expire.py b/test/orm/expire.py index f49df84b65..7db714506c 100644 --- a/test/orm/expire.py +++ b/test/orm/expire.py @@ -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""" diff --git a/test/orm/generative.py b/test/orm/generative.py index 282b94d3c9..9952367414 100644 --- a/test/orm/generative.py +++ b/test/orm/generative.py @@ -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) diff --git a/test/orm/inheritance/basic.py b/test/orm/inheritance/basic.py index 8e51105c9e..eb53aacfca 100644 --- a/test/orm/inheritance/basic.py +++ b/test/orm/inheritance/basic.py @@ -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 diff --git a/test/orm/inheritance/manytomany.py b/test/orm/inheritance/manytomany.py index f1bbc2ae77..43d36e9aa7 100644 --- a/test/orm/inheritance/manytomany.py +++ b/test/orm/inheritance/manytomany.py @@ -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): diff --git a/test/orm/inheritance/poly_linked_list.py b/test/orm/inheritance/poly_linked_list.py index f4b85dc951..5e9f016c18 100644 --- a/test/orm/inheritance/poly_linked_list.py +++ b/test/orm/inheritance/poly_linked_list.py @@ -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')]), diff --git a/test/orm/mapper.py b/test/orm/mapper.py index a2cac1a8e1..dfa2989d7f 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -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( diff --git a/test/orm/naturalpks.py b/test/orm/naturalpks.py index b581141da5..523894ce20 100644 --- a/test/orm/naturalpks.py +++ b/test/orm/naturalpks.py @@ -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) diff --git a/test/orm/query.py b/test/orm/query.py index e5de70dc08..0a70ddaaac 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -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) diff --git a/test/orm/session.py b/test/orm/session.py index 57780e4e5b..6114a02129 100644 --- a/test/orm/session.py +++ b/test/orm/session.py @@ -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) diff --git a/test/orm/unitofwork.py b/test/orm/unitofwork.py index 7bdbe745c3..1083435d71 100644 --- a/test/orm/unitofwork.py +++ b/test/orm/unitofwork.py @@ -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) diff --git a/test/sql/case_statement.py b/test/sql/case_statement.py index 4d017a977d..1d53837495 100644 --- a/test/sql/case_statement.py +++ b/test/sql/case_statement.py @@ -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', diff --git a/test/sql/constraints.py b/test/sql/constraints.py index ab08c6d981..c9b52da7cb 100644 --- a/test/sql/constraints.py +++ b/test/sql/constraints.py @@ -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), diff --git a/test/sql/defaults.py b/test/sql/defaults.py index de939f08d6..bea6dc04be 100644 --- a/test/sql/defaults.py +++ b/test/sql/defaults.py @@ -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) diff --git a/test/sql/query.py b/test/sql/query.py index 011ced602d..86ad02aa4a 100644 --- a/test/sql/query.py +++ b/test/sql/query.py @@ -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], diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index e66ff6b116..02eebf6312 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -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)) diff --git a/test/testlib/testing.py b/test/testlib/testing.py index ed7669be99..650fa86a75 100644 --- a/test/testlib/testing.py +++ b/test/testlib/testing.py @@ -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(