|
14 | 14 | from multisafepay.client.credential_resolver import ( |
15 | 15 | ScopedCredentialResolver, |
16 | 16 | ) |
| 17 | +from multisafepay.exception.api import ApiException |
17 | 18 | from multisafepay.transport import RequestsTransport |
18 | 19 |
|
19 | 20 | requests = pytest.importorskip("requests") |
@@ -54,6 +55,32 @@ def request(self: "_CaptureTransport", **kwargs: dict) -> _FakeResponse: |
54 | 55 | return _FakeResponse() |
55 | 56 |
|
56 | 57 |
|
| 58 | +class _FailingTransport: |
| 59 | + """Transport stub that fails before returning a response.""" |
| 60 | + |
| 61 | + @staticmethod |
| 62 | + def request(**kwargs: dict) -> _FakeResponse: |
| 63 | + raise RuntimeError("network unavailable") |
| 64 | + |
| 65 | + |
| 66 | +class _ServerErrorResponse(_FakeResponse): |
| 67 | + """Response stub that raises for a server error.""" |
| 68 | + |
| 69 | + status_code = 500 |
| 70 | + |
| 71 | + @staticmethod |
| 72 | + def raise_for_status() -> None: |
| 73 | + raise RuntimeError("server error") |
| 74 | + |
| 75 | + |
| 76 | +class _ServerErrorTransport: |
| 77 | + """Transport stub that returns a server error response.""" |
| 78 | + |
| 79 | + @staticmethod |
| 80 | + def request(**kwargs: dict) -> _ServerErrorResponse: |
| 81 | + return _ServerErrorResponse() |
| 82 | + |
| 83 | + |
57 | 84 | def _build_resolver_client( |
58 | 85 | resolver: ScopedCredentialResolver, |
59 | 86 | transport: _CaptureTransport, |
@@ -328,6 +355,30 @@ def test_create_delete_request_sends_authorization_header() -> None: |
328 | 355 | assert transport.headers["Authorization"] == "Bearer test_key" |
329 | 356 |
|
330 | 357 |
|
| 358 | +def test_request_exception_without_response_is_reraised() -> None: |
| 359 | + """Reraise transport exceptions when no response exists.""" |
| 360 | + client = Client( |
| 361 | + api_key="test_key", |
| 362 | + is_production=False, |
| 363 | + transport=_FailingTransport(), |
| 364 | + ) |
| 365 | + |
| 366 | + with pytest.raises(RuntimeError, match="network unavailable"): |
| 367 | + client.create_get_request("json/orders") |
| 368 | + |
| 369 | + |
| 370 | +def test_server_error_response_raises_api_exception() -> None: |
| 371 | + """Wrap server error responses in ApiException.""" |
| 372 | + client = Client( |
| 373 | + api_key="test_key", |
| 374 | + is_production=False, |
| 375 | + transport=_ServerErrorTransport(), |
| 376 | + ) |
| 377 | + |
| 378 | + with pytest.raises(ApiException, match="Request failed: server error"): |
| 379 | + client.create_get_request("json/orders") |
| 380 | + |
| 381 | + |
331 | 382 | def test_resolve_api_key_uses_credential_resolver() -> None: |
332 | 383 | """Prefer credential resolver when both api_key and resolver exist.""" |
333 | 384 | transport = _CaptureTransport() |
|
0 commit comments