aboutsummaryrefslogtreecommitdiff
path: root/tests/test_trio.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_trio.py')
-rw-r--r--tests/test_trio.py112
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)