2
2
from contextlib import AsyncExitStack
3
3
from pathlib import Path
4
4
5
- from playwright .async_api import Browser
5
+ from playwright .async_api import Page
6
6
7
7
import reactpy
8
8
from reactpy .testing import BackendFixture , DisplayFixture , poll
13
13
JS_DIR = Path (__file__ ).parent / "js"
14
14
15
15
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
+ ):
23
19
@reactpy .component
24
20
def SomeComponent ():
25
21
count , incr_count = use_counter (0 )
@@ -35,39 +31,34 @@ async def get_count():
35
31
count = await page .wait_for_selector ("#count" )
36
32
return await count .get_attribute ("data-count" )
37
33
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 )
47
35
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 ()
51
39
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 ()
54
43
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 ()
60
47
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 )
63
50
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 ()
66
54
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 ()
69
58
70
- await incr .click ()
59
+ await poll (get_count ).until_equals ("2" )
60
+ incr = await page .wait_for_selector ("#incr" )
61
+ await incr .click ()
71
62
72
63
73
64
async def test_style_can_be_changed (display : DisplayFixture ):
0 commit comments