119 lines
4.0 KiB
Python
119 lines
4.0 KiB
Python
|
|
"""Tests for Redis cache."""
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
from unittest.mock import Mock, patch, AsyncMock
|
||
|
|
|
||
|
|
|
||
|
|
class TestRedisCache:
|
||
|
|
"""Tests for RedisCache class."""
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_get_ticker_cache_hit(self, mock_get_client):
|
||
|
|
"""Test getting cached ticker data."""
|
||
|
|
mock_redis = Mock()
|
||
|
|
mock_client = AsyncMock()
|
||
|
|
mock_client.get.return_value = '{"price": 45000.0, "symbol": "BTC/USD"}'
|
||
|
|
mock_redis.get_client.return_value = mock_client
|
||
|
|
mock_get_client.return_value = mock_redis
|
||
|
|
|
||
|
|
from src.data.redis_cache import RedisCache
|
||
|
|
cache = RedisCache()
|
||
|
|
|
||
|
|
result = await cache.get_ticker("BTC/USD")
|
||
|
|
|
||
|
|
assert result is not None
|
||
|
|
assert result["price"] == 45000.0
|
||
|
|
mock_client.get.assert_called_once()
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_get_ticker_cache_miss(self, mock_get_client):
|
||
|
|
"""Test ticker cache miss."""
|
||
|
|
mock_redis = Mock()
|
||
|
|
mock_client = AsyncMock()
|
||
|
|
mock_client.get.return_value = None
|
||
|
|
mock_redis.get_client.return_value = mock_client
|
||
|
|
mock_get_client.return_value = mock_redis
|
||
|
|
|
||
|
|
from src.data.redis_cache import RedisCache
|
||
|
|
cache = RedisCache()
|
||
|
|
|
||
|
|
result = await cache.get_ticker("BTC/USD")
|
||
|
|
|
||
|
|
assert result is None
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_set_ticker(self, mock_get_client):
|
||
|
|
"""Test setting ticker cache."""
|
||
|
|
mock_redis = Mock()
|
||
|
|
mock_client = AsyncMock()
|
||
|
|
mock_redis.get_client.return_value = mock_client
|
||
|
|
mock_get_client.return_value = mock_redis
|
||
|
|
|
||
|
|
from src.data.redis_cache import RedisCache
|
||
|
|
cache = RedisCache()
|
||
|
|
|
||
|
|
result = await cache.set_ticker("BTC/USD", {"price": 45000.0})
|
||
|
|
|
||
|
|
assert result is True
|
||
|
|
mock_client.setex.assert_called_once()
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_get_ohlcv(self, mock_get_client):
|
||
|
|
"""Test getting cached OHLCV data."""
|
||
|
|
mock_redis = Mock()
|
||
|
|
mock_client = AsyncMock()
|
||
|
|
mock_client.get.return_value = '[[1700000000, 45000, 45500, 44500, 45200, 1000]]'
|
||
|
|
mock_redis.get_client.return_value = mock_client
|
||
|
|
mock_get_client.return_value = mock_redis
|
||
|
|
|
||
|
|
from src.data.redis_cache import RedisCache
|
||
|
|
cache = RedisCache()
|
||
|
|
|
||
|
|
result = await cache.get_ohlcv("BTC/USD", "1h", 100)
|
||
|
|
|
||
|
|
assert result is not None
|
||
|
|
assert len(result) == 1
|
||
|
|
assert result[0][0] == 1700000000
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_set_ohlcv(self, mock_get_client):
|
||
|
|
"""Test setting OHLCV cache."""
|
||
|
|
mock_redis = Mock()
|
||
|
|
mock_client = AsyncMock()
|
||
|
|
mock_redis.get_client.return_value = mock_client
|
||
|
|
mock_get_client.return_value = mock_redis
|
||
|
|
|
||
|
|
from src.data.redis_cache import RedisCache
|
||
|
|
cache = RedisCache()
|
||
|
|
|
||
|
|
ohlcv_data = [[1700000000, 45000, 45500, 44500, 45200, 1000]]
|
||
|
|
result = await cache.set_ohlcv("BTC/USD", "1h", ohlcv_data)
|
||
|
|
|
||
|
|
assert result is True
|
||
|
|
mock_client.setex.assert_called_once()
|
||
|
|
|
||
|
|
|
||
|
|
class TestGetRedisCache:
|
||
|
|
"""Tests for get_redis_cache singleton."""
|
||
|
|
|
||
|
|
@patch('src.data.redis_cache.get_redis_client')
|
||
|
|
def test_returns_singleton(self, mock_get_client):
|
||
|
|
"""Test that get_redis_cache returns same instance."""
|
||
|
|
mock_get_client.return_value = Mock()
|
||
|
|
|
||
|
|
# Reset the global
|
||
|
|
import src.data.redis_cache as cache_module
|
||
|
|
cache_module._redis_cache = None
|
||
|
|
|
||
|
|
from src.data.redis_cache import get_redis_cache
|
||
|
|
|
||
|
|
cache1 = get_redis_cache()
|
||
|
|
cache2 = get_redis_cache()
|
||
|
|
|
||
|
|
assert cache1 is cache2
|