from contextlib import asynccontextmanager

import pytest

from utils import make_fake_event


@pytest.mark.asyncio
async def test_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