Skip to main content
Glama

MCP Market Statistics Server

by whdghk1907
test_cache.pyβ€’8.74 kB
"""μΊμ‹œ 관리 ν…ŒμŠ€νŠΈ""" import pytest import json from unittest.mock import Mock, patch, AsyncMock from src.utils.cache import CacheManager from src.exceptions import CacheError class TestCacheManager: """μΊμ‹œ λ§€λ‹ˆμ € ν…ŒμŠ€νŠΈ""" @pytest.fixture def cache_config(self): """ν…ŒμŠ€νŠΈμš© μΊμ‹œ μ„€μ •""" return { "host": "localhost", "port": 6379, "db": 0, "password": None } @pytest.fixture def cache_manager(self, cache_config): """ν…ŒμŠ€νŠΈμš© μΊμ‹œ λ§€λ‹ˆμ €""" return CacheManager(cache_config) def test_cache_manager_initialization(self, cache_manager, cache_config): """μΊμ‹œ λ§€λ‹ˆμ € μ΄ˆκΈ°ν™” ν…ŒμŠ€νŠΈ""" assert cache_manager.config == cache_config assert cache_manager.redis_client is None assert cache_manager.default_ttl == 300 def test_connection_url_generation(self, cache_manager): """Redis μ—°κ²° URL 생성 ν…ŒμŠ€νŠΈ""" expected_url = "redis://localhost:6379/0" assert cache_manager.connection_url == expected_url def test_connection_url_with_password(self): """λΉ„λ°€λ²ˆν˜Έκ°€ μžˆλŠ” Redis URL ν…ŒμŠ€νŠΈ""" config = { "host": "localhost", "port": 6379, "db": 1, "password": "secret123" } cache_manager = CacheManager(config) expected_url = "redis://:secret123@localhost:6379/1" assert cache_manager.connection_url == expected_url @pytest.mark.asyncio async def test_successful_connection(self, cache_manager): """성곡적인 Redis μ—°κ²° ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_from_url.return_value = mock_redis await cache_manager.connect() assert cache_manager.redis_client == mock_redis assert cache_manager.is_connected mock_from_url.assert_called_once() mock_redis.ping.assert_called_once() @pytest.mark.asyncio async def test_connection_failure(self, cache_manager): """Redis μ—°κ²° μ‹€νŒ¨ ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_from_url.side_effect = Exception("Connection failed") with pytest.raises(CacheError): await cache_manager.connect() assert cache_manager.redis_client is None assert not cache_manager.is_connected @pytest.mark.asyncio async def test_get_existing_key(self, cache_manager): """μ‘΄μž¬ν•˜λŠ” ν‚€ 쑰회 ν…ŒμŠ€νŠΈ""" test_data = {"message": "hello", "number": 42} with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.get.return_value = json.dumps(test_data) mock_from_url.return_value = mock_redis await cache_manager.connect() result = await cache_manager.get("test_key") assert result == test_data mock_redis.get.assert_called_once_with("test_key") @pytest.mark.asyncio async def test_get_nonexistent_key(self, cache_manager): """μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν‚€ 쑰회 ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.get.return_value = None mock_from_url.return_value = mock_redis await cache_manager.connect() result = await cache_manager.get("nonexistent_key") assert result is None mock_redis.get.assert_called_once_with("nonexistent_key") @pytest.mark.asyncio async def test_set_with_default_ttl(self, cache_manager): """κΈ°λ³Έ TTL둜 데이터 μ €μž₯ ν…ŒμŠ€νŠΈ""" test_data = {"message": "hello"} with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.setex.return_value = True mock_from_url.return_value = mock_redis await cache_manager.connect() result = await cache_manager.set("test_key", test_data) assert result is True mock_redis.setex.assert_called_once_with( "test_key", 300, # default TTL json.dumps(test_data, ensure_ascii=False) ) @pytest.mark.asyncio async def test_set_with_custom_ttl(self, cache_manager): """μ»€μŠ€ν…€ TTL둜 데이터 μ €μž₯ ν…ŒμŠ€νŠΈ""" test_data = {"message": "hello"} with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.setex.return_value = True mock_from_url.return_value = mock_redis await cache_manager.connect() result = await cache_manager.set("test_key", test_data, ttl=600) assert result is True mock_redis.setex.assert_called_once_with( "test_key", 600, json.dumps(test_data, ensure_ascii=False) ) @pytest.mark.asyncio async def test_delete_key(self, cache_manager): """ν‚€ μ‚­μ œ ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.delete.return_value = 1 mock_from_url.return_value = mock_redis await cache_manager.connect() result = await cache_manager.delete("test_key") assert result is True mock_redis.delete.assert_called_once_with("test_key") @pytest.mark.asyncio async def test_invalidate_pattern(self, cache_manager): """νŒ¨ν„΄ 맀칭으둜 ν‚€ λ¬΄νš¨ν™” ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_redis.keys.return_value = ["market:test1", "market:test2"] mock_redis.delete.return_value = 2 mock_from_url.return_value = mock_redis await cache_manager.connect() await cache_manager.invalidate_pattern("market:*") mock_redis.keys.assert_called_once_with("market:*") mock_redis.delete.assert_called_once_with("market:test1", "market:test2") @pytest.mark.asyncio async def test_operation_without_connection(self, cache_manager): """μ—°κ²° 없이 μž‘μ—… μ‹œ μ˜ˆμ™Έ ν…ŒμŠ€νŠΈ""" with pytest.raises(CacheError): await cache_manager.get("test_key") with pytest.raises(CacheError): await cache_manager.set("test_key", {"data": "test"}) @pytest.mark.asyncio async def test_health_check_success(self, cache_manager): """ν—¬μŠ€μ²΄ν¬ 성곡 ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() mock_redis.ping.return_value = True mock_from_url.return_value = mock_redis await cache_manager.connect() is_healthy = await cache_manager.health_check() assert is_healthy is True @pytest.mark.asyncio async def test_health_check_failure(self, cache_manager): """ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ ν…ŒμŠ€νŠΈ""" with patch('redis.asyncio.from_url') as mock_from_url: mock_redis = AsyncMock() # 연결은 μ„±κ³΅ν•˜μ§€λ§Œ ν—¬μŠ€μ²΄ν¬μ—μ„œ μ‹€νŒ¨ connect_call = [True] # 첫 ν˜ΈμΆœμ€ 성곡 def ping_side_effect(*args, **kwargs): if connect_call[0]: connect_call[0] = False return True # μ—°κ²° μ‹œ 성곡 else: raise Exception("Redis error") # ν—¬μŠ€μ²΄ν¬ μ‹œ μ‹€νŒ¨ mock_redis.ping.side_effect = ping_side_effect mock_from_url.return_value = mock_redis await cache_manager.connect() is_healthy = await cache_manager.health_check() assert is_healthy is False

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/whdghk1907/mcp-market-statistics'

If you have feedback or need assistance with the MCP directory API, please join our Discord server