Skip to content

Commit 065df6f

Browse files
committed
Tests
1 parent a295d55 commit 065df6f

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def __init__(
112112
self.local_widget_factory, self.remote_widget_factory = widget_factories
113113
self.local_widget: CommWidget | None = None
114114
self.remote_widget: Widget | None = None
115+
self.remote_awareness: Awareness | None = None
115116
self.local_widget_created = Event()
116117
self.remote_widget_created = Event()
117118
self._remote_awareness: Awareness | None = None

tests/test_comm_awareness.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
 (0)