Skip to content

Commit f902316

Browse files
committed
failing test for event handler garbage collection
1 parent 4ba179a commit f902316

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

tests/test_core/test_layout.py

+45
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import gc
33
import re
44
from weakref import finalize
5+
from weakref import ref as weakref
56

67
import pytest
78

@@ -526,6 +527,50 @@ def Inner(key):
526527
assert garbage_collect_items == [3, 2, 1]
527528

528529

530+
async def test_event_handler_at_component_root_is_garbage_collected():
531+
event_handler = idom.Ref()
532+
533+
@idom.component
534+
def HasEventHandlerAtRoot():
535+
value, set_value = idom.hooks.use_state(False)
536+
set_value(not value) # trigger renders forever
537+
event_handler.current = weakref(set_value)
538+
button = idom.html.button({"onClick": set_value}, "state is: ", value)
539+
event_handler.current = weakref(button["eventHandlers"]["onClick"].function)
540+
return button
541+
542+
with idom.Layout(HasEventHandlerAtRoot()) as layout:
543+
await layout.render()
544+
545+
for i in range(3):
546+
last_event_handler = event_handler.current
547+
# after this render we should have release the reference to the last handler
548+
await layout.render()
549+
assert last_event_handler() is None
550+
551+
552+
async def test_event_handler_deep_in_component_layout_is_garbage_collected():
553+
event_handler = idom.Ref()
554+
555+
@idom.component
556+
def HasNestedEventHandler():
557+
value, set_value = idom.hooks.use_state(False)
558+
set_value(not value) # trigger renders forever
559+
event_handler.current = weakref(set_value)
560+
button = idom.html.button({"onClick": set_value}, "state is: ", value)
561+
event_handler.current = weakref(button["eventHandlers"]["onClick"].function)
562+
return idom.html.div(idom.html.div(button))
563+
564+
with idom.Layout(HasNestedEventHandler()) as layout:
565+
await layout.render()
566+
567+
for i in range(3):
568+
last_event_handler = event_handler.current
569+
# after this render we should have release the reference to the last handler
570+
await layout.render()
571+
assert last_event_handler() is None
572+
573+
529574
async def test_duplicate_sibling_keys_causes_error(caplog):
530575
@idom.component
531576
def ComponentReturnsDuplicateKeys():

0 commit comments

Comments
 (0)