14b1b84a47
Client minimale verso Cerbero MCP unified server con header Authorization Bearer e X-Bot-Tag su ogni richiesta. Retry esponenziale solo su ConnectionError (non su 4xx). 4xx/5xx -> RuntimeError. Switch da httpx a requests per allineamento con libreria mock `responses` (httpx richiederebbe respx). httpx resta in deps per usi futuri. Aggiunto types-requests ai dev deps per mypy strict. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
import pytest
|
|
import responses
|
|
|
|
from multi_swarm.cerbero.client import CerberoClient
|
|
|
|
|
|
@responses.activate
|
|
def test_call_tool_passes_bearer_and_bot_tag() -> None:
|
|
responses.add(
|
|
responses.POST,
|
|
"http://test:9000/mcp-deribit/tools/get_iv_rank",
|
|
json={"iv_rank": 0.42},
|
|
status=200,
|
|
)
|
|
client = CerberoClient(
|
|
base_url="http://test:9000", token="tok-xyz", bot_tag="swarm-poc-phase1"
|
|
)
|
|
result = client.call_tool("deribit", "get_iv_rank", {"symbol": "BTC-PERPETUAL"})
|
|
assert result == {"iv_rank": 0.42}
|
|
req = responses.calls[0].request
|
|
assert req.headers["Authorization"] == "Bearer tok-xyz"
|
|
assert req.headers["X-Bot-Tag"] == "swarm-poc-phase1"
|
|
|
|
|
|
@responses.activate
|
|
def test_call_tool_raises_on_error() -> None:
|
|
responses.add(
|
|
responses.POST,
|
|
"http://test:9000/mcp-deribit/tools/get_iv_rank",
|
|
json={"error": "bad"},
|
|
status=400,
|
|
)
|
|
client = CerberoClient(
|
|
base_url="http://test:9000", token="tok-xyz", bot_tag="swarm-poc-phase1"
|
|
)
|
|
with pytest.raises(RuntimeError):
|
|
client.call_tool("deribit", "get_iv_rank", {})
|