Files
crypto_trader/tests/unit/data/test_redis_cache.py

119 lines
4.0 KiB
Python
Raw Normal View History

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