from __future__ import annotations from unittest.mock import AsyncMock import pytest from yuxi.channel.infrastructure.cache.redis_cache import RedisCache class TestRedisCache: @pytest.fixture def mock_redis(self): return AsyncMock() @pytest.fixture def cache(self, mock_redis): return RedisCache(redis=mock_redis) @pytest.mark.asyncio async def test_get(self, cache, mock_redis): mock_redis.get.return_value = b'{"data": "test"}' result = await cache.get("key1") assert result == {"data": "test"} mock_redis.get.assert_awaited_once_with("key1") @pytest.mark.asyncio async def test_get_none(self, cache, mock_redis): mock_redis.get.return_value = None result = await cache.get("key1") assert result is None @pytest.mark.asyncio async def test_set(self, cache, mock_redis): await cache.set("key1", {"data": "test"}, ttl=60) mock_redis.setex.assert_awaited_once() @pytest.mark.asyncio async def test_delete(self, cache, mock_redis): await cache.delete("key1") mock_redis.delete.assert_awaited_once_with("key1") @pytest.mark.asyncio async def test_exists(self, cache, mock_redis): mock_redis.exists.return_value = 1 result = await cache.exists("key1") assert result is True @pytest.mark.asyncio async def test_exists_false(self, cache, mock_redis): mock_redis.exists.return_value = 0 result = await cache.exists("key1") assert result is False @pytest.mark.asyncio async def test_incr(self, cache, mock_redis): mock_redis.incr.return_value = 5 result = await cache.incr("counter") assert result == 5 mock_redis.incr.assert_awaited_once_with("counter") @pytest.mark.asyncio async def test_expire(self, cache, mock_redis): mock_redis.expire.return_value = True result = await cache.expire("key1", 60) assert result is True mock_redis.expire.assert_awaited_once_with("key1", 60) @pytest.mark.asyncio async def test_get_json_decode_error(self, cache, mock_redis): mock_redis.get.return_value = b"invalid json" result = await cache.get("key1") assert result is None