1+ import time
12from contextlib import contextmanager , AbstractContextManager
23from typing import Callable , Tuple , Iterator , Type , Optional , Union , Any
34
910import idom
1011from idom .core .element import AbstractElement , ElementConstructor
1112from idom .server .sanic import SanicRenderServer , PerClientStateServer
12- from idom .server .prefab import hotswap_server
13+ from idom .server .prefab import hotswap_server , multiview_server , MultiViewMount
1314from idom .server .utils import find_available_port
1415from idom .utils import Ref
1516
1617
1718DisplayFunction = Callable [[Union [ElementConstructor , AbstractElement ], str ], None ]
1819
1920
20- def create_selenium_display_context (
21- headless : bool , driver_timeout : float = 3.0
22- ) -> Iterator [DisplayFunction ]:
21+ @contextmanager
22+ def open_selenium_chrome_driver_and_display_context (
23+ headless : bool , driver_timeout : float = 3.0 , wait_for_server_start : float = 1.0
24+ ) -> Iterator [Tuple [Chrome , DisplayFunction ]]:
2325 host = "127.0.0.1"
2426 port = find_available_port (host )
2527 server_url = f"http://{ host } :{ port } "
@@ -29,17 +31,21 @@ def create_selenium_display_context(
2931 page_load_timeout = driver_timeout ,
3032 implicit_wait_timeout = driver_timeout ,
3133 ) as driver :
32- with open_sanic_mount_and_server (
34+ with open_sanic_hotswap_mount_and_server (
3335 server_type = PerClientStateServer , host = host , port = port
3436 ) as (mount , server ):
35- return create_selenium_page_get_and_display_context (
36- driver , server , server_url , mount
37- )[1 ]
37+ time .sleep (wait_for_server_start )
38+ yield (
39+ driver ,
40+ create_selenium_page_get_and_display_context (
41+ driver , server , server_url , mount
42+ )[1 ],
43+ )
3844
3945
4046def create_selenium_page_get_and_display_context (
4147 driver : WebDriver ,
42- server : "_RenderServerSavesLastError " ,
48+ server : "SanicRenderServerWithLastError " ,
4349 server_url : str ,
4450 element_mount_function : Callable [..., None ],
4551) -> Tuple [Callable [[str ], None ], "AbstractContextManager[DisplayFunction]" ]:
@@ -86,24 +92,46 @@ def display_context():
8692
8793
8894@contextmanager
89- def open_sanic_mount_and_server (
95+ def open_sanic_multiview_mount_and_server (
9096 server_type : Type [SanicRenderServer ],
9197 host : str ,
9298 port : int ,
99+ debug : bool = False ,
100+ app : Optional [Sanic ] = None ,
101+ ) -> Iterator [Tuple [MultiViewMount , SanicRenderServer ]]:
102+ server_type = create_sanic_server_type_for_testing (server_type )
103+ try :
104+ yield multiview_server (
105+ server_type ,
106+ host ,
107+ port ,
108+ server_options = {"cors" : True },
109+ run_options = {"debug" : debug },
110+ app = app ,
111+ )
112+ finally :
113+ if server_type .last_server_error_for_idom_testing .current is not None :
114+ raise server_type .last_server_error_for_idom_testing .current # pragma: no cover
115+
116+
117+ @contextmanager
118+ def open_sanic_hotswap_mount_and_server (
119+ server_type : Type [SanicRenderServer ],
120+ host : str ,
121+ port : int ,
122+ sync_views : bool = False ,
123+ debug : bool = False ,
93124 app : Optional [Sanic ] = None ,
94125) -> Iterator [Tuple [Callable [..., None ], SanicRenderServer ]]:
126+ server_type = create_sanic_server_type_for_testing (server_type )
95127 try :
96128 yield hotswap_server (
97- (
98- server_type
99- if issubclass (server_type , _RenderServerSavesLastError )
100- else create_sanic_server_type_for_testing (server_type )
101- ),
129+ server_type ,
102130 host ,
103131 port ,
104132 server_options = {"cors" : True },
105- run_options = {},
106- sync_views = False ,
133+ run_options = {"debug" : debug },
134+ sync_views = sync_views ,
107135 app = app ,
108136 )
109137 finally :
@@ -113,11 +141,15 @@ def open_sanic_mount_and_server(
113141
114142def create_sanic_server_type_for_testing (
115143 server_type : Type [SanicRenderServer ],
116- ) -> Type ["_RenderServerSavesLastError" ]:
117- return type (
118- server_type .__name__ ,
119- (_RenderServerSavesLastError , server_type ),
120- {"last_server_error_for_idom_testing" : Ref (None )},
144+ ) -> Type ["SanicRenderServerWithLastError" ]:
145+ return (
146+ server_type
147+ if issubclass (server_type , SanicRenderServerWithLastError )
148+ else type (
149+ server_type .__name__ ,
150+ (SanicRenderServerWithLastError , server_type ),
151+ {"last_server_error_for_idom_testing" : Ref (None )},
152+ )
121153 )
122154
123155
@@ -143,7 +175,7 @@ def open_selenium_chrome_driver(
143175 driver .quit ()
144176
145177
146- class _RenderServerSavesLastError (SanicRenderServer ):
178+ class SanicRenderServerWithLastError (SanicRenderServer ):
147179 """A server that updates the ``last_server_error`` fixture"""
148180
149181 last_server_error_for_idom_testing : Ref [Optional [Exception ]]
0 commit comments