Skip to content

Commit 3deba06

Browse files
committed
fix cov
1 parent ed7b56c commit 3deba06

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/py/reactpy/reactpy/core/hooks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ def set_current(self) -> None:
709709
def unset_current(self) -> None:
710710
"""Unset this hook as the active hook in this thread"""
711711
if _hook_stack.get().pop() is not self:
712-
raise RuntimeError("Hook stack is in an invalid state")
712+
raise RuntimeError("Hook stack is in an invalid state") # nocov
713713

714714
def _schedule_render(self) -> None:
715715
try:

src/py/reactpy/tests/test_core/test_hooks.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
import reactpy
66
from reactpy import html
77
from reactpy.config import REACTPY_DEBUG_MODE
8-
from reactpy.core.hooks import LifeCycleHook, strictly_equal
8+
from reactpy.core.hooks import (
9+
LifeCycleHook,
10+
strictly_equal,
11+
COMPONENT_DID_RENDER_EFFECT,
12+
current_hook,
13+
)
914
from reactpy.core.layout import Layout
1015
from reactpy.testing import DisplayFixture, HookCatcher, assert_reactpy_did_log, poll
1116
from reactpy.testing.logs import assert_reactpy_did_not_log
@@ -988,7 +993,7 @@ def Child2():
988993
await layout.render()
989994

990995

991-
async def test_error_in_effect_cleanup_is_gracefully_handled():
996+
async def test_error_in_layout_effect_cleanup_is_gracefully_handled():
992997
component_hook = HookCatcher()
993998

994999
@reactpy.component
@@ -1227,3 +1232,28 @@ def some_component():
12271232
state.current.set_value(2)
12281233
await layout.render()
12291234
assert state.current.value == 2
1235+
1236+
1237+
async def test_error_in_component_effect_cleanup_is_gracefully_handled():
1238+
component_hook = HookCatcher()
1239+
1240+
@reactpy.component
1241+
@component_hook.capture
1242+
def ComponentWithEffect():
1243+
hook = current_hook()
1244+
1245+
def bad_effect():
1246+
raise ValueError("The error message")
1247+
1248+
hook.add_effect(COMPONENT_DID_RENDER_EFFECT, bad_effect)
1249+
return reactpy.html.div()
1250+
1251+
with assert_reactpy_did_log(
1252+
match_message="Component post-render effect .*? failed",
1253+
error_type=ValueError,
1254+
match_error="The error message",
1255+
):
1256+
async with reactpy.Layout(ComponentWithEffect()) as layout:
1257+
await layout.render()
1258+
component_hook.latest.schedule_render()
1259+
await layout.render() # no error

0 commit comments

Comments
 (0)