diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-05-15 12:35:21 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-05-15 12:38:28 -0400 |
commit | d178707ecaeb547470e2b7b37b9a939abc69cbd0 (patch) | |
tree | dc4b674748cf673a123b90797c3525c3a13ef657 /test/base/test_except.py | |
parent | 64c1f2e5688879e1cc087f4e4a893d32267fd1fb (diff) | |
download | sqlalchemy-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.py | 57 |
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( |