diff options
Diffstat (limited to 'tests/test_trio.py')
-rw-r--r-- | tests/test_trio.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/test_trio.py b/tests/test_trio.py new file mode 100644 index 0000000..3877849 --- /dev/null +++ b/tests/test_trio.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +import pytest +import pytest_trio.plugin # noqa +import trio + +from pyee import TrioEventEmitter + + +class PyeeTestError(Exception): + pass + + +@pytest.mark.trio +async def test_trio_emit(): + """Test that the trio event emitter can handle wrapping + coroutines + """ + + async with TrioEventEmitter() as ee: + + should_call = trio.Event() + + @ee.on("event") + async def event_handler(): + should_call.set() + + ee.emit("event") + + result = False + with trio.move_on_after(0.1): + await should_call.wait() + result = True + + assert result + + +@pytest.mark.trio +async def test_trio_once_emit(): + """Test that trio event emitters also wrap coroutines when + using once + """ + + async with TrioEventEmitter() as ee: + should_call = trio.Event() + + @ee.once("event") + async def event_handler(): + should_call.set() + + ee.emit("event") + + result = False + with trio.move_on_after(0.1): + await should_call.wait() + result = True + + assert result + + +@pytest.mark.trio +async def test_trio_error(): + """Test that trio event emitters can handle errors when + wrapping coroutines + """ + + async with TrioEventEmitter() as ee: + send, rcv = trio.open_memory_channel(1) + + @ee.on("event") + async def event_handler(): + raise PyeeTestError() + + @ee.on("error") + async def handle_error(exc): + async with send: + await send.send(exc) + + ee.emit("event") + + result = None + with trio.move_on_after(0.1): + async with rcv: + result = await rcv.__anext__() + + assert isinstance(result, PyeeTestError) + + +@pytest.mark.trio +async def test_sync_error(event_loop): + """Test that regular functions have the same error handling as coroutines""" + + async with TrioEventEmitter() as ee: + send, rcv = trio.open_memory_channel(1) + + @ee.on("event") + def sync_handler(): + raise PyeeTestError() + + @ee.on("error") + async def handle_error(exc): + async with send: + await send.send(exc) + + ee.emit("event") + + result = None + with trio.move_on_after(0.1): + async with rcv: + result = await rcv.__anext__() + + assert isinstance(result, PyeeTestError) |