]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- rename __multiple__ to __backend__, and apply __backend__ to a large number of...
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 24 Mar 2014 15:33:53 +0000 (11:33 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 24 Mar 2014 15:33:53 +0000 (11:33 -0400)
- move out logging tests from test_execute to test_logging

33 files changed:
lib/sqlalchemy/testing/plugin/plugin_base.py
lib/sqlalchemy/testing/plugin/pytestplugin.py
lib/sqlalchemy/testing/suite/test_ddl.py
lib/sqlalchemy/testing/suite/test_insert.py
lib/sqlalchemy/testing/suite/test_reflection.py
lib/sqlalchemy/testing/suite/test_results.py
lib/sqlalchemy/testing/suite/test_select.py
lib/sqlalchemy/testing/suite/test_sequence.py
lib/sqlalchemy/testing/suite/test_types.py
lib/sqlalchemy/testing/suite/test_update_delete.py
test/aaa_profiling/test_compiler.py
test/aaa_profiling/test_memusage.py
test/aaa_profiling/test_orm.py
test/aaa_profiling/test_resultset.py
test/engine/test_execute.py
test/engine/test_logging.py [new file with mode: 0644]
test/engine/test_reflection.py
test/engine/test_transaction.py
test/orm/inheritance/test_polymorphic_rel.py
test/orm/test_naturalpks.py
test/orm/test_session.py
test/orm/test_transaction.py
test/orm/test_versioning.py
test/sql/test_constraints.py
test/sql/test_defaults.py
test/sql/test_join_rewriting.py
test/sql/test_query.py
test/sql/test_quote.py
test/sql/test_returning.py
test/sql/test_rowcount.py
test/sql/test_types.py
test/sql/test_unicode.py
test/sql/test_update.py

index 8bdb7b0788d1392ab0fa8de0d95daa825777744f..d97546a67ca771f7ee667147b3a044de25459d4f 100644 (file)
@@ -63,6 +63,8 @@ def setup_options(make_option):
         help="Database uri.  Multiple OK, first one is run by default.")
     make_option("--dropfirst", action="store_true", dest="dropfirst",
         help="Drop all tables in the target database first")
+    make_option("--backend-only", action="store_true", dest="backend_only",
+        help="Run only tests marked with __backend__")
     make_option("--mockpool", action="store_true", dest="mockpool",
         help="Use mock pool (asserts only one connection used)")
     make_option("--low-connections", action="store_true", dest="low_connections",
@@ -309,11 +311,13 @@ def want_class(cls):
         return False
     elif cls.__name__.startswith('_'):
         return False
+    elif config.options.backend_only and not getattr(cls, '__backend__', False):
+        return False
     else:
         return True
 
 def generate_sub_tests(cls, module):
-    if getattr(cls, '__multiple__', False):
+    if getattr(cls, '__backend__', False):
         for cfg in config.Config.all_configs():
             name = "%s_%s_%s" % (cls.__name__, cfg.db.name, cfg.db.driver)
             subcls = type(
@@ -321,7 +325,7 @@ def generate_sub_tests(cls, module):
                         (cls, ),
                         {
                             "__only_on__": (cfg.db.name, cfg.db.driver),
-                            "__multiple__": False}
+                            "__backend__": False}
                         )
             setattr(module, name, subcls)
             yield subcls
index c51768567ebabdd5ac8098141db9d4fd0307f50b..ceb6963edff8c827559a8f72cc75f2251828dc4d 100644 (file)
@@ -29,7 +29,7 @@ def pytest_configure(config):
 
 
 def pytest_collection_modifyitems(session, config, items):
-    # look for all those classes that specify __multiple__ and
+    # look for all those classes that specify __backend__ and
     # expand them out into per-database test cases.
 
     # this is much easier to do within pytest_pycollect_makeitem, however
index b14d47b4d3230a669d9f3723902af89c27dd9a70..2dca1443d40d5c94fe356f502bdbf1feadc779b8 100644 (file)
@@ -8,7 +8,7 @@ from sqlalchemy import Table, Column, Integer, String
 
 
 class TableDDLTest(fixtures.TestBase):
-    __multiple__ = True
+    __backend__ = True
 
     def _simple_fixture(self):
         return Table('test_table', self.metadata,
index b6fb597dc0c8790a2ba811f0b46dc6bc9e03ba7d..3444e15c8dfab03c4102dfc1fb86767a4c14cea6 100644 (file)
@@ -12,7 +12,7 @@ from ..schema import Table, Column
 class LastrowidTest(fixtures.TablesTest):
     run_deletes = 'each'
 
-    __multiple__ = True
+    __backend__ = True
 
     __requires__ = 'implements_get_lastrowid', 'autoincrement_insert'
 
@@ -76,7 +76,7 @@ class LastrowidTest(fixtures.TablesTest):
 
 class InsertBehaviorTest(fixtures.TablesTest):
     run_deletes = 'each'
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -161,7 +161,7 @@ class InsertBehaviorTest(fixtures.TablesTest):
 class ReturningTest(fixtures.TablesTest):
     run_create_tables = 'each'
     __requires__ = 'returning', 'autoincrement_insert'
-    __multiple__ = True
+    __backend__ = True
 
     __engine_options__ = {"implicit_returning": True}
 
index 4476914702233a99271b2cb97ab03a6a9020956c..762c9955c9e2eb2750c5940a6306c6c2eacf1e28 100644 (file)
@@ -19,7 +19,7 @@ metadata, users = None, None
 
 
 class HasTableTest(fixtures.TablesTest):
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -39,7 +39,7 @@ class HasTableTest(fixtures.TablesTest):
 class ComponentReflectionTest(fixtures.TablesTest):
     run_inserts = run_deletes = None
 
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 87d85f6e6f212427b1ee39a294bcf605b63b9344..2fdab4d17a28a6b3d09874f24614c3365fcdfd4c 100644 (file)
@@ -10,7 +10,7 @@ from ..schema import Table, Column
 
 
 class RowFetchTest(fixtures.TablesTest):
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -119,7 +119,7 @@ class PercentSchemaNamesTest(fixtures.TablesTest):
 
     __requires__ = ('percent_schema_names', )
 
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 946fc0d8c5151bd8be16fbc15ecaca2b91a008bb..2ccff61ea7289ed5879604feabbdc28fffa5d3f7 100644 (file)
@@ -15,7 +15,7 @@ class OrderByLabelTest(fixtures.TablesTest):
     setting.
 
     """
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 9757a295c4b817e11aa9bd435d047c31948e9e6e..6bc2822fcfc920c8e7f253abe45457bc15579c36 100644 (file)
@@ -9,7 +9,7 @@ from ..schema import Table, Column
 
 class SequenceTest(fixtures.TablesTest):
     __requires__ = ('sequences',)
-    __multiple__ = True
+    __backend__ = True
 
     run_create_tables = 'each'
 
@@ -73,7 +73,7 @@ class SequenceTest(fixtures.TablesTest):
 
 class HasSequenceTest(fixtures.TestBase):
     __requires__ = 'sequences',
-    __multiple__ = True
+    __backend__ = True
 
     def test_has_sequence(self):
         s1 = Sequence('user_id_seq')
index 9f0d9b7aabf29b4813eed1a1e87ba7e9248d65f1..811ad1c717485f5bffae130cebc0b15c5f1a4aa0 100644 (file)
@@ -120,7 +120,7 @@ class _UnicodeFixture(_LiteralRoundTripFixture):
 
 class UnicodeVarcharTest(_UnicodeFixture, fixtures.TablesTest):
     __requires__ = 'unicode_data',
-    __multiple__ = True
+    __backend__ = True
 
     datatype = Unicode(255)
 
@@ -131,7 +131,7 @@ class UnicodeVarcharTest(_UnicodeFixture, fixtures.TablesTest):
 
 class UnicodeTextTest(_UnicodeFixture, fixtures.TablesTest):
     __requires__ = 'unicode_data', 'text_type'
-    __multiple__ = True
+    __backend__ = True
 
     datatype = UnicodeText()
 
@@ -140,7 +140,7 @@ class UnicodeTextTest(_UnicodeFixture, fixtures.TablesTest):
         self._test_empty_strings()
 
 class TextTest(_LiteralRoundTripFixture, fixtures.TablesTest):
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -186,7 +186,7 @@ class TextTest(_LiteralRoundTripFixture, fixtures.TablesTest):
         self._literal_round_trip(Text, [data], [data])
 
 class StringTest(_LiteralRoundTripFixture, fixtures.TestBase):
-    __multiple__ = True
+    __backend__ = True
 
     @requirements.unbounded_varchar
     def test_nolength_string(self):
@@ -264,42 +264,42 @@ class _DateFixture(_LiteralRoundTripFixture):
 
 class DateTimeTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'datetime',
-    __multiple__ = True
+    __backend__ = True
     datatype = DateTime
     data = datetime.datetime(2012, 10, 15, 12, 57, 18)
 
 
 class DateTimeMicrosecondsTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'datetime_microseconds',
-    __multiple__ = True
+    __backend__ = True
     datatype = DateTime
     data = datetime.datetime(2012, 10, 15, 12, 57, 18, 396)
 
 
 class TimeTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'time',
-    __multiple__ = True
+    __backend__ = True
     datatype = Time
     data = datetime.time(12, 57, 18)
 
 
 class TimeMicrosecondsTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'time_microseconds',
-    __multiple__ = True
+    __backend__ = True
     datatype = Time
     data = datetime.time(12, 57, 18, 396)
 
 
 class DateTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'date',
-    __multiple__ = True
+    __backend__ = True
     datatype = Date
     data = datetime.date(2012, 10, 15)
 
 
 class DateTimeCoercedToDateTimeTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'date',
-    __multiple__ = True
+    __backend__ = True
     datatype = Date
     data = datetime.datetime(2012, 10, 15, 12, 57, 18)
     compare = datetime.date(2012, 10, 15)
@@ -307,25 +307,25 @@ class DateTimeCoercedToDateTimeTest(_DateFixture, fixtures.TablesTest):
 
 class DateTimeHistoricTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'datetime_historic',
-    __multiple__ = True
+    __backend__ = True
     datatype = DateTime
     data = datetime.datetime(1850, 11, 10, 11, 52, 35)
 
 
 class DateHistoricTest(_DateFixture, fixtures.TablesTest):
     __requires__ = 'date_historic',
-    __multiple__ = True
+    __backend__ = True
     datatype = Date
     data = datetime.date(1727, 4, 1)
 
 
 class IntegerTest(_LiteralRoundTripFixture, fixtures.TestBase):
-    __multiple__ = True
+    __backend__ = True
     def test_literal(self):
         self._literal_round_trip(Integer, [5], [5])
 
 class NumericTest(_LiteralRoundTripFixture, fixtures.TestBase):
-    __multiple__ = True
+    __backend__ = True
 
     @testing.emits_warning(r".*does \*not\* support Decimal objects natively")
     @testing.provide_metadata
@@ -520,7 +520,7 @@ class NumericTest(_LiteralRoundTripFixture, fixtures.TestBase):
 
 
 class BooleanTest(_LiteralRoundTripFixture, fixtures.TablesTest):
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 3cb905615d5ad453d21c7d9ff7373240723acf91..88dc95355f9a6b091d25e5dd07cf15aee6b9d318 100644 (file)
@@ -7,7 +7,7 @@ from ..schema import Table, Column
 
 class SimpleUpdateDeleteTest(fixtures.TablesTest):
     run_deletes = 'each'
-    __multiple__ = True
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 8304296dadcc77349b40dd87f02aace41b131df8..659f79664aae6333d9e26164f3dff1cff2c03372 100644 (file)
@@ -4,6 +4,7 @@ from sqlalchemy.engine import default
 
 class CompileTest(fixtures.TestBase, AssertsExecutionResults):
     __requires__ = 'cpython',
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
index 3766abb88980a3d23e9309aa549380fe4bef6425..f9c853b89917e1c4c7ebcba45c34b37306baa294 100644 (file)
@@ -84,6 +84,7 @@ class EnsureZeroed(fixtures.ORMTest):
 class MemUsageTest(EnsureZeroed):
 
     __requires__ = 'cpython',
+    __backend__ = True
 
     # ensure a pure growing test trips the assertion
     @testing.fails_if(lambda: True)
index 2c1e84afb0ccee363c2c254a17d8d5701c3863ff..ff55b1c2691721e07e92d9ff8567736b1c2ae651 100644 (file)
@@ -10,6 +10,7 @@ from sqlalchemy.testing.schema import Table, Column
 import sys
 
 class MergeTest(fixtures.MappedTest):
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -104,6 +105,7 @@ class LoadManyToOneFromIdentityTest(fixtures.MappedTest):
     to load 1000 related objects from the identity map.
 
     """
+    __backend__ = True
 
 
     @classmethod
@@ -258,6 +260,8 @@ class MergeBackrefsTest(fixtures.MappedTest):
             s.merge(a)
 
 class DeferOptionsTest(fixtures.MappedTest):
+    __backend__ = True
+
     @classmethod
     def define_tables(cls, metadata):
         Table('a', metadata,
@@ -312,6 +316,8 @@ class DeferOptionsTest(fixtures.MappedTest):
 
 
 class AttributeOverheadTest(fixtures.MappedTest):
+    __backend__ = True
+
     @classmethod
     def define_tables(cls, metadata):
         Table('parent', metadata, Column('id', Integer,
index d2f8c22566df96cd0df0695872bbfc9de39e577f..a8b9f9d6fe1c1e72e3c0c6e414bebdfe1fa6b9d6 100644 (file)
@@ -11,6 +11,7 @@ NUM_RECORDS = 1000
 
 
 class ResultSetTest(fixtures.TestBase, AssertsExecutionResults):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -55,6 +56,7 @@ class ResultSetTest(fixtures.TestBase, AssertsExecutionResults):
 
 
 class ExecutionTest(fixtures.TestBase):
+    __backend__ = True
 
     def test_minimal_connection_execute(self):
         # create an engine without any instrumentation.
@@ -82,6 +84,7 @@ class ExecutionTest(fixtures.TestBase):
 
 class RowProxyTest(fixtures.TestBase):
     __requires__ = 'cpython',
+    __backend__ = True
 
     def _rowproxy_fixture(self, keys, processors, row):
         class MockMeta(object):
index c2dbb4a3b2a58f49b23b65710d6b3458a779cf91..aad43c1df12a48e03f2f93e14fd73083d2ecb364 100644 (file)
@@ -24,6 +24,8 @@ from contextlib import contextmanager
 
 users, metadata, users_autoinc = None, None, None
 class ExecuteTest(fixtures.TestBase):
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         global users, users_autoinc, metadata
@@ -462,6 +464,8 @@ class ExecuteTest(fixtures.TestBase):
             eng.dispose()
 
 class ConvenienceExecuteTest(fixtures.TablesTest):
+    __backend__ = True
+
     @classmethod
     def define_tables(cls, metadata):
         cls.table = Table('exec_test', metadata,
@@ -617,6 +621,8 @@ class ConvenienceExecuteTest(fixtures.TablesTest):
         self._assert_no_data()
 
 class CompiledCacheTest(fixtures.TestBase):
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         global users, metadata
@@ -648,240 +654,6 @@ class CompiledCacheTest(fixtures.TestBase):
         assert len(cache) == 1
         eq_(conn.execute("select count(*) from users").scalar(), 3)
 
-class LogParamsTest(fixtures.TestBase):
-    __only_on__ = 'sqlite'
-    __requires__ = 'ad_hoc_engines',
-
-    def setup(self):
-        self.eng = engines.testing_engine(options={'echo':True})
-        self.eng.execute("create table foo (data string)")
-        self.buf = logging.handlers.BufferingHandler(100)
-        for log in [
-            logging.getLogger('sqlalchemy.engine'),
-            logging.getLogger('sqlalchemy.pool')
-        ]:
-            log.addHandler(self.buf)
-
-    def teardown(self):
-        self.eng.execute("drop table foo")
-        for log in [
-            logging.getLogger('sqlalchemy.engine'),
-            logging.getLogger('sqlalchemy.pool')
-        ]:
-            log.removeHandler(self.buf)
-
-    def test_log_large_dict(self):
-        self.eng.execute(
-            "INSERT INTO foo (data) values (:data)",
-            [{"data":str(i)} for i in range(100)]
-        )
-        eq_(
-            self.buf.buffer[1].message,
-            "[{'data': '0'}, {'data': '1'}, {'data': '2'}, {'data': '3'}, "
-            "{'data': '4'}, {'data': '5'}, {'data': '6'}, {'data': '7'}"
-            "  ... displaying 10 of 100 total bound "
-            "parameter sets ...  {'data': '98'}, {'data': '99'}]"
-        )
-
-    def test_log_large_list(self):
-        self.eng.execute(
-            "INSERT INTO foo (data) values (?)",
-            [(str(i), ) for i in range(100)]
-        )
-        eq_(
-            self.buf.buffer[1].message,
-            "[('0',), ('1',), ('2',), ('3',), ('4',), ('5',), "
-            "('6',), ('7',)  ... displaying 10 of 100 total "
-            "bound parameter sets ...  ('98',), ('99',)]"
-        )
-
-    def test_error_large_dict(self):
-        assert_raises_message(
-            tsa.exc.DBAPIError,
-            r".*'INSERT INTO nonexistent \(data\) values \(:data\)' "
-            "\[{'data': '0'}, {'data': '1'}, {'data': '2'}, "
-            "{'data': '3'}, {'data': '4'}, {'data': '5'}, "
-            "{'data': '6'}, {'data': '7'}  ... displaying 10 of "
-            "100 total bound parameter sets ...  {'data': '98'}, {'data': '99'}\]",
-            lambda: self.eng.execute(
-                "INSERT INTO nonexistent (data) values (:data)",
-                [{"data":str(i)} for i in range(100)]
-            )
-        )
-
-    def test_error_large_list(self):
-        assert_raises_message(
-            tsa.exc.DBAPIError,
-            r".*INSERT INTO nonexistent \(data\) values "
-            "\(\?\)' \[\('0',\), \('1',\), \('2',\), \('3',\), "
-            "\('4',\), \('5',\), \('6',\), \('7',\)  ... displaying "
-            "10 of 100 total bound parameter sets ...  "
-            "\('98',\), \('99',\)\]",
-            lambda: self.eng.execute(
-                "INSERT INTO nonexistent (data) values (?)",
-                [(str(i), ) for i in range(100)]
-            )
-        )
-
-class LoggingNameTest(fixtures.TestBase):
-    __requires__ = 'ad_hoc_engines',
-
-    def _assert_names_in_execute(self, eng, eng_name, pool_name):
-        eng.execute(select([1]))
-        assert self.buf.buffer
-        for name in [b.name for b in self.buf.buffer]:
-            assert name in (
-                'sqlalchemy.engine.base.Engine.%s' % eng_name,
-                'sqlalchemy.pool.%s.%s' %
-                    (eng.pool.__class__.__name__, pool_name)
-            )
-
-    def _assert_no_name_in_execute(self, eng):
-        eng.execute(select([1]))
-        assert self.buf.buffer
-        for name in [b.name for b in self.buf.buffer]:
-            assert name in (
-                'sqlalchemy.engine.base.Engine',
-                'sqlalchemy.pool.%s' % eng.pool.__class__.__name__
-            )
-
-    def _named_engine(self, **kw):
-        options = {
-            'logging_name':'myenginename',
-            'pool_logging_name':'mypoolname',
-            'echo':True
-        }
-        options.update(kw)
-        return engines.testing_engine(options=options)
-
-    def _unnamed_engine(self, **kw):
-        kw.update({'echo':True})
-        return engines.testing_engine(options=kw)
-
-    def setup(self):
-        self.buf = logging.handlers.BufferingHandler(100)
-        for log in [
-            logging.getLogger('sqlalchemy.engine'),
-            logging.getLogger('sqlalchemy.pool')
-        ]:
-            log.addHandler(self.buf)
-
-    def teardown(self):
-        for log in [
-            logging.getLogger('sqlalchemy.engine'),
-            logging.getLogger('sqlalchemy.pool')
-        ]:
-            log.removeHandler(self.buf)
-
-    def test_named_logger_names(self):
-        eng = self._named_engine()
-        eq_(eng.logging_name, "myenginename")
-        eq_(eng.pool.logging_name, "mypoolname")
-
-    def test_named_logger_names_after_dispose(self):
-        eng = self._named_engine()
-        eng.execute(select([1]))
-        eng.dispose()
-        eq_(eng.logging_name, "myenginename")
-        eq_(eng.pool.logging_name, "mypoolname")
-
-    def test_unnamed_logger_names(self):
-        eng = self._unnamed_engine()
-        eq_(eng.logging_name, None)
-        eq_(eng.pool.logging_name, None)
-
-    def test_named_logger_execute(self):
-        eng = self._named_engine()
-        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
-
-    def test_named_logger_echoflags_execute(self):
-        eng = self._named_engine(echo='debug', echo_pool='debug')
-        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
-
-    def test_named_logger_execute_after_dispose(self):
-        eng = self._named_engine()
-        eng.execute(select([1]))
-        eng.dispose()
-        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
-
-    def test_unnamed_logger_execute(self):
-        eng = self._unnamed_engine()
-        self._assert_no_name_in_execute(eng)
-
-    def test_unnamed_logger_echoflags_execute(self):
-        eng = self._unnamed_engine(echo='debug', echo_pool='debug')
-        self._assert_no_name_in_execute(eng)
-
-class EchoTest(fixtures.TestBase):
-    __requires__ = 'ad_hoc_engines',
-
-    def setup(self):
-        self.level = logging.getLogger('sqlalchemy.engine').level
-        logging.getLogger('sqlalchemy.engine').setLevel(logging.WARN)
-        self.buf = logging.handlers.BufferingHandler(100)
-        logging.getLogger('sqlalchemy.engine').addHandler(self.buf)
-
-    def teardown(self):
-        logging.getLogger('sqlalchemy.engine').removeHandler(self.buf)
-        logging.getLogger('sqlalchemy.engine').setLevel(self.level)
-
-    def testing_engine(self):
-        e = engines.testing_engine()
-
-        # do an initial execute to clear out 'first connect'
-        # messages
-        e.execute(select([10])).close()
-        self.buf.flush()
-
-        return e
-
-    def test_levels(self):
-        e1 = engines.testing_engine()
-
-        eq_(e1._should_log_info(), False)
-        eq_(e1._should_log_debug(), False)
-        eq_(e1.logger.isEnabledFor(logging.INFO), False)
-        eq_(e1.logger.getEffectiveLevel(), logging.WARN)
-
-        e1.echo = True
-        eq_(e1._should_log_info(), True)
-        eq_(e1._should_log_debug(), False)
-        eq_(e1.logger.isEnabledFor(logging.INFO), True)
-        eq_(e1.logger.getEffectiveLevel(), logging.INFO)
-
-        e1.echo = 'debug'
-        eq_(e1._should_log_info(), True)
-        eq_(e1._should_log_debug(), True)
-        eq_(e1.logger.isEnabledFor(logging.DEBUG), True)
-        eq_(e1.logger.getEffectiveLevel(), logging.DEBUG)
-
-        e1.echo = False
-        eq_(e1._should_log_info(), False)
-        eq_(e1._should_log_debug(), False)
-        eq_(e1.logger.isEnabledFor(logging.INFO), False)
-        eq_(e1.logger.getEffectiveLevel(), logging.WARN)
-
-    def test_echo_flag_independence(self):
-        """test the echo flag's independence to a specific engine."""
-
-        e1 = self.testing_engine()
-        e2 = self.testing_engine()
-
-        e1.echo = True
-        e1.execute(select([1])).close()
-        e2.execute(select([2])).close()
-
-        e1.echo = False
-        e1.execute(select([3])).close()
-        e2.execute(select([4])).close()
-
-        e2.echo = True
-        e1.execute(select([5])).close()
-        e2.execute(select([6])).close()
-
-        assert self.buf.buffer[0].getMessage().startswith("SELECT 1")
-        assert self.buf.buffer[2].getMessage().startswith("SELECT 6")
-        assert len(self.buf.buffer) == 4
 
 class MockStrategyTest(fixtures.TestBase):
     def _engine_fixture(self):
@@ -912,6 +684,7 @@ class MockStrategyTest(fixtures.TestBase):
         )
 
 class ResultProxyTest(fixtures.TestBase):
+    __backend__ = True
 
     def test_nontuple_row(self):
         """ensure the C version of BaseRowProxy handles
@@ -1171,6 +944,7 @@ class AlternateResultProxyTest(fixtures.TestBase):
 
 class EngineEventsTest(fixtures.TestBase):
     __requires__ = 'ad_hoc_engines',
+    __backend__ = True
 
     def tearDown(self):
         Engine.dispatch._clear()
diff --git a/test/engine/test_logging.py b/test/engine/test_logging.py
new file mode 100644 (file)
index 0000000..94ea228
--- /dev/null
@@ -0,0 +1,255 @@
+from sqlalchemy.testing import eq_, assert_raises, assert_raises_message, \
+    config, is_
+import re
+from sqlalchemy.testing.util import picklers
+from sqlalchemy.interfaces import ConnectionProxy
+from sqlalchemy import MetaData, Integer, String, INT, VARCHAR, func, \
+    bindparam, select, event, TypeDecorator, create_engine, Sequence
+from sqlalchemy.sql import column, literal
+from sqlalchemy.testing.schema import Table, Column
+import sqlalchemy as tsa
+from sqlalchemy import testing
+from sqlalchemy.testing import engines
+from sqlalchemy import util
+from sqlalchemy.testing.engines import testing_engine
+import logging.handlers
+from sqlalchemy.dialects.oracle.zxjdbc import ReturningParam
+from sqlalchemy.engine import result as _result, default
+from sqlalchemy.engine.base import Engine
+from sqlalchemy.testing import fixtures
+from sqlalchemy.testing.mock import Mock, call, patch
+
+class LogParamsTest(fixtures.TestBase):
+    __only_on__ = 'sqlite'
+    __requires__ = 'ad_hoc_engines',
+
+    def setup(self):
+        self.eng = engines.testing_engine(options={'echo':True})
+        self.eng.execute("create table foo (data string)")
+        self.buf = logging.handlers.BufferingHandler(100)
+        for log in [
+            logging.getLogger('sqlalchemy.engine'),
+            logging.getLogger('sqlalchemy.pool')
+        ]:
+            log.addHandler(self.buf)
+
+    def teardown(self):
+        self.eng.execute("drop table foo")
+        for log in [
+            logging.getLogger('sqlalchemy.engine'),
+            logging.getLogger('sqlalchemy.pool')
+        ]:
+            log.removeHandler(self.buf)
+
+    def test_log_large_dict(self):
+        self.eng.execute(
+            "INSERT INTO foo (data) values (:data)",
+            [{"data":str(i)} for i in range(100)]
+        )
+        eq_(
+            self.buf.buffer[1].message,
+            "[{'data': '0'}, {'data': '1'}, {'data': '2'}, {'data': '3'}, "
+            "{'data': '4'}, {'data': '5'}, {'data': '6'}, {'data': '7'}"
+            "  ... displaying 10 of 100 total bound "
+            "parameter sets ...  {'data': '98'}, {'data': '99'}]"
+        )
+
+    def test_log_large_list(self):
+        self.eng.execute(
+            "INSERT INTO foo (data) values (?)",
+            [(str(i), ) for i in range(100)]
+        )
+        eq_(
+            self.buf.buffer[1].message,
+            "[('0',), ('1',), ('2',), ('3',), ('4',), ('5',), "
+            "('6',), ('7',)  ... displaying 10 of 100 total "
+            "bound parameter sets ...  ('98',), ('99',)]"
+        )
+
+    def test_error_large_dict(self):
+        assert_raises_message(
+            tsa.exc.DBAPIError,
+            r".*'INSERT INTO nonexistent \(data\) values \(:data\)' "
+            "\[{'data': '0'}, {'data': '1'}, {'data': '2'}, "
+            "{'data': '3'}, {'data': '4'}, {'data': '5'}, "
+            "{'data': '6'}, {'data': '7'}  ... displaying 10 of "
+            "100 total bound parameter sets ...  {'data': '98'}, {'data': '99'}\]",
+            lambda: self.eng.execute(
+                "INSERT INTO nonexistent (data) values (:data)",
+                [{"data":str(i)} for i in range(100)]
+            )
+        )
+
+    def test_error_large_list(self):
+        assert_raises_message(
+            tsa.exc.DBAPIError,
+            r".*INSERT INTO nonexistent \(data\) values "
+            "\(\?\)' \[\('0',\), \('1',\), \('2',\), \('3',\), "
+            "\('4',\), \('5',\), \('6',\), \('7',\)  ... displaying "
+            "10 of 100 total bound parameter sets ...  "
+            "\('98',\), \('99',\)\]",
+            lambda: self.eng.execute(
+                "INSERT INTO nonexistent (data) values (?)",
+                [(str(i), ) for i in range(100)]
+            )
+        )
+
+class LoggingNameTest(fixtures.TestBase):
+    __requires__ = 'ad_hoc_engines',
+
+    def _assert_names_in_execute(self, eng, eng_name, pool_name):
+        eng.execute(select([1]))
+        assert self.buf.buffer
+        for name in [b.name for b in self.buf.buffer]:
+            assert name in (
+                'sqlalchemy.engine.base.Engine.%s' % eng_name,
+                'sqlalchemy.pool.%s.%s' %
+                    (eng.pool.__class__.__name__, pool_name)
+            )
+
+    def _assert_no_name_in_execute(self, eng):
+        eng.execute(select([1]))
+        assert self.buf.buffer
+        for name in [b.name for b in self.buf.buffer]:
+            assert name in (
+                'sqlalchemy.engine.base.Engine',
+                'sqlalchemy.pool.%s' % eng.pool.__class__.__name__
+            )
+
+    def _named_engine(self, **kw):
+        options = {
+            'logging_name':'myenginename',
+            'pool_logging_name':'mypoolname',
+            'echo':True
+        }
+        options.update(kw)
+        return engines.testing_engine(options=options)
+
+    def _unnamed_engine(self, **kw):
+        kw.update({'echo':True})
+        return engines.testing_engine(options=kw)
+
+    def setup(self):
+        self.buf = logging.handlers.BufferingHandler(100)
+        for log in [
+            logging.getLogger('sqlalchemy.engine'),
+            logging.getLogger('sqlalchemy.pool')
+        ]:
+            log.addHandler(self.buf)
+
+    def teardown(self):
+        for log in [
+            logging.getLogger('sqlalchemy.engine'),
+            logging.getLogger('sqlalchemy.pool')
+        ]:
+            log.removeHandler(self.buf)
+
+    def test_named_logger_names(self):
+        eng = self._named_engine()
+        eq_(eng.logging_name, "myenginename")
+        eq_(eng.pool.logging_name, "mypoolname")
+
+    def test_named_logger_names_after_dispose(self):
+        eng = self._named_engine()
+        eng.execute(select([1]))
+        eng.dispose()
+        eq_(eng.logging_name, "myenginename")
+        eq_(eng.pool.logging_name, "mypoolname")
+
+    def test_unnamed_logger_names(self):
+        eng = self._unnamed_engine()
+        eq_(eng.logging_name, None)
+        eq_(eng.pool.logging_name, None)
+
+    def test_named_logger_execute(self):
+        eng = self._named_engine()
+        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
+
+    def test_named_logger_echoflags_execute(self):
+        eng = self._named_engine(echo='debug', echo_pool='debug')
+        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
+
+    def test_named_logger_execute_after_dispose(self):
+        eng = self._named_engine()
+        eng.execute(select([1]))
+        eng.dispose()
+        self._assert_names_in_execute(eng, "myenginename", "mypoolname")
+
+    def test_unnamed_logger_execute(self):
+        eng = self._unnamed_engine()
+        self._assert_no_name_in_execute(eng)
+
+    def test_unnamed_logger_echoflags_execute(self):
+        eng = self._unnamed_engine(echo='debug', echo_pool='debug')
+        self._assert_no_name_in_execute(eng)
+
+class EchoTest(fixtures.TestBase):
+    __requires__ = 'ad_hoc_engines',
+
+    def setup(self):
+        self.level = logging.getLogger('sqlalchemy.engine').level
+        logging.getLogger('sqlalchemy.engine').setLevel(logging.WARN)
+        self.buf = logging.handlers.BufferingHandler(100)
+        logging.getLogger('sqlalchemy.engine').addHandler(self.buf)
+
+    def teardown(self):
+        logging.getLogger('sqlalchemy.engine').removeHandler(self.buf)
+        logging.getLogger('sqlalchemy.engine').setLevel(self.level)
+
+    def testing_engine(self):
+        e = engines.testing_engine()
+
+        # do an initial execute to clear out 'first connect'
+        # messages
+        e.execute(select([10])).close()
+        self.buf.flush()
+
+        return e
+
+    def test_levels(self):
+        e1 = engines.testing_engine()
+
+        eq_(e1._should_log_info(), False)
+        eq_(e1._should_log_debug(), False)
+        eq_(e1.logger.isEnabledFor(logging.INFO), False)
+        eq_(e1.logger.getEffectiveLevel(), logging.WARN)
+
+        e1.echo = True
+        eq_(e1._should_log_info(), True)
+        eq_(e1._should_log_debug(), False)
+        eq_(e1.logger.isEnabledFor(logging.INFO), True)
+        eq_(e1.logger.getEffectiveLevel(), logging.INFO)
+
+        e1.echo = 'debug'
+        eq_(e1._should_log_info(), True)
+        eq_(e1._should_log_debug(), True)
+        eq_(e1.logger.isEnabledFor(logging.DEBUG), True)
+        eq_(e1.logger.getEffectiveLevel(), logging.DEBUG)
+
+        e1.echo = False
+        eq_(e1._should_log_info(), False)
+        eq_(e1._should_log_debug(), False)
+        eq_(e1.logger.isEnabledFor(logging.INFO), False)
+        eq_(e1.logger.getEffectiveLevel(), logging.WARN)
+
+    def test_echo_flag_independence(self):
+        """test the echo flag's independence to a specific engine."""
+
+        e1 = self.testing_engine()
+        e2 = self.testing_engine()
+
+        e1.echo = True
+        e1.execute(select([1])).close()
+        e2.execute(select([2])).close()
+
+        e1.echo = False
+        e1.execute(select([3])).close()
+        e2.execute(select([4])).close()
+
+        e2.echo = True
+        e1.execute(select([5])).close()
+        e2.execute(select([6])).close()
+
+        assert self.buf.buffer[0].getMessage().startswith("SELECT 1")
+        assert self.buf.buffer[2].getMessage().startswith("SELECT 6")
+        assert len(self.buf.buffer) == 4
index a53893549d22b2f74a53e4589b81ca770b11f991..1db37851d40614c8a66257276f430a515b09822a 100644 (file)
@@ -15,6 +15,7 @@ from sqlalchemy.util import ue
 metadata, users = None, None
 
 class ReflectionTest(fixtures.TestBase, ComparesTables):
+    __backend__ = True
 
     @testing.exclude('mssql', '<', (10, 0, 0),
                      'Date is only supported on MSSQL 2008+')
@@ -1016,6 +1017,7 @@ class ReflectionTest(fixtures.TestBase, ComparesTables):
             _drop_views(metadata.bind)
 
 class CreateDropTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1103,6 +1105,8 @@ class CreateDropTest(fixtures.TestBase):
         metadata.drop_all(bind=testing.db)
 
 class SchemaManipulationTest(fixtures.TestBase):
+    __backend__ = True
+
     def test_append_constraint_unique(self):
         meta = MetaData()
 
@@ -1119,6 +1123,8 @@ class SchemaManipulationTest(fixtures.TestBase):
         assert addresses.constraints == set([addresses.primary_key, fk])
 
 class UnicodeReflectionTest(fixtures.TestBase):
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         cls.metadata = metadata = MetaData()
@@ -1226,6 +1232,7 @@ class UnicodeReflectionTest(fixtures.TestBase):
             )
 
 class SchemaTest(fixtures.TestBase):
+    __backend__ = True
 
     @testing.requires.schemas
     @testing.requires.cross_schema_fk_reflection
@@ -1430,6 +1437,7 @@ def _drop_views(con, schema=None):
 
 class ReverseCasingReflectTest(fixtures.TestBase, AssertsCompiledSQL):
     __dialect__ = 'default'
+    __backend__ = True
 
     @testing.requires.denormalized_names
     def setup(self):
@@ -1456,6 +1464,7 @@ class ReverseCasingReflectTest(fixtures.TestBase, AssertsCompiledSQL):
 
 class CaseSensitiveTest(fixtures.TablesTest):
     """Nail down case sensitive behaviors, mostly on MySQL."""
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -1502,6 +1511,7 @@ class CaseSensitiveTest(fixtures.TablesTest):
 
 
 class ColumnEventsTest(fixtures.RemovesEvents, fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
index c373133d1fec423533e1bfd649df737500393b49..ee626a50e3ac20e28f8771dc36127c5ecfce8c5d 100644 (file)
@@ -15,6 +15,8 @@ from sqlalchemy.testing import fixtures
 
 users, metadata = None, None
 class TransactionTest(fixtures.TestBase):
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         global users, metadata
@@ -412,6 +414,8 @@ class TransactionTest(fixtures.TestBase):
             eq_(result.fetchall(), [])
 
 class ResetAgentTest(fixtures.TestBase):
+    __backend__ = True
+
     def test_begin_close(self):
         with testing.db.connect() as connection:
             trans = connection.begin()
@@ -513,6 +517,7 @@ class ResetAgentTest(fixtures.TestBase):
             assert connection.connection._reset_agent is None
 
 class AutoRollbackTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -678,6 +683,7 @@ tlengine = None
 
 class TLTransactionTest(fixtures.TestBase):
     __requires__ = ('ad_hoc_engines', )
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1124,6 +1130,7 @@ counters = None
 
 class ForUpdateTest(fixtures.TestBase):
     __requires__ = 'ad_hoc_engines',
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1254,6 +1261,7 @@ class ForUpdateTest(fixtures.TestBase):
 
 class IsolationLevelTest(fixtures.TestBase):
     __requires__ = ('isolation_level', 'ad_hoc_engines')
+    __backend__ = True
 
     def _default_isolation_level(self):
         if testing.against('sqlite'):
index be3731fad788fcf85ad67dadc6c646aec453181e..29fbcff853a3418f51a4abf6cdb67a23ff3456af 100644 (file)
@@ -13,6 +13,7 @@ from ._poly_fixtures import Company, Person, Engineer, Manager, Boss, \
     _PolymorphicAliasedJoins
 
 class _PolymorphicTestBase(object):
+    __backend__ = True
 
     @classmethod
     def setup_mappers(cls):
index a4663217fe48cf6cb041447a805a5caa78336b29..1bb536d7087a78304346c73bd7d467515d80ae90 100644 (file)
@@ -28,6 +28,7 @@ class NaturalPKTest(fixtures.MappedTest):
     # MySQL 5.5 on Windows crashes (the entire server, not the client)
     # if you screw around with ON UPDATE CASCADE type of stuff.
     __requires__ = 'skip_mysql_on_windows', 'on_update_or_deferrable_fks'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -453,6 +454,7 @@ class NaturalPKTest(fixtures.MappedTest):
 
 class TransientExceptionTesst(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def test_transient_exception(self):
         """An object that goes from a pk value to transient/pending
@@ -492,6 +494,7 @@ class ReversePKsTest(fixtures.MappedTest):
     """reverse the primary keys of two entities and ensure bookkeeping
     succeeds."""
 
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -553,6 +556,7 @@ class SelfReferentialTest(fixtures.MappedTest):
     __unsupported_on__ = ('mssql', 'mysql')
 
     __requires__ = 'on_update_or_deferrable_fks',
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -657,6 +661,7 @@ class SelfReferentialTest(fixtures.MappedTest):
 
 class NonPKCascadeTest(fixtures.MappedTest):
     __requires__ = 'skip_mysql_on_windows', 'on_update_or_deferrable_fks'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -762,6 +767,7 @@ class NonPKCascadeTest(fixtures.MappedTest):
 class CascadeToFKPKTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
     """A primary key mutation cascades onto a foreign key that is itself a
     primary key."""
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -1016,6 +1022,7 @@ class JoinedInheritanceTest(fixtures.MappedTest):
     __unsupported_on__ = ('mssql',)
 
     __requires__ = 'skip_mysql_on_windows',
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 4eb498ee901cab18b35f2145d0a5db2de11f850a..de5473470461149a73f1ba832a64ebcd9f302fc7 100644 (file)
@@ -20,6 +20,7 @@ from sqlalchemy import event, ForeignKey
 
 class BindTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def test_mapped_binds(self):
         Address, addresses, users, User = (self.classes.Address,
@@ -209,6 +210,7 @@ class BindTest(_fixtures.FixtureTest):
 
 class ExecutionTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     @testing.requires.sequences
     def test_sequence_execute(self):
@@ -258,6 +260,7 @@ class ExecutionTest(_fixtures.FixtureTest):
 
 class TransScopingTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def test_no_close_on_flush(self):
         """Flush() doesn't close a connection the session didn't open"""
@@ -313,6 +316,7 @@ class TransScopingTest(_fixtures.FixtureTest):
 
 class SessionUtilTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def test_object_session_raises(self):
         User = self.classes.User
@@ -393,6 +397,7 @@ class SessionUtilTest(_fixtures.FixtureTest):
 
 class SessionStateTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
 
     def test_info(self):
@@ -822,6 +827,7 @@ class SessionStateTest(_fixtures.FixtureTest):
         assert object_session(u1) is None
 
 class SessionStateWFixtureTest(_fixtures.FixtureTest):
+    __backend__ = True
 
     def test_autoflush_rollback(self):
         Address, addresses, users, User = (self.classes.Address,
@@ -884,6 +890,7 @@ class NoCyclesOnTransientDetachedTest(_fixtures.FixtureTest):
 
     """
     run_inserts = None
+    __backend__ = True
 
     def setup(self):
         mapper(self.classes.User, self.tables.users)
@@ -1024,6 +1031,7 @@ class NoCyclesOnTransientDetachedTest(_fixtures.FixtureTest):
 
 class WeakIdentityMapTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     @testing.requires.predictable_gc
     def test_weakref(self):
@@ -1194,6 +1202,7 @@ class WeakIdentityMapTest(_fixtures.FixtureTest):
 
 class StrongIdentityMapTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     @testing.uses_deprecated()
     def test_strong_ref(self):
@@ -1274,6 +1283,7 @@ class StrongIdentityMapTest(_fixtures.FixtureTest):
 
 class IsModifiedTest(_fixtures.FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def _default_mapping_fixture(self):
         User, Address = self.classes.User, self.classes.Address
@@ -1387,6 +1397,7 @@ class DisposedStates(fixtures.MappedTest):
     run_setup_mappers = 'once'
     run_inserts = 'once'
     run_deletes = None
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -1600,6 +1611,7 @@ class SessionInterface(fixtures.TestBase):
 
 class TLTransactionTest(fixtures.MappedTest):
     run_dispose_bind = 'once'
+    __backend__ = True
 
     @classmethod
     def setup_bind(cls):
@@ -1637,6 +1649,7 @@ class TLTransactionTest(fixtures.MappedTest):
 
 class FlushWarningsTest(fixtures.MappedTest):
     run_setup_mappers = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index 2866ab4ab66e2c21942b4a737e126cfe532b5a24..22d759bb8eafd728a4f291d39c78a54dafda848c 100644 (file)
@@ -15,6 +15,7 @@ from test.orm._fixtures import FixtureTest
 
 class SessionTransactionTest(FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     def test_no_close_transaction_on_flush(self):
         User, users = self.classes.User, self.tables.users
@@ -539,6 +540,7 @@ class _LocalFixture(FixtureTest):
 
 class FixtureDataTest(_LocalFixture):
     run_inserts = 'each'
+    __backend__ = True
 
     def test_attrs_on_rollback(self):
         User = self.classes.User
@@ -578,6 +580,7 @@ class CleanSavepointTest(FixtureTest):
 
     """
     run_inserts = None
+    __backend__ = True
 
     def _run_test(self, update_fn):
         User, users = self.classes.User, self.tables.users
@@ -624,6 +627,7 @@ class CleanSavepointTest(FixtureTest):
 
 class ContextManagerTest(FixtureTest):
     run_inserts = None
+    __backend__ = True
 
     @testing.requires.savepoints
     @engines.close_open_connections
@@ -683,6 +687,7 @@ class ContextManagerTest(FixtureTest):
 
 
 class AutoExpireTest(_LocalFixture):
+    __backend__ = True
 
     def test_expunge_pending_on_rollback(self):
         User = self.classes.User
@@ -825,6 +830,7 @@ class AutoExpireTest(_LocalFixture):
         assert u1.name == 'will'
 
 class TwoPhaseTest(_LocalFixture):
+    __backend__ = True
 
     @testing.requires.two_phase_transactions
     def test_rollback_on_prepare(self):
@@ -839,6 +845,7 @@ class TwoPhaseTest(_LocalFixture):
         assert u not in s
 
 class RollbackRecoverTest(_LocalFixture):
+    __backend__ = True
 
     def test_pk_violation(self):
         User, Address = self.classes.User, self.classes.Address
@@ -905,6 +912,7 @@ class RollbackRecoverTest(_LocalFixture):
 
 
 class SavepointTest(_LocalFixture):
+    __backend__ = True
 
     @testing.requires.savepoints
     def test_savepoint_rollback(self):
@@ -1073,6 +1081,8 @@ class SavepointTest(_LocalFixture):
 
 
 class AccountingFlagsTest(_LocalFixture):
+    __backend__ = True
+
     def test_no_expire_on_commit(self):
         User, users = self.classes.User, self.tables.users
 
@@ -1147,6 +1157,8 @@ class AccountingFlagsTest(_LocalFixture):
 
 
 class AutoCommitTest(_LocalFixture):
+    __backend__ = True
+
     def test_begin_nested_requires_trans(self):
         sess = create_session(autocommit=True)
         assert_raises(sa_exc.InvalidRequestError, sess.begin_nested)
@@ -1248,6 +1260,8 @@ class AutoCommitTest(_LocalFixture):
         eq_(u1.id, 3)
 
 class NaturalPKRollbackTest(fixtures.MappedTest):
+    __backend__ = True
+
     @classmethod
     def define_tables(cls, metadata):
         Table('users', metadata,
index 9379543ed8640b4cefe9590e1420a6d231c7232c..3519d2c423b252d1a11a2f04203f09ca152a315b 100644 (file)
@@ -36,6 +36,7 @@ def make_uuid():
     return _uuids.pop(0)
 
 class VersioningTest(fixtures.MappedTest):
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -326,6 +327,7 @@ class VersioningTest(fixtures.MappedTest):
         )
 
 class ColumnTypeTest(fixtures.MappedTest):
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -366,6 +368,7 @@ class ColumnTypeTest(fixtures.MappedTest):
         s1.commit()
 
 class RowSwitchTest(fixtures.MappedTest):
+    __backend__ = True
     @classmethod
     def define_tables(cls, metadata):
         Table('p', metadata,
@@ -433,6 +436,7 @@ class RowSwitchTest(fixtures.MappedTest):
         session.commit()
 
 class AlternateGeneratorTest(fixtures.MappedTest):
+    __backend__ = True
     @classmethod
     def define_tables(cls, metadata):
         Table('p', metadata,
@@ -544,6 +548,7 @@ class InheritanceTwoVersionIdsTest(fixtures.MappedTest):
     versioning column.
 
     """
+    __backend__ = True
     @classmethod
     def define_tables(cls, metadata):
         Table('base', metadata,
@@ -647,6 +652,7 @@ class InheritanceTwoVersionIdsTest(fixtures.MappedTest):
 
 class ServerVersioningTest(fixtures.MappedTest):
     run_define_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -831,6 +837,7 @@ class ServerVersioningTest(fixtures.MappedTest):
 
 class ManualVersionTest(fixtures.MappedTest):
     run_define_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
index cb4b73ec8b9804846ace3b7a117166e9c3becb3a..b174ef3c12f27f00428c5b7ce40620b53b01a63d 100644 (file)
@@ -14,6 +14,8 @@ from sqlalchemy.sql import table, column
 
 class ConstraintGenTest(fixtures.TestBase, AssertsExecutionResults):
     __dialect__ = 'default'
+    __backend__ = True
+
 
     @testing.provide_metadata
     def test_pk_fk_constraint_create(self):
index 1622c4ed83db591767ebbdc38a20217ffc628c6d..ba6166ea6a75dedf8868b3206f4191771b8533f2 100644 (file)
@@ -19,6 +19,7 @@ t = f = f2 = ts = currenttime = metadata = default_generator = None
 t = f = f2 = ts = currenttime = metadata = default_generator = None
 
 class DefaultTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -418,6 +419,7 @@ class DefaultTest(fixtures.TestBase):
 
 class PKDefaultTest(fixtures.TablesTest):
     __requires__ = ('subqueries',)
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -454,6 +456,7 @@ class PKDefaultTest(fixtures.TablesTest):
 
 class PKIncrementTest(fixtures.TablesTest):
     run_define_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -520,6 +523,8 @@ class PKIncrementTest(fixtures.TablesTest):
 
 
 class EmptyInsertTest(fixtures.TestBase):
+    __backend__ = True
+
     @testing.exclude('sqlite', '<', (3, 3, 8), 'no empty insert support')
     @testing.fails_on('oracle', 'FIXME: unknown')
     @testing.provide_metadata
@@ -534,6 +539,7 @@ class EmptyInsertTest(fixtures.TestBase):
 class AutoIncrementTest(fixtures.TablesTest):
     __requires__ = ('identity',)
     run_define_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -644,6 +650,7 @@ class AutoIncrementTest(fixtures.TablesTest):
 
 class SequenceDDLTest(fixtures.TestBase, testing.AssertsCompiledSQL):
     __dialect__ = 'default'
+    __backend__ = True
 
     def test_create_drop_ddl(self):
         self.assert_compile(
@@ -673,6 +680,7 @@ class SequenceDDLTest(fixtures.TestBase, testing.AssertsCompiledSQL):
 
 class SequenceExecTest(fixtures.TestBase):
     __requires__ = ('sequences',)
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -804,6 +812,7 @@ class SequenceExecTest(fixtures.TestBase):
 
 class SequenceTest(fixtures.TestBase, testing.AssertsCompiledSQL):
     __requires__ = ('sequences',)
+    __backend__ = True
 
     @testing.fails_on('firebird', 'no FB support for start/increment')
     def test_start_increment(self):
@@ -918,6 +927,7 @@ class SequenceTest(fixtures.TestBase, testing.AssertsCompiledSQL):
 cartitems = sometable = metadata = None
 class TableBoundSequenceTest(fixtures.TestBase):
     __requires__ = ('sequences',)
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -985,6 +995,7 @@ class SpecialTypePKTest(fixtures.TestBase):
     rather than the class of "type" itself.
 
     """
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1065,6 +1076,8 @@ class SpecialTypePKTest(fixtures.TestBase):
         self._run_test(server_default='1', autoincrement=False)
 
 class ServerDefaultsOnPKTest(fixtures.TestBase):
+    __backend__ = True
+
     @testing.provide_metadata
     def test_string_default_none_on_insert(self):
         """Test that without implicit returning, we return None for
@@ -1193,6 +1206,8 @@ class ServerDefaultsOnPKTest(fixtures.TestBase):
         )
 
 class UnicodeDefaultsTest(fixtures.TestBase):
+    __backend__ = True
+
     def test_no_default(self):
         Column(Unicode(32))
 
index 6fb108a27a13abb88c7ba70b2e5b95e636a523f0..35797871a1d8348811913f04a3da52d100ae34ea 100644 (file)
@@ -509,6 +509,8 @@ class JoinNoUseLabelsTest(_JoinRewriteTestBase, fixtures.TestBase):
 class JoinExecTest(_JoinRewriteTestBase, fixtures.TestBase):
     """invoke the SQL on the current backend to ensure compatibility"""
 
+    __backend__ = True
+
     _a_bc = _a_bc_comma_a1_selbc = _a__b_dc = _a_bkeyassoc = \
         _a_bkeyassoc_aliased = _a_atobalias_balias_c_w_exists = \
         _a_atobalias_balias = _b_ab1_union_c_ab2 = None
index 11bd62f6465c8d8c154e41a6f28f9eafa682ea9a..6258e451651c200cd1e31a71426b92b0df1b1ec3 100644 (file)
@@ -13,6 +13,7 @@ from sqlalchemy.testing.schema import Table, Column
 # sqlalhcemy.testing.suite
 
 class QueryTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1328,6 +1329,7 @@ class TableInsertTest(fixtures.TablesTest):
 
     """
     run_create_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -1499,6 +1501,7 @@ class TableInsertTest(fixtures.TablesTest):
 class KeyTargetingTest(fixtures.TablesTest):
     run_inserts = 'once'
     run_deletes = None
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -1727,6 +1730,7 @@ class KeyTargetingTest(fixtures.TablesTest):
 
 
 class LimitTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -1804,6 +1808,9 @@ class LimitTest(fixtures.TestBase):
 class CompoundTest(fixtures.TestBase):
     """test compound statements like UNION, INTERSECT, particularly their ability to nest on
     different databases."""
+
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         global metadata, t1, t2, t3
@@ -2101,6 +2108,7 @@ class JoinTest(fixtures.TestBase):
     `JOIN rhs ON lhs.col=rhs.col` vs `rhs.col=lhs.col`.  At least one
     database seems to be sensitive to this.
     """
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -2365,6 +2373,8 @@ class JoinTest(fixtures.TestBase):
 
 
 class OperatorTest(fixtures.TestBase):
+    __backend__ = True
+
     @classmethod
     def setup_class(cls):
         global metadata, flds
index 3cab3dc79d5bbaaad3fa4301c4c2464eeb9b5d79..76a789242d0da251fc688b6efa3d6a6ac9bd17a5 100644 (file)
@@ -6,8 +6,8 @@ from sqlalchemy import testing
 from sqlalchemy.sql.elements import quoted_name, _truncated_label, _anonymous_label
 from sqlalchemy.testing.util import picklers
 
-class QuoteTest(fixtures.TestBase, AssertsCompiledSQL):
-    __dialect__ = 'default'
+class QuoteExecTest(fixtures.TestBase):
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
@@ -159,6 +159,28 @@ class QuoteTest(fixtures.TestBase, AssertsCompiledSQL):
         result = select(columns, use_labels=True).execute().fetchall()
         assert(result == [(1, 2, 3), (2, 2, 3), (4, 3, 2)])
 
+class QuoteTest(fixtures.TestBase, AssertsCompiledSQL):
+    __dialect__ = 'default'
+
+    @classmethod
+    def setup_class(cls):
+        # TODO: figure out which databases/which identifiers allow special
+        # characters to be used, such as: spaces, quote characters,
+        # punctuation characters, set up tests for those as well.
+
+        global table1, table2
+        metadata = MetaData(testing.db)
+
+        table1 = Table('WorstCase1', metadata,
+            Column('lowercase', Integer, primary_key=True),
+            Column('UPPERCASE', Integer),
+            Column('MixedCase', Integer),
+            Column('ASC', Integer, key='a123'))
+        table2 = Table('WorstCase2', metadata,
+            Column('desc', Integer, primary_key=True, key='d123'),
+            Column('Union', Integer, key='u123'),
+            Column('MixedCase', Integer))
+
     @testing.crashes('oracle', 'FIXME: unknown, verify not fails_on')
     @testing.requires.subqueries
     def test_labels(self):
@@ -181,7 +203,6 @@ class QuoteTest(fixtures.TestBase, AssertsCompiledSQL):
         where the "UPPERCASE" column of "LaLa" doesn't exist.
         """
 
-        x = table1.select(distinct=True).alias('LaLa').select().scalar()
         self.assert_compile(
             table1.select(distinct=True).alias('LaLa').select(),
             'SELECT '
index e7245aa3c61e0be856f6ce8a31ea9a7135156f1c..394fe1002e0f747fc96c162ff53fe59af8056707 100644 (file)
@@ -10,6 +10,7 @@ import itertools
 
 class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
     __requires__ = 'returning',
+    __backend__ = True
 
     def setup(self):
         meta = MetaData(testing.db)
@@ -137,6 +138,7 @@ class ReturningTest(fixtures.TestBase, AssertsExecutionResults):
 
 class SequenceReturningTest(fixtures.TestBase):
     __requires__ = 'returning', 'sequences'
+    __backend__ = True
 
     def setup(self):
         meta = MetaData(testing.db)
@@ -160,6 +162,7 @@ class KeyReturningTest(fixtures.TestBase, AssertsExecutionResults):
     """test returning() works with columns that define 'key'."""
 
     __requires__ = 'returning',
+    __backend__ = True
 
     def setup(self):
         meta = MetaData(testing.db)
@@ -188,6 +191,7 @@ class KeyReturningTest(fixtures.TestBase, AssertsExecutionResults):
 class ReturnDefaultsTest(fixtures.TablesTest):
     __requires__ = ('returning', )
     run_define_tables = 'each'
+    __backend__ = True
 
     @classmethod
     def define_tables(cls, metadata):
@@ -309,6 +313,8 @@ class ReturnDefaultsTest(fixtures.TablesTest):
         )
 
 class ImplicitReturningFlag(fixtures.TestBase):
+    __backend__ = True
+
     def test_flag_turned_off(self):
         e = engines.testing_engine(options={'implicit_returning':False})
         assert e.dialect.implicit_returning is False
index 2dbf4f3ea37e70313b92038e1fadce746d613532..2d3c51fa2bf41852ddbaf2f6349b71b438970589 100644 (file)
@@ -7,6 +7,7 @@ class FoundRowsTest(fixtures.TestBase, AssertsExecutionResults):
     """tests rowcount functionality"""
 
     __requires__ = ('sane_rowcount', )
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
index c7e6298378cb1bd3b7ccd7ffd077d011e1915380..91e467aed0e34969e06c9fd18eaf08bd7c9fa0c3 100644 (file)
@@ -846,6 +846,7 @@ class UnicodeTest(fixtures.TestBase):
     sqlalchemy/testing/suite/test_types.py.
 
     """
+    __backend__ = True
 
     def test_native_unicode(self):
         """assert expected values for 'native unicode' mode"""
index 0118b6a2bbb973de025b2d86cdf41d259e96075f..99de16f7fa1eb48118eae37a38714508afbcb117 100644 (file)
@@ -9,6 +9,7 @@ from sqlalchemy.util import u, ue
 
 class UnicodeSchemaTest(fixtures.TestBase):
     __requires__ = ('unicode_ddl',)
+    __backend__ = True
 
     @classmethod
     def setup_class(cls):
index 272b5fcaee16f75b5d52d004fd17a878e44c4565..829739bcc62d6baa6cce1d7cea4afd8f56287d0b 100644 (file)
@@ -405,6 +405,7 @@ class UpdateFromCompileTest(_UpdateFromTestBase, fixtures.TablesTest,
 
 
 class UpdateFromRoundTripTest(_UpdateFromTestBase, fixtures.TablesTest):
+    __backend__ = True
 
     @testing.requires.update_from
     def test_exec_two_table(self):
@@ -538,6 +539,8 @@ class UpdateFromRoundTripTest(_UpdateFromTestBase, fixtures.TablesTest):
 
 class UpdateFromMultiTableUpdateDefaultsTest(_UpdateFromTestBase,
                                              fixtures.TablesTest):
+    __backend__ = True
+
     @classmethod
     def define_tables(cls, metadata):
         Table('users', metadata,