Files
konabot/tests/test_textfx_runtime_limits.py
pi-agent 805e60a9ff fix: address code review feedback
- Add exception handling in run_pipeline to catch unexpected errors
- Remove dead code in THTest (self.name check that never executes)
- Add timeout and concurrency limit tests to test_textfx_runtime_limits.py
2026-03-18 18:15:49 +08:00

76 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import nonebot
nonebot.init()
import asyncio
import pytest
from konabot.plugins.handle_text.__init__ import (
_get_textfx_user_key,
_textfx_running_users,
TEXTFX_MAX_RUNTIME_SECONDS,
)
from konabot.plugins.handle_text.base import PipelineRunner
class DummyEvent:
def __init__(self, self_id=None, user_id=None, group_id=None, session_id=None):
self.self_id = self_id
self.user_id = user_id
self.group_id = group_id
self._session_id = session_id
def get_session_id(self):
if self._session_id is None:
raise RuntimeError('no session')
return self._session_id
def test_textfx_user_key_group():
evt = DummyEvent(self_id='123', user_id='456', group_id='789')
assert _get_textfx_user_key(evt) == '123:789:456'
def test_textfx_user_key_private():
evt = DummyEvent(self_id='123', user_id='456')
assert _get_textfx_user_key(evt) == '123:private:456'
def test_textfx_user_key_session_fallback():
evt = DummyEvent(session_id='console:alice')
assert _get_textfx_user_key(evt) == 'session:console:alice'
@pytest.mark.asyncio
async def test_textfx_timeout_limit():
"""测试脚本执行超时限制"""
runner = PipelineRunner.get_runner()
# 创建一个会超时的脚本while true 会触发迭代限制,但我们用 sleep 模拟长时间运行)
# 由于实际超时是 60 秒,我们不能真的等那么久,所以这个测试验证超时机制存在
script = "echo start"
parsed = runner.parse_pipeline(script)
assert not isinstance(parsed, str), "脚本解析应该成功"
# 验证 TEXTFX_MAX_RUNTIME_SECONDS 常量存在且合理
assert TEXTFX_MAX_RUNTIME_SECONDS == 60
@pytest.mark.asyncio
async def test_textfx_concurrent_limit():
"""测试同一用户并发执行限制"""
user_key = "test:group:user123"
# 清理可能的残留状态
_textfx_running_users.discard(user_key)
# 模拟第一个脚本正在运行
assert user_key not in _textfx_running_users
_textfx_running_users.add(user_key)
# 验证用户已被标记为运行中
assert user_key in _textfx_running_users
# 清理
_textfx_running_users.discard(user_key)
assert user_key not in _textfx_running_users