Skip to content

Commit ee85a84

Browse files
committed
add testing for new interfaces
1 parent 326191e commit ee85a84

File tree

5 files changed

+154
-19
lines changed

5 files changed

+154
-19
lines changed

docs/source/custom_js/package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/idom/core/events.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,15 @@ def __init__(
9090
self.target = target
9191

9292
def __eq__(self, other: Any) -> bool:
93-
for slot in self.__slots__:
94-
if not slot.startswith("_"):
95-
if not hasattr(other, slot):
96-
return False
97-
elif not getattr(other, slot) == getattr(self, slot):
93+
undefined = object()
94+
for attr in (
95+
"function",
96+
"prevent_default",
97+
"stop_propagation",
98+
"target",
99+
):
100+
if not attr.startswith("_"):
101+
if not getattr(other, attr, undefined) == getattr(self, attr):
98102
return False
99103
return True
100104

@@ -182,7 +186,7 @@ def merge_event_handler_funcs(
182186
) -> EventHandlerFunc:
183187
"""Make one event handler function from many"""
184188
if not functions:
185-
raise ValueError("No handler functions to merge")
189+
raise ValueError("No event handler functions to merge")
186190
elif len(functions) == 1:
187191
return functions[0]
188192

src/idom/core/proto.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from typing_extensions import Protocol, runtime_checkable
2222

2323

24-
if TYPE_CHECKING:
24+
if TYPE_CHECKING: # pragma: no cover
2525
from .vdom import VdomDict
2626

2727

tests/test_core/test_events.py

Lines changed: 116 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
import pytest
2+
13
import idom
2-
from idom.core.events import EventHandler
4+
from idom.core.events import (
5+
EventHandler,
6+
merge_event_handler_funcs,
7+
merge_event_handlers,
8+
to_event_handler_function,
9+
)
310

411

512
def test_event_handler_repr():
@@ -11,29 +18,128 @@ def test_event_handler_repr():
1118

1219

1320
def test_event_handler_props():
14-
handler_0 = EventHandler(lambda: None)
21+
handler_0 = EventHandler(lambda data: None)
1522
assert handler_0.stop_propagation is False
1623
assert handler_0.prevent_default is False
24+
assert handler_0.target is None
1725

18-
handler_1 = EventHandler(lambda: None, prevent_default=True)
26+
handler_1 = EventHandler(lambda data: None, prevent_default=True)
1927
assert handler_1.stop_propagation is False
2028
assert handler_1.prevent_default is True
29+
assert handler_1.target is None
2130

22-
handler_2 = EventHandler(lambda: None, stop_propagation=True)
31+
handler_2 = EventHandler(lambda data: None, stop_propagation=True)
2332
assert handler_2.stop_propagation is True
2433
assert handler_2.prevent_default is False
34+
assert handler_2.target is None
35+
36+
handler_3 = EventHandler(lambda data: None, target="123")
37+
assert handler_3.stop_propagation is False
38+
assert handler_3.prevent_default is False
39+
assert handler_3.target == "123"
40+
41+
42+
def test_event_handler_equivalence():
43+
async def func(data):
44+
return None
45+
46+
assert EventHandler(func) == EventHandler(func)
47+
48+
assert EventHandler(lambda data: None) != EventHandler(lambda data: None)
49+
50+
assert EventHandler(func, stop_propagation=True) != EventHandler(
51+
func, stop_propagation=False
52+
)
53+
54+
assert EventHandler(func, prevent_default=True) != EventHandler(
55+
func, prevent_default=False
56+
)
57+
58+
assert EventHandler(func, target="123") != EventHandler(func, target="456")
59+
60+
61+
async def test_to_event_handler_function():
62+
call_args = idom.Ref(None)
63+
64+
async def coro(*args):
65+
call_args.current = args
66+
67+
def func(*args):
68+
call_args.current = args
69+
70+
await to_event_handler_function(coro, positional_args=True)([1, 2, 3])
71+
assert call_args.current == (1, 2, 3)
72+
73+
await to_event_handler_function(func, positional_args=True)([1, 2, 3])
74+
assert call_args.current == (1, 2, 3)
75+
76+
await to_event_handler_function(coro, positional_args=False)([1, 2, 3])
77+
assert call_args.current == ([1, 2, 3],)
78+
79+
await to_event_handler_function(func, positional_args=False)([1, 2, 3])
80+
assert call_args.current == ([1, 2, 3],)
81+
82+
83+
async def test_merge_event_handler_empty_list():
84+
with pytest.raises(ValueError, match="No event handlers to merge"):
85+
merge_event_handlers([])
86+
87+
88+
@pytest.mark.parametrize(
89+
"kwargs_1, kwargs_2",
90+
[
91+
({"stop_propagation": True}, {"stop_propagation": False}),
92+
({"prevent_default": True}, {"prevent_default": False}),
93+
({"target": "this"}, {"target": "that"}),
94+
],
95+
)
96+
async def test_merge_event_handlers_raises_on_mismatch(kwargs_1, kwargs_2):
97+
def func(data):
98+
return None
99+
100+
with pytest.raises(ValueError, match="Cannot merge handlers"):
101+
merge_event_handlers(
102+
[
103+
EventHandler(func, **kwargs_1),
104+
EventHandler(func, **kwargs_2),
105+
]
106+
)
107+
108+
109+
async def test_merge_event_handlers():
110+
handler = EventHandler(lambda data: None)
111+
assert merge_event_handlers([handler]) is handler
112+
113+
calls = []
114+
merged_handler = merge_event_handlers(
115+
[
116+
EventHandler(lambda data: calls.append("first")),
117+
EventHandler(lambda data: calls.append("second")),
118+
]
119+
)
120+
await merged_handler.function({})
121+
assert calls == ["first", "second"]
122+
123+
124+
def test_merge_event_handler_funcs_empty_list():
125+
with pytest.raises(ValueError, match="No event handler functions to merge"):
126+
merge_event_handler_funcs([])
25127

26128

27-
def test_to_event_handler_function():
28-
assert False
129+
async def test_merge_event_handler_funcs():
130+
calls = []
29131

132+
async def some_func(data):
133+
calls.append("some_func")
30134

31-
def test_merge_event_handlers():
32-
assert False
135+
async def some_other_func(data):
136+
calls.append("some_other_func")
33137

138+
assert merge_event_handler_funcs([some_func]) is some_func
34139

35-
def test_merge_event_handler_funcs():
36-
assert False
140+
merged_handler = merge_event_handler_funcs([some_func, some_other_func])
141+
await merged_handler([])
142+
assert calls == ["some_func", "some_other_func"]
37143

38144

39145
def test_can_prevent_event_default_operation(driver, display):

tests/test_core/test_vdom.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_simple_node_construction(actual, expected):
7979
assert actual == expected
8080

8181

82-
def test_callable_attributes_are_cast_to_event_handlers():
82+
async def test_callable_attributes_are_cast_to_event_handlers():
8383
params_from_calls = []
8484

8585
node = idom.vdom("div", {"onEvent": lambda *args: params_from_calls.append(args)})
@@ -90,6 +90,31 @@ def test_callable_attributes_are_cast_to_event_handlers():
9090
handler = event_handlers["onEvent"]
9191
assert event_handlers == {"onEvent": EventHandler(handler.function)}
9292

93+
await handler.function([1, 2])
94+
await handler.function([3, 4, 5])
95+
assert params_from_calls == [(1, 2), (3, 4, 5)]
96+
97+
98+
async def test_event_handlers_and_callable_attributes_are_automatically_merged():
99+
calls = []
100+
101+
node = idom.vdom(
102+
"div",
103+
{"onEvent": lambda: calls.append("callable_attr")},
104+
event_handlers={
105+
"onEvent": EventHandler(lambda data: calls.append("normal_event_handler"))
106+
},
107+
)
108+
109+
event_handlers = node.pop("eventHandlers")
110+
assert node == {"tagName": "div"}
111+
112+
handler = event_handlers["onEvent"]
113+
assert event_handlers == {"onEvent": EventHandler(handler.function)}
114+
115+
await handler.function([])
116+
assert calls == ["normal_event_handler", "callable_attr"]
117+
93118

94119
def test_make_vdom_constructor():
95120
elmt = make_vdom_constructor("some-tag")

0 commit comments

Comments
 (0)