summaryrefslogtreecommitdiff
path: root/test/base/test_except.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-05-15 12:35:21 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-05-15 12:38:28 -0400
commitd178707ecaeb547470e2b7b37b9a939abc69cbd0 (patch)
treedc4b674748cf673a123b90797c3525c3a13ef657 /test/base/test_except.py
parent64c1f2e5688879e1cc087f4e4a893d32267fd1fb (diff)
downloadsqlalchemy-d178707ecaeb547470e2b7b37b9a939abc69cbd0.tar.gz
- Added support for the case of the misbehaving DBAPI that has
pep-249 exception names linked to exception classes of an entirely different name, preventing SQLAlchemy's own exception wrapping from wrapping the error appropriately. The SQLAlchemy dialect in use needs to implement a new accessor :attr:`.DefaultDialect.dbapi_exception_translation_map` to support this feature; this is implemented now for the py-postgresql dialect. fixes #3421
Diffstat (limited to 'test/base/test_except.py')
-rw-r--r--test/base/test_except.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/base/test_except.py b/test/base/test_except.py
index 918e7a042..9e8dd4760 100644
--- a/test/base/test_except.py
+++ b/test/base/test_except.py
@@ -4,6 +4,7 @@
from sqlalchemy import exc as sa_exceptions
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import eq_
+from sqlalchemy.engine import default
class Error(Exception):
@@ -28,8 +29,28 @@ class OutOfSpec(DatabaseError):
pass
+# exception with a totally different name...
+class WrongNameError(DatabaseError):
+ pass
+
+# but they're going to call it their "IntegrityError"
+IntegrityError = WrongNameError
+
+
+# and they're going to subclass it!
+class SpecificIntegrityError(WrongNameError):
+ pass
+
+
class WrapTest(fixtures.TestBase):
+ def _translating_dialect_fixture(self):
+ d = default.DefaultDialect()
+ d.dbapi_exception_translation_map = {
+ "WrongNameError": "IntegrityError"
+ }
+ return d
+
def test_db_error_normal(self):
try:
raise sa_exceptions.DBAPIError.instance(
@@ -160,6 +181,42 @@ class WrapTest(fixtures.TestBase):
except sa_exceptions.ArgumentError:
self.assert_(False)
+ dialect = self._translating_dialect_fixture()
+ try:
+ raise sa_exceptions.DBAPIError.instance(
+ '', [],
+ sa_exceptions.ArgumentError(), DatabaseError,
+ dialect=dialect)
+ except sa_exceptions.DBAPIError as e:
+ self.assert_(e.__class__ is sa_exceptions.DBAPIError)
+ except sa_exceptions.ArgumentError:
+ self.assert_(False)
+
+ def test_db_error_dbapi_uses_wrong_names(self):
+ dialect = self._translating_dialect_fixture()
+
+ try:
+ raise sa_exceptions.DBAPIError.instance(
+ '', [], IntegrityError(),
+ DatabaseError, dialect=dialect)
+ except sa_exceptions.DBAPIError as e:
+ self.assert_(e.__class__ is sa_exceptions.IntegrityError)
+
+ try:
+ raise sa_exceptions.DBAPIError.instance(
+ '', [], SpecificIntegrityError(),
+ DatabaseError, dialect=dialect)
+ except sa_exceptions.DBAPIError as e:
+ self.assert_(e.__class__ is sa_exceptions.IntegrityError)
+
+ try:
+ raise sa_exceptions.DBAPIError.instance(
+ '', [], SpecificIntegrityError(),
+ DatabaseError)
+ except sa_exceptions.DBAPIError as e:
+ # doesn't work without a dialect
+ self.assert_(e.__class__ is not sa_exceptions.IntegrityError)
+
def test_db_error_keyboard_interrupt(self):
try:
raise sa_exceptions.DBAPIError.instance(