Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions tests/multisafepay/unit/client/test_unit_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from multisafepay.client.credential_resolver import (
ScopedCredentialResolver,
)
from multisafepay.exception.api import ApiException
from multisafepay.transport import RequestsTransport

requests = pytest.importorskip("requests")
Expand Down Expand Up @@ -54,6 +55,32 @@ def request(self: "_CaptureTransport", **kwargs: dict) -> _FakeResponse:
return _FakeResponse()


class _FailingTransport:
"""Transport stub that fails before returning a response."""

@staticmethod
def request(**kwargs: dict) -> _FakeResponse:
raise RuntimeError("network unavailable")


class _ServerErrorResponse(_FakeResponse):
"""Response stub that raises for a server error."""

status_code = 500

@staticmethod
def raise_for_status() -> None:
raise RuntimeError("server error")


class _ServerErrorTransport:
"""Transport stub that returns a server error response."""

@staticmethod
def request(**kwargs: dict) -> _ServerErrorResponse:
return _ServerErrorResponse()


def _build_resolver_client(
resolver: ScopedCredentialResolver,
transport: _CaptureTransport,
Expand Down Expand Up @@ -328,6 +355,30 @@ def test_create_delete_request_sends_authorization_header() -> None:
assert transport.headers["Authorization"] == "Bearer test_key"


def test_request_exception_without_response_is_reraised() -> None:
"""Reraise transport exceptions when no response exists."""
client = Client(
api_key="test_key",
is_production=False,
transport=_FailingTransport(),
)

with pytest.raises(RuntimeError, match="network unavailable"):
client.create_get_request("json/orders")


def test_server_error_response_raises_api_exception() -> None:
"""Wrap server error responses in ApiException."""
client = Client(
api_key="test_key",
is_production=False,
transport=_ServerErrorTransport(),
)

with pytest.raises(ApiException, match="Request failed: server error"):
client.create_get_request("json/orders")
Comment on lines +378 to +379


def test_resolve_api_key_uses_credential_resolver() -> None:
"""Prefer credential resolver when both api_key and resolver exist."""
transport = _CaptureTransport()
Expand Down
Loading