import unittest
from .testutils import ConnectingTestCase
import psycopg2
from psycopg2 import errors
from psycopg2._psycopg import sqlstate_errors
from psycopg2.errors import UndefinedTable
class ErrorsTests(ConnectingTestCase):
def test_exception_class(self):
cur = self.conn.cursor()
try:
cur.execute("select * from nonexist")
except psycopg2.Error as exc:
e = exc
self.assert_(isinstance(e, UndefinedTable), type(e))
self.assert_(isinstance(e, self.conn.ProgrammingError))
def test_exception_class_fallback(self):
cur = self.conn.cursor()
x = sqlstate_errors.pop('42P01')
try:
cur.execute("select * from nonexist")
except psycopg2.Error as exc:
e = exc
finally:
sqlstate_errors['42P01'] = x
self.assertEqual(type(e), self.conn.ProgrammingError)
def test_lookup(self):
self.assertIs(errors.lookup('42P01'), errors.UndefinedTable)
with self.assertRaises(KeyError):
errors.lookup('XXXXX')
def test_connection_exceptions_backwards_compatibility(self):
err = errors.lookup('08000')
self.assert_(issubclass(err, errors.OperationalError))
self.assert_(issubclass(err, errors.DatabaseError))
def test_has_base_exceptions(self):
excs = []
for n in dir(psycopg2):
obj = getattr(psycopg2, n)
if isinstance(obj, type) and issubclass(obj, Exception):
excs.append(obj)
self.assert_(len(excs) > 8, str(excs))
excs.append(psycopg2.extensions.QueryCanceledError)
excs.append(psycopg2.extensions.TransactionRollbackError)
for exc in excs:
self.assert_(hasattr(errors, exc.__name__))
self.assert_(getattr(errors, exc.__name__) is exc)
def test_suite():
return unittest.TestLoader().loadTestsFromName(__name__)
if __name__ == "__main__":
unittest.main()