diff --git a/nonebot/plugins/single_session.py b/nonebot/plugins/single_session.py index d0e5b4a6..11b5b6cc 100644 --- a/nonebot/plugins/single_session.py +++ b/nonebot/plugins/single_session.py @@ -21,7 +21,7 @@ async def matcher_mutex(event: Event) -> Generator[bool, None, None]: else: _running_matcher[session_id] = current_event_id yield result - if result: + if not result: del _running_matcher[session_id] diff --git a/tests/test_single_session.py b/tests/test_single_session.py index f0a696d5..1a2bc67f 100644 --- a/tests/test_single_session.py +++ b/tests/test_single_session.py @@ -7,22 +7,30 @@ from utils import make_fake_event @pytest.mark.asyncio async def test_matcher_mutex(): - from nonebot.plugins.single_session import matcher_mutex + from nonebot.plugins.single_session import matcher_mutex, _running_matcher am = asynccontextmanager(matcher_mutex) event = make_fake_event()() event_1 = make_fake_event()() event_2 = make_fake_event(_session_id="test1")() + event_3 = make_fake_event(_session_id=None)() async with am(event) as ctx: assert ctx == False + assert not _running_matcher async with am(event) as ctx: async with am(event_1) as ctx_1: assert ctx == False assert ctx_1 == True + assert not _running_matcher async with am(event) as ctx: async with am(event_2) as ctx_2: assert ctx == False assert ctx_2 == False + assert not _running_matcher + + async with am(event_3) as ctx_3: + assert ctx_3 == False + assert not _running_matcher diff --git a/tests/utils.py b/tests/utils.py index 711c7c05..e82ad7d9 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -50,7 +50,7 @@ def make_fake_event( _name: str = "test", _description: str = "test", _user_id: str = "test", - _session_id: str = "test", + _session_id: Optional[str] = "test", _message: Optional["Message"] = None, _to_me: bool = True, **fields, @@ -73,7 +73,9 @@ def make_fake_event( return _user_id def get_session_id(self) -> str: - return _session_id + if _session_id is not None: + return _session_id + raise NotImplementedError def get_message(self) -> "Message": if _message is not None: