test_sse_limits.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import asyncio
  2. from uuid import uuid4
  3. import pytest
  4. from pydantic import ValidationError
  5. from test_after_sales import scenario # noqa: F401
  6. from zhifu.core.config import Settings
  7. from zhifu.modules.conversations.stream import ADMIT
  8. @pytest.mark.parametrize("global_limit,actor_limit", [(0, 3), (100001, 3), (200, 0), (3, 4)])
  9. def test_invalid_sse_limits(global_limit, actor_limit):
  10. with pytest.raises(ValidationError):
  11. Settings(sse_global_limit=global_limit, sse_actor_limit=actor_limit)
  12. async def test_configurable_sse_admission_is_atomic_and_shared(scenario): # noqa: F811
  13. state = scenario["app"].state.state
  14. prefix = "verify:sse:" + uuid4().hex
  15. keys = [prefix, prefix + ":actor1", prefix + ":actor2"]
  16. try:
  17. results = await asyncio.gather(*(
  18. state.eval(ADMIT, 2, keys[0], keys[1 + index % 2], uuid4().hex, 5, 3)
  19. for index in range(40)
  20. ))
  21. assert sum(results) == 5
  22. assert await state.zcard(keys[0]) == 5
  23. assert all(count <= 3 for count in await asyncio.gather(
  24. state.zcard(keys[1]), state.zcard(keys[2])
  25. ))
  26. # 使用真实 Redis 到期分数验证异常中断的额度回收。
  27. for key in keys:
  28. members = await state.zrange(key, 0, -1)
  29. if members:
  30. await state.zadd(key, dict.fromkeys(members, 0))
  31. assert await state.eval(ADMIT, 2, keys[0], keys[1], uuid4().hex, 3000, 3) == 1
  32. assert await state.zcard(keys[0]) == 1
  33. finally:
  34. await state.delete(*keys)