"""Unit tests for REST /candles handler wiring.""" import pytest from unittest.mock import AsyncMock, MagicMock from fastapi import HTTPException from exchange_data_manager.api import rest from exchange_data_manager.candles.models import Candle from exchange_data_manager.monitoring import CacheSource def _sample_candles(): return [ Candle( time=1709337600, open=50000.0, high=50100.0, low=49900.0, close=50050.0, volume=10.0, ) ] @pytest.mark.asyncio async def test_candles_uses_session_connector_and_records_metrics(monkeypatch): """Session ID requests should use session connector and record metrics.""" connector = MagicMock() mock_cache_manager = MagicMock() mock_cache_manager.get_candles_with_source = AsyncMock( return_value=(_sample_candles(), "exchange") ) mock_session_manager = MagicMock() mock_session_manager.get_session_connector.return_value = connector mock_metrics = MagicMock() monkeypatch.setattr(rest, "cache_manager", mock_cache_manager) monkeypatch.setattr(rest, "session_manager", mock_session_manager) monkeypatch.setattr(rest, "metrics_collector", mock_metrics) response = await rest.get_candles( exchange="binance", symbol="BTC/USDT", timeframe="1m", start=None, end=None, limit=1, session_id="session-123", ) assert response.count == 1 mock_session_manager.get_session_connector.assert_called_once_with( session_id="session-123", exchange="binance", ) mock_cache_manager.get_candles_with_source.assert_awaited_once() kwargs = mock_metrics.record_candle_request.call_args.kwargs assert kwargs["cache_source"] == CacheSource.EXCHANGE assert kwargs["status_code"] == 200 @pytest.mark.asyncio async def test_candles_invalid_session_records_http_error_metric(monkeypatch): """Invalid session connector should return 404 and record error metrics.""" mock_cache_manager = MagicMock() mock_session_manager = MagicMock() mock_session_manager.get_session_connector.return_value = None mock_metrics = MagicMock() monkeypatch.setattr(rest, "cache_manager", mock_cache_manager) monkeypatch.setattr(rest, "session_manager", mock_session_manager) monkeypatch.setattr(rest, "metrics_collector", mock_metrics) with pytest.raises(HTTPException) as exc: await rest.get_candles( exchange="binance", symbol="BTC/USDT", timeframe="1m", start=None, end=None, limit=1, session_id="missing-session", ) assert exc.value.status_code == 404 mock_metrics.record.assert_called_once()