63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
|
|
# =============================================================================
|
||
|
|
# 复杂场景重构 — 自动化测试局部 conftest
|
||
|
|
# =============================================================================
|
||
|
|
# 说明:扩展全局 MockRedis,增加 sadd/srem 方法(session_manager 和
|
||
|
|
# timeout_cleaner 中使用了 Redis SET 操作)。
|
||
|
|
# =============================================================================
|
||
|
|
|
||
|
|
from typing import Dict, Set
|
||
|
|
from tests.conftest import MockRedis
|
||
|
|
|
||
|
|
|
||
|
|
class ExtendedMockRedis(MockRedis):
|
||
|
|
"""扩展 MockRedis,支持 sadd/srem/smembers 操作。
|
||
|
|
|
||
|
|
session_manager.pause_session 使用 redis.sadd() 向暂停会话集合添加成员,
|
||
|
|
resume_session / agent_close / timeout_cleaner 使用 redis.srem() 移除成员。
|
||
|
|
基础 MockRedis 不含这些方法,此处扩展。
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self):
|
||
|
|
super().__init__()
|
||
|
|
self._sets: Dict[str, Set[str]] = {}
|
||
|
|
|
||
|
|
async def sadd(self, name: str, *values) -> int:
|
||
|
|
"""模拟 Redis SADD 命令。"""
|
||
|
|
s = self._sets.setdefault(name, set())
|
||
|
|
count = 0
|
||
|
|
for v in values:
|
||
|
|
v_str = v.decode("utf-8") if isinstance(v, bytes) else str(v)
|
||
|
|
if v_str not in s:
|
||
|
|
s.add(v_str)
|
||
|
|
count += 1
|
||
|
|
return count
|
||
|
|
|
||
|
|
async def srem(self, name: str, *values) -> int:
|
||
|
|
"""模拟 Redis SREM 命令。"""
|
||
|
|
s = self._sets.get(name, set())
|
||
|
|
count = 0
|
||
|
|
for v in values:
|
||
|
|
v_str = v.decode("utf-8") if isinstance(v, bytes) else str(v)
|
||
|
|
if v_str in s:
|
||
|
|
s.discard(v_str)
|
||
|
|
count += 1
|
||
|
|
return count
|
||
|
|
|
||
|
|
async def smembers(self, name: str) -> Set[str]:
|
||
|
|
"""模拟 Redis SMEMBERS 命令。"""
|
||
|
|
return set(self._sets.get(name, set()))
|
||
|
|
|
||
|
|
def reset(self) -> None:
|
||
|
|
"""重置所有数据。"""
|
||
|
|
super().reset()
|
||
|
|
self._sets.clear()
|
||
|
|
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture
|
||
|
|
def mock_redis():
|
||
|
|
"""覆盖全局 mock_redis fixture,返回支持 sadd/srem 的扩展版本。"""
|
||
|
|
return ExtendedMockRedis()
|