|
11 | 11 | import zope.sqlalchemy |
12 | 12 |
|
13 | 13 | from sqlalchemy import event |
14 | | -from sqlalchemy.exc import OperationalError |
| 14 | +from sqlalchemy.exc import DBAPIError, OperationalError |
15 | 15 |
|
16 | 16 | from warehouse import db |
17 | 17 | from warehouse.admin.flags import AdminFlag, AdminFlagValue |
|
22 | 22 | _configure_alembic, |
23 | 23 | _create_session, |
24 | 24 | includeme, |
| 25 | + unwrap_dbapi_exceptions, |
25 | 26 | ) |
26 | 27 |
|
27 | 28 |
|
@@ -241,3 +242,33 @@ class FakeRegistry(dict): |
241 | 242 | ) |
242 | 243 | ] |
243 | 244 | assert config.registry["sqlalchemy.engine"] is engine |
| 245 | + |
| 246 | + |
| 247 | +def test_unwrap_dbapi_exceptions(): |
| 248 | + original_exception = psycopg.OperationalError() |
| 249 | + sqlalchemy_exception = DBAPIError("foo", {}, original_exception) |
| 250 | + context = pretend.stub( |
| 251 | + sqlalchemy_exception=sqlalchemy_exception, |
| 252 | + original_exception=original_exception, |
| 253 | + ) |
| 254 | + |
| 255 | + with pytest.raises(psycopg.OperationalError) as e: |
| 256 | + unwrap_dbapi_exceptions(context) |
| 257 | + |
| 258 | + assert e.value is original_exception |
| 259 | + |
| 260 | + |
| 261 | +def test_unwrap_dbapi_exceptions_no_op(): |
| 262 | + # Not a DBAPIError |
| 263 | + context = pretend.stub( |
| 264 | + sqlalchemy_exception=OperationalError("foo", {}, None), |
| 265 | + original_exception=None, |
| 266 | + ) |
| 267 | + unwrap_dbapi_exceptions(context) |
| 268 | + |
| 269 | + # No original exception |
| 270 | + context = pretend.stub( |
| 271 | + sqlalchemy_exception=DBAPIError("foo", {}, None), |
| 272 | + original_exception=None, |
| 273 | + ) |
| 274 | + unwrap_dbapi_exceptions(context) |
0 commit comments