from __future__ import annotations import pytest @pytest.mark.asyncio async def test_build_client_deribit_returns_correct_url(monkeypatch): from tests.unit.test_settings import _minimal_env for k, v in _minimal_env().items(): monkeypatch.setenv(k, v) from cerbero_mcp.settings import Settings from cerbero_mcp.exchanges import build_client s = Settings() c_test = await build_client(s, "deribit", "testnet") c_live = await build_client(s, "deribit", "mainnet") # DeribitClient espone base_url come property derivata da self.testnet assert "test" in c_test.base_url.lower() assert "test" not in c_live.base_url.lower() @pytest.mark.asyncio async def test_build_client_bybit_returns_correct_env(monkeypatch): from tests.unit.test_settings import _minimal_env for k, v in _minimal_env().items(): monkeypatch.setenv(k, v) # Stub pybit HTTP per evitare connessione reale durante __init__ from cerbero_mcp.exchanges.bybit import client as bybit_client class _FakeHTTP: def __init__(self, **kwargs): self.kwargs = kwargs monkeypatch.setattr(bybit_client, "HTTP", _FakeHTTP) from cerbero_mcp.settings import Settings from cerbero_mcp.exchanges import build_client s = Settings() c_test = await build_client(s, "bybit", "testnet") c_live = await build_client(s, "bybit", "mainnet") assert c_test is not c_live assert c_test.testnet is True assert c_live.testnet is False @pytest.mark.asyncio async def test_build_client_hyperliquid_returns_correct_env(monkeypatch): from tests.unit.test_settings import _minimal_env for k, v in _minimal_env().items(): monkeypatch.setenv(k, v) from cerbero_mcp.settings import Settings from cerbero_mcp.exchanges import build_client s = Settings() c_test = await build_client(s, "hyperliquid", "testnet") c_live = await build_client(s, "hyperliquid", "mainnet") assert c_test is not c_live assert c_test.testnet is True assert c_live.testnet is False assert "test" in c_test.base_url.lower() assert "test" not in c_live.base_url.lower() @pytest.mark.asyncio async def test_build_client_alpaca_returns_correct_env(monkeypatch): from tests.unit.test_settings import _minimal_env for k, v in _minimal_env().items(): monkeypatch.setenv(k, v) # Stub alpaca SDK clients per evitare connessioni reali in __init__ from cerbero_mcp.exchanges.alpaca import client as alpaca_client class _FakeSdk: def __init__(self, **kwargs): self.kwargs = kwargs monkeypatch.setattr(alpaca_client, "TradingClient", _FakeSdk) monkeypatch.setattr(alpaca_client, "StockHistoricalDataClient", _FakeSdk) monkeypatch.setattr(alpaca_client, "CryptoHistoricalDataClient", _FakeSdk) monkeypatch.setattr(alpaca_client, "OptionHistoricalDataClient", _FakeSdk) from cerbero_mcp.settings import Settings from cerbero_mcp.exchanges import build_client s = Settings() c_test = await build_client(s, "alpaca", "testnet") c_live = await build_client(s, "alpaca", "mainnet") assert c_test is not c_live assert c_test.paper is True assert c_live.paper is False @pytest.mark.asyncio async def test_build_client_unknown_exchange_raises(monkeypatch): from tests.unit.test_settings import _minimal_env for k, v in _minimal_env().items(): monkeypatch.setenv(k, v) from cerbero_mcp.settings import Settings from cerbero_mcp.exchanges import build_client s = Settings() with pytest.raises(ValueError): await build_client(s, "ftx", "testnet")