|
| 1 | +from idom.core.element import element |
| 2 | +import re |
| 3 | + |
1 | 4 | import pytest |
2 | 5 |
|
3 | 6 | import idom |
@@ -389,12 +392,72 @@ def effect(): |
389 | 392 | assert effect_run_count.current == 2 |
390 | 393 |
|
391 | 394 |
|
392 | | -def test_error_in_effect_is_gracefully_handled(): |
393 | | - assert False |
| 395 | +async def test_error_in_effect_is_gracefully_handled(caplog): |
| 396 | + @idom.element |
| 397 | + async def ElementWithEffect(): |
| 398 | + @idom.hooks.use_effect |
| 399 | + def bad_effect(): |
| 400 | + raise ValueError("Something went wong :(") |
| 401 | + |
| 402 | + return idom.html.div() |
394 | 403 |
|
| 404 | + async with idom.Layout(ElementWithEffect()) as layout: |
| 405 | + await layout.render() # no error |
395 | 406 |
|
396 | | -def test_error_in_effect_cleanup_is_gracefully_handled(): |
397 | | - assert False |
| 407 | + first_log_line = next(iter(caplog.records)).msg.split("\n", 1)[0] |
| 408 | + assert re.match("Post-render effect .*? failed for .*?", first_log_line) |
| 409 | + |
| 410 | + |
| 411 | +async def test_error_in_effect_pre_render_cleanup_is_gracefully_handled(caplog): |
| 412 | + element_hook = HookCatcher() |
| 413 | + |
| 414 | + @idom.element |
| 415 | + @element_hook.capture |
| 416 | + async def ElementWithEffect(): |
| 417 | + @idom.hooks.use_effect |
| 418 | + def ok_effect(): |
| 419 | + def bad_cleanup(): |
| 420 | + raise ValueError("Something went wong :(") |
| 421 | + |
| 422 | + return bad_cleanup |
| 423 | + |
| 424 | + return idom.html.div() |
| 425 | + |
| 426 | + async with idom.Layout(ElementWithEffect()) as layout: |
| 427 | + await layout.render() |
| 428 | + element_hook.schedule_render() |
| 429 | + await layout.render() # no error |
| 430 | + |
| 431 | + first_log_line = next(iter(caplog.records)).msg.split("\n", 1)[0] |
| 432 | + assert re.match("Pre-render effect .*? failed for .*?", first_log_line) |
| 433 | + |
| 434 | + |
| 435 | +async def test_error_in_effect_pre_unmount_cleanup_is_gracefully_handled(caplog): |
| 436 | + outer_element_hook = HookCatcher() |
| 437 | + |
| 438 | + @idom.element |
| 439 | + @outer_element_hook.capture |
| 440 | + async def OuterElement(): |
| 441 | + return ElementWithEffect() |
| 442 | + |
| 443 | + @idom.element |
| 444 | + async def ElementWithEffect(): |
| 445 | + @idom.hooks.use_effect |
| 446 | + def ok_effect(): |
| 447 | + def bad_cleanup(): |
| 448 | + raise ValueError("Something went wong :(") |
| 449 | + |
| 450 | + return bad_cleanup |
| 451 | + |
| 452 | + return idom.html.div() |
| 453 | + |
| 454 | + async with idom.Layout(OuterElement()) as layout: |
| 455 | + await layout.render() |
| 456 | + outer_element_hook.schedule_render() |
| 457 | + await layout.render() # no error |
| 458 | + |
| 459 | + first_log_line = next(iter(caplog.records)).msg.split("\n", 1)[0] |
| 460 | + assert re.match("Pre-unmount effect .*? failed for .*?", first_log_line) |
398 | 461 |
|
399 | 462 |
|
400 | 463 | async def test_use_reducer(): |
|
0 commit comments