91 lines
2.7 KiB
Python
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()
|