summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-08-29 13:37:02 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-08-29 13:37:02 -0400
commitec4f567f31856a92bd91144112cd29df356a8ca8 (patch)
treed582c8b48aa7214f98f649dcfbd02e5a9234441f
parent4f342344927f78b429ed7ab4073dd7de956d6d22 (diff)
downloadsqlalchemy-ec4f567f31856a92bd91144112cd29df356a8ca8.tar.gz
Generalize autocommit testing
To support adding AUTOCOMMIT to more dialects, add a suite test Change-Id: I585dcce19fcdce70e8cf21aea4edaa97d7bf2bb9
-rw-r--r--lib/sqlalchemy/testing/requirements.py5
-rw-r--r--lib/sqlalchemy/testing/suite/test_dialect.py43
-rw-r--r--test/requirements.py7
3 files changed, 55 insertions, 0 deletions
diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py
index 95aef0e17..08a7b1ced 100644
--- a/lib/sqlalchemy/testing/requirements.py
+++ b/lib/sqlalchemy/testing/requirements.py
@@ -513,6 +513,11 @@ class SuiteRequirements(Requirements):
return exclusions.open()
@property
+ def autocommit(self):
+ """target dialect supports 'AUTOCOMMIT' as an isolation_level"""
+ return exclusions.closed()
+
+ @property
def json_type(self):
"""target platform implements a native JSON type."""
diff --git a/lib/sqlalchemy/testing/suite/test_dialect.py b/lib/sqlalchemy/testing/suite/test_dialect.py
index 0e62c347f..5dd1f0501 100644
--- a/lib/sqlalchemy/testing/suite/test_dialect.py
+++ b/lib/sqlalchemy/testing/suite/test_dialect.py
@@ -43,6 +43,49 @@ class ExceptionTest(fixtures.TablesTest):
)
+class AutocommitTest(fixtures.TablesTest):
+
+ run_deletes = 'each'
+
+ __requires__ = 'autocommit',
+
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table('some_table', metadata,
+ Column('id', Integer, primary_key=True, autoincrement=False),
+ Column('data', String(50)),
+ test_needs_acid=True
+ )
+
+ def _test_conn_autocommits(self, conn, autocommit):
+ trans = conn.begin()
+ conn.execute(
+ self.tables.some_table.insert(),
+ {"id": 1, "data": "some data"}
+ )
+ trans.rollback()
+
+ eq_(
+ conn.scalar(select([self.tables.some_table.c.id])),
+ 1 if autocommit else None
+ )
+
+ conn.execute(self.tables.some_table.delete())
+
+ def test_autocommit_on(self):
+ conn = config.db.connect()
+ c2 = conn.execution_options(isolation_level='AUTOCOMMIT')
+ self._test_conn_autocommits(c2, True)
+ conn.invalidate()
+ self._test_conn_autocommits(conn, False)
+
+ def test_autocommit_off(self):
+ conn = config.db.connect()
+ self._test_conn_autocommits(conn, False)
+
+
class EscapingTest(fixtures.TestBase):
@provide_metadata
def test_percent_sign_round_trip(self):
diff --git a/test/requirements.py b/test/requirements.py
index ee3bb2db5..4fcf541e3 100644
--- a/test/requirements.py
+++ b/test/requirements.py
@@ -265,6 +265,13 @@ class DefaultRequirements(SuiteRequirements):
'pypostgresql bombs on multiple isolation level calls')
@property
+ def autocommit(self):
+ """target dialect supports 'AUTOCOMMIT' as an isolation_level"""
+ return only_on(
+ ('postgresql', 'mysql'),
+ "dialect does not support AUTOCOMMIT isolation mode")
+
+ @property
def row_triggers(self):
"""Target must support standard statement-running EACH ROW triggers."""