1+ from __future__ import annotations
2+
3+ from unittest .mock import patch
4+
5+ import pytest
6+ from anyio import sleep
7+ from pycrdt import Doc , Text , YMessageType , create_awareness_message
8+
9+ from ypywidgets .comm import CommProvider , CommWidget
10+
11+ pytestmark = pytest .mark .anyio
12+
13+
14+ class DummyComm :
15+ def __init__ (self ):
16+ self .sent : list [bytes ] = []
17+ self ._handler = None
18+
19+ def send (self , * , buffers = None , ** kwargs ):
20+ if buffers :
21+ self .sent .append (bytes (memoryview (buffers [0 ])))
22+
23+ def on_msg (self , handler ):
24+ self ._handler = handler
25+
26+
27+ def test_comm_provider_applies_awareness_frame ():
28+ doc = Doc ()
29+ comm = DummyComm ()
30+ provider = CommProvider (doc , comm )
31+
32+ awareness = provider .awareness
33+ awareness .set_local_state ({"role" : "tester" })
34+ payload = awareness .encode_awareness_update ([awareness .client_id ])
35+ frame = create_awareness_message (payload )
36+
37+ assert frame [0 ] == YMessageType .AWARENESS
38+
39+ provider ._receive ({"buffers" : [frame ]})
40+
41+ state = awareness .get_local_state ()
42+ assert state is not None
43+ assert state .get ("role" ) == "tester"
44+
45+
46+ @patch ("ypywidgets.comm.create_widget_comm" )
47+ def test_comm_widget_exposes_provider_awareness (mock_create_comm ):
48+ comm = DummyComm ()
49+ mock_create_comm .return_value = comm
50+
51+ widget = CommWidget ()
52+ assert widget .awareness is widget ._comm_provider .awareness
53+
54+
55+ @patch ("ypywidgets.comm.create_widget_comm" )
56+ def test_comm_widget_awareness_observe_and_unobserve (mock_create_comm ):
57+ comm = DummyComm ()
58+ mock_create_comm .return_value = comm
59+ widget = CommWidget ()
60+
61+ events : list [str ] = []
62+ sub_id = widget .on_awareness_change (lambda topic , _ : events .append (topic ))
63+
64+ widget .awareness .set_local_state ({"ping" : 1 })
65+ assert events
66+
67+ widget .unobserve_awareness (sub_id )
68+ events .clear ()
69+ widget .awareness .set_local_state ({"ping" : 2 })
70+ assert events == []
0 commit comments