Browse Source

introduction of "await client.disconnected()"

Rodja Trappe 2 years ago
parent
commit
cb3b7554e2
2 changed files with 25 additions and 0 deletions
  1. 7 0
      nicegui/client.py
  2. 18 0
      tests/test_page.py

+ 7 - 0
nicegui/client.py

@@ -31,6 +31,7 @@ class Client:
         self.elements: Dict[int, Element] = {}
         self.next_element_id: int = 0
         self.is_waiting_for_connection: bool = False
+        self.is_waiting_for_disconnect: bool = False
         self.environ: Optional[Dict[str, Any]] = None
         self.shared = shared
 
@@ -93,6 +94,12 @@ class Client:
             await asyncio.sleep(check_interval)
         self.is_waiting_for_connection = False
 
+    async def disconnected(self, check_interval: float = 0.1) -> None:
+        self.is_waiting_for_disconnect = True
+        while self.id in globals.clients:
+            await asyncio.sleep(check_interval)
+        self.is_waiting_for_disconnect = False
+
     async def run_javascript(self, code: str, *,
                              respond: bool = True, timeout: float = 1.0, check_interval: float = 0.01) -> Optional[str]:
         request_id = str(uuid.uuid4())

+ 18 - 0
tests/test_page.py

@@ -121,6 +121,24 @@ def test_wait_for_connected(screen: Screen):
     screen.should_contain('delayed data has been loaded')
 
 
+def test_wait_for_disconnect(screen: Screen):
+    events = []
+
+    @ui.page('/')
+    async def page(client: Client):
+        nonlocal events
+        await client.connected()
+        events.append('connected')
+        await client.disconnected()
+        events.append('disconnected')
+
+    screen.open('/')
+    screen.open('/')
+    assert events == ['connected', 'disconnected']
+    screen.wait(0.1)
+    assert ['connected', 'disconnected', 'connected'] == events
+
+
 def test_adding_elements_after_connected(screen: Screen):
     @ui.page('/')
     async def page(client: Client):