exchange-data-manager/tests/test_rest_candles.py

91 lines
2.7 KiB
Python

"""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()