22from contextlib import AsyncExitStack
33from pathlib import Path
44
5- from playwright .async_api import Browser
5+ from playwright .async_api import Page
66
77import reactpy
88from reactpy .testing import BackendFixture , DisplayFixture , poll
1313JS_DIR = Path (__file__ ).parent / "js"
1414
1515
16- async def test_automatic_reconnect (browser : Browser ):
17- port = find_available_port ("localhost" )
18- page = await browser .new_page ()
19-
20- # we need to wait longer here because the automatic reconnect is not instant
21- page .set_default_timeout (10000 )
22-
16+ async def test_automatic_reconnect (
17+ display : DisplayFixture , page : Page , server : BackendFixture
18+ ):
2319 @reactpy .component
2420 def SomeComponent ():
2521 count , incr_count = use_counter (0 )
@@ -35,39 +31,34 @@ async def get_count():
3531 count = await page .wait_for_selector ("#count" )
3632 return await count .get_attribute ("data-count" )
3733
38- async with AsyncExitStack () as exit_stack :
39- server = await exit_stack .enter_async_context (BackendFixture (port = port ))
40- display = await exit_stack .enter_async_context (
41- DisplayFixture (server , driver = page )
42- )
43-
44- await display .show (SomeComponent )
45-
46- incr = await page .wait_for_selector ("#incr" )
34+ await display .show (SomeComponent )
4735
48- for i in range ( 3 ):
49- await poll ( get_count ). until_equals ( str ( i ) )
50- await incr .click ()
36+ await poll ( get_count ). until_equals ( "0" )
37+ incr = await page . wait_for_selector ( "#incr" )
38+ await incr .click ()
5139
52- # the server is disconnected but the last view state is still shown
53- await page .wait_for_selector ("#count" )
40+ await poll (get_count ).until_equals ("1" )
41+ incr = await page .wait_for_selector ("#incr" )
42+ await incr .click ()
5443
55- async with AsyncExitStack () as exit_stack :
56- server = await exit_stack .enter_async_context (BackendFixture (port = port ))
57- display = await exit_stack .enter_async_context (
58- DisplayFixture (server , driver = page )
59- )
44+ await poll (get_count ).until_equals ("2" )
45+ incr = await page .wait_for_selector ("#incr" )
46+ await incr .click ()
6047
61- # use mount instead of show to avoid a page refresh
62- display .backend . mount (SomeComponent )
48+ await server . restart ()
49+ await display .show (SomeComponent )
6350
64- for i in range (3 ):
65- await poll (get_count ).until_equals (str (i ))
51+ await poll (get_count ).until_equals ("0" )
52+ incr = await page .wait_for_selector ("#incr" )
53+ await incr .click ()
6654
67- # need to refetch element because may unmount on reconnect
68- incr = await page .wait_for_selector ("#incr" )
55+ await poll (get_count ).until_equals ("1" )
56+ incr = await page .wait_for_selector ("#incr" )
57+ await incr .click ()
6958
70- await incr .click ()
59+ await poll (get_count ).until_equals ("2" )
60+ incr = await page .wait_for_selector ("#incr" )
61+ await incr .click ()
7162
7263
7364async def test_style_can_be_changed (display : DisplayFixture ):
0 commit comments