|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | | -from unittest.mock import patch |
4 | | - |
5 | 3 | import pytest |
6 | 4 | from anyio import sleep |
7 | | -from pycrdt import Doc, YMessageType, create_awareness_message |
8 | | - |
9 | | -from ypywidgets.comm import CommProvider, CommWidget |
| 5 | +from pycrdt import Awareness, Doc, YMessageType, create_awareness_message |
10 | 6 |
|
11 | 7 | pytestmark = pytest.mark.anyio |
12 | 8 |
|
13 | 9 |
|
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 |
| 10 | +async def test_comm_provider_applies_awareness_frame(synced_widgets, context): |
| 11 | + async with context: |
| 12 | + local_widget = await synced_widgets.get_local_widget() |
| 13 | + remote_awareness = Awareness(Doc()) |
| 14 | + remote_awareness.set_local_state({"role": "remote"}) |
| 15 | + payload = remote_awareness.encode_awareness_update([remote_awareness.client_id]) |
| 16 | + frame = create_awareness_message(payload) |
38 | 17 |
|
39 | | - provider._receive({"buffers": [frame]}) |
| 18 | + assert frame[0] == YMessageType.AWARENESS |
40 | 19 |
|
41 | | - state = awareness.get_local_state() |
42 | | - assert state is not None |
43 | | - assert state.get("role") == "tester" |
| 20 | + local_widget._comm_provider._receive({"buffers": [frame]}) |
44 | 21 |
|
| 22 | + remote_state = local_widget.awareness.states.get(remote_awareness.client_id) |
| 23 | + assert remote_state is not None |
| 24 | + assert remote_state.get("role") == "remote" |
45 | 25 |
|
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 | 26 |
|
51 | | - widget = CommWidget() |
52 | | - assert widget.awareness is widget._comm_provider.awareness |
| 27 | +async def test_comm_widget_exposes_provider_awareness(synced_widgets, context): |
| 28 | + async with context: |
| 29 | + widget = await synced_widgets.get_local_widget() |
| 30 | + assert widget.awareness is widget._comm_provider.awareness |
53 | 31 |
|
54 | 32 |
|
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() |
| 33 | +async def test_comm_widget_awareness_observe_and_unobserve(synced_widgets, context): |
| 34 | + async with context: |
| 35 | + widget = await synced_widgets.get_local_widget() |
60 | 36 |
|
61 | | - events: list[str] = [] |
62 | | - sub_id = widget.on_awareness_change(lambda topic, _: events.append(topic)) |
| 37 | + events: list[str] = [] |
| 38 | + sub_id = widget.awareness.observe(lambda topic, _: events.append(topic)) |
63 | 39 |
|
64 | | - widget.awareness.set_local_state({"ping": 1}) |
65 | | - assert events |
| 40 | + widget.awareness.set_local_state({"ping": 1}) |
| 41 | + assert events |
66 | 42 |
|
67 | | - widget.unobserve_awareness(sub_id) |
68 | | - events.clear() |
69 | | - widget.awareness.set_local_state({"ping": 2}) |
70 | | - assert events == [] |
| 43 | + widget.awareness.unobserve(sub_id) |
| 44 | + events.clear() |
| 45 | + widget.awareness.set_local_state({"ping": 2}) |
| 46 | + assert events == [] |
71 | 47 |
|
72 | 48 |
|
73 | 49 | async def test_remote_manager_applies_awareness_messages(synced_widgets, context): |
|
0 commit comments