import asyncio import unittest from unittest.mock import patch, AsyncMock from data.live_data import LiveDataManager import ccxt.async_support as ccxt class TestLiveData(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self): self.symbol = 'BTC/USDT' self.data_manager = LiveDataManager(self.symbol) self.exchange = self.data_manager.exchange async def asyncTearDown(self): await self.data_manager.close() @patch('data.live_data.ccxt.mexc.fetch_trades', new_callable=AsyncMock) async def test_fetch_and_process_ticks(self, mock_fetch_trades): # Mock the exchange response mock_fetch_trades.return_value = [ {'timestamp': 1678886400000, 'symbol': 'BTC/USDT', 'price': 25000.0, 'quantity': 1.0}, {'timestamp': 1678886460000, 'symbol': 'BTC/USDT', 'price': 25050.0, 'quantity': 0.5} ] # Call the method await self.data_manager.fetch_and_process_ticks() # Assert that the ticks are processed candles, ticks = await self.data_manager.get_data() self.assertEqual(len(ticks), 2) self.assertEqual(len(candles), 1) @patch('data.live_data.ccxt.mexc.fetch_ohlcv', new_callable=AsyncMock) async def test_fetch_initial_candles(self, mock_fetch_ohlcv): # Mock the exchange response mock_fetch_ohlcv.return_value = [ [1678886400000, 25000.0, 25050.0, 24950.0, 25025.0, 100.0], [1678886460000, 25025.0, 25100.0, 25000.0, 25075.0, 120.0] ] # Call the method await self.data_manager._fetch_initial_candles() # Assert that the candles are fetched and formatted candles, _ = await self.data_manager.get_data() self.assertEqual(len(candles), 2) self.assertEqual(candles[0]['open'], 25000.0) self.assertEqual(candles[0]['close'], 25025.0) if __name__ == '__main__': unittest.main()