"""Tests for binance_rest module.""" import pytest from decimal import Decimal from unittest.mock import AsyncMock, MagicMock from datetime import datetime, timezone from data_collector.binance_rest import fetch_historical_candles @pytest.mark.asyncio async def test_fetch_historical_candles_parses_response(): """Verify that OHLCV rows are correctly parsed into Candle models.""" ts = 1700000000000 # milliseconds mock_exchange = MagicMock() mock_exchange.fetch_ohlcv = AsyncMock( return_value=[ [ts, 30000.0, 30100.0, 29900.0, 30050.0, 1.5], [ts + 60000, 30050.0, 30200.0, 30000.0, 30150.0, 2.0], ] ) candles = await fetch_historical_candles(mock_exchange, "BTC/USDT", "1m", since=ts, limit=500) assert len(candles) == 2 c = candles[0] assert c.symbol == "BTCUSDT" assert c.timeframe == "1m" assert c.open_time == datetime.fromtimestamp(ts / 1000, tz=timezone.utc) assert c.open == Decimal("30000.0") assert c.high == Decimal("30100.0") assert c.low == Decimal("29900.0") assert c.close == Decimal("30050.0") assert c.volume == Decimal("1.5") mock_exchange.fetch_ohlcv.assert_called_once_with("BTC/USDT", "1m", since=ts, limit=500) @pytest.mark.asyncio async def test_fetch_historical_candles_empty_response(): """Verify that an empty exchange response returns an empty list.""" mock_exchange = MagicMock() mock_exchange.fetch_ohlcv = AsyncMock(return_value=[]) candles = await fetch_historical_candles(mock_exchange, "BTC/USDT", "1m", since=1700000000000) assert candles == []