This repository was archived by the owner on May 9, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtest_dispatch.py
More file actions
135 lines (117 loc) · 3.9 KB
/
test_dispatch.py
File metadata and controls
135 lines (117 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Define tests for the Dispatch module."""
import asyncio
import functools
import pytest
from pysmartapp.dispatch import Dispatcher
class TestDispatcher:
"""Define tests for the dispatcher class."""
@staticmethod
@pytest.mark.asyncio
async def test_connect(handler):
"""Tests the connect function."""
# Arrange
dispatcher = Dispatcher()
# Act
dispatcher.connect('TEST', handler)
# Assert
assert handler in dispatcher.signals['TEST']
@staticmethod
@pytest.mark.asyncio
async def test_disconnect(handler):
"""Tests the disconnect function."""
# Arrange
dispatcher = Dispatcher()
disconnect = dispatcher.connect('TEST', handler)
# Act
disconnect()
# Assert
assert handler not in dispatcher.signals['TEST']
@staticmethod
@pytest.mark.asyncio
async def test_disconnect_all(handler):
"""Tests the disconnect all function."""
# Arrange
dispatcher = Dispatcher()
dispatcher.connect('TEST', handler)
dispatcher.connect('TEST', handler)
dispatcher.connect('TEST2', handler)
dispatcher.connect('TEST3', handler)
# Act
dispatcher.disconnect_all()
# Assert
assert handler not in dispatcher.signals['TEST']
assert handler not in dispatcher.signals['TEST2']
assert handler not in dispatcher.signals['TEST3']
@staticmethod
@pytest.mark.asyncio
async def test_already_disconnected(handler):
"""Tests that disconnect can be called more than once."""
# Arrange
dispatcher = Dispatcher()
disconnect = dispatcher.connect('TEST', handler)
disconnect()
# Act
disconnect()
# Assert
assert handler not in dispatcher.signals['TEST']
@staticmethod
@pytest.mark.asyncio
async def test_send_async_handler(async_handler):
"""Tests sending to async handlers."""
# Arrange
dispatcher = Dispatcher()
dispatcher.connect('TEST', async_handler)
# Act
await asyncio.gather(*dispatcher.send('TEST'))
# Assert
assert async_handler.fired
@staticmethod
@pytest.mark.asyncio
async def test_send_async_partial_handler(async_handler):
"""Tests sending to async handlers."""
# Arrange
partial = functools.partial(async_handler)
dispatcher = Dispatcher()
dispatcher.connect('TEST', partial)
# Act
await asyncio.gather(*dispatcher.send('TEST'))
# Assert
assert async_handler.fired
@staticmethod
@pytest.mark.asyncio
async def test_send(handler):
"""Tests sending to async handlers."""
# Arrange
dispatcher = Dispatcher()
dispatcher.connect('TEST', handler)
args = object()
# Act
await asyncio.gather(*dispatcher.send('TEST', args))
# Assert
assert handler.fired
assert handler.args[0] == args
@staticmethod
@pytest.mark.asyncio
async def test_custom_connect_and_send(handler):
"""Tests using the custom connect and send implementations."""
# Arrange
test_signal = 'PREFIX_TEST'
stored_target = None
def connect(signal, target):
assert signal == test_signal
nonlocal stored_target
stored_target = target
def disconnect():
nonlocal stored_target
stored_target = None
return disconnect
def send(signal, *args):
assert signal == test_signal
stored_target(*args) # pylint:disable=not-callable
dispatcher = Dispatcher(connect=connect, send=send,
signal_prefix='PREFIX_')
# Act
dispatcher.connect('TEST', handler)
dispatcher.send('TEST')
# Assert
assert handler.fired