Skip to content

Commit 3126a81

Browse files
Fix tests (jupyterlab#404)
* Fix tests * Lint * Types * Ignore sqlite warning
1 parent 3f9b0db commit 3126a81

File tree

6 files changed

+73
-33
lines changed

6 files changed

+73
-33
lines changed

projects/jupyter-server-ydoc/jupyter_server_ydoc/pytest_plugin.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,19 @@
99

1010
import nbformat
1111
import pytest
12+
from httpx_ws import aconnect_ws
1213
from jupyter_server_ydoc.loaders import FileLoader
1314
from jupyter_server_ydoc.rooms import DocumentRoom
1415
from jupyter_server_ydoc.stores import SQLiteYStore
1516
from jupyter_ydoc import YNotebook, YUnicode
1617
from pycrdt_websocket import WebsocketProvider
17-
from websockets import connect
1818

19-
from .test_utils import FakeContentsManager, FakeEventLogger, FakeFileIDManager
19+
from .test_utils import (
20+
FakeContentsManager,
21+
FakeEventLogger,
22+
FakeFileIDManager,
23+
Websocket,
24+
)
2025

2126

2227
@pytest.fixture
@@ -126,8 +131,8 @@ def _inner(format: str, type: str, path: str) -> Any:
126131
@pytest.fixture
127132
def rtc_connect_awareness_client(jp_http_port, jp_base_url):
128133
async def _inner(room_id: str) -> Any:
129-
return connect(
130-
f"ws://127.0.0.1:{jp_http_port}{jp_base_url}api/collaboration/room/{room_id}"
134+
return aconnect_ws(
135+
f"http://127.0.0.1:{jp_http_port}{jp_base_url}api/collaboration/room/{room_id}"
131136
)
132137

133138
return _inner
@@ -138,8 +143,12 @@ def rtc_connect_doc_client(jp_http_port, jp_base_url, rtc_fetch_session):
138143
async def _inner(format: str, type: str, path: str) -> Any:
139144
resp = await rtc_fetch_session(format, type, path)
140145
data = json.loads(resp.body.decode("utf-8"))
141-
return connect(
142-
f"ws://127.0.0.1:{jp_http_port}{jp_base_url}api/collaboration/room/{data['format']}:{data['type']}:{data['fileId']}?sessionId={data['sessionId']}"
146+
room_name = f"{data['format']}:{data['type']}:{data['fileId']}"
147+
return (
148+
aconnect_ws(
149+
f"http://127.0.0.1:{jp_http_port}{jp_base_url}api/collaboration/room/{room_name}?sessionId={data['sessionId']}"
150+
),
151+
room_name,
143152
)
144153

145154
return _inner
@@ -162,9 +171,8 @@ def _on_document_change(target: str, e: Any) -> None:
162171

163172
doc.observe(_on_document_change)
164173

165-
async with await rtc_connect_doc_client(format, type, path) as ws, WebsocketProvider(
166-
doc.ydoc, ws
167-
):
174+
websocket, room_name = await rtc_connect_doc_client(format, type, path)
175+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
168176
await event.wait()
169177
await sleep(0.1)
170178

projects/jupyter-server-ydoc/jupyter_server_ydoc/test_utils.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from datetime import datetime
77
from typing import Any
88

9+
from anyio import Lock
910
from jupyter_server import _tz as tz
1011

1112

@@ -55,3 +56,32 @@ def save_content(self, model: dict[str, Any], path: str) -> dict:
5556
class FakeEventLogger:
5657
def emit(self, schema_id: str, data: dict) -> None:
5758
print(data)
59+
60+
61+
class Websocket:
62+
def __init__(self, websocket: Any, path: str):
63+
self._websocket = websocket
64+
self._path = path
65+
self._send_lock = Lock()
66+
67+
@property
68+
def path(self) -> str:
69+
return self._path
70+
71+
def __aiter__(self):
72+
return self
73+
74+
async def __anext__(self) -> bytes:
75+
try:
76+
message = await self.recv()
77+
except Exception:
78+
raise StopAsyncIteration()
79+
return message
80+
81+
async def send(self, message: bytes) -> None:
82+
async with self._send_lock:
83+
await self._websocket.send_bytes(message)
84+
85+
async def recv(self) -> bytes:
86+
b = await self._websocket.receive_bytes()
87+
return bytes(b)

projects/jupyter-server-ydoc/pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ test = [
4545
"jupyter_server_fileid[test]",
4646
"pytest>=7.0",
4747
"pytest-cov",
48-
"websockets",
48+
"anyio",
49+
"httpx-ws >=0.5.2",
4950
"importlib_metadata >=4.8.3; python_version<'3.10'",
5051
]
5152

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ filterwarnings = [
106106
"ignore:.*datetime.utcfromtimestamp\\(\\) is deprecated.*:DeprecationWarning:",
107107
# From anyio https://github.com/agronholm/anyio/pull/715
108108
'ignore:Unclosed <MemoryObjectSendStream:ResourceWarning',
109+
# see https://github.com/python/cpython/issues/126259
110+
'ignore:unclosed database in <sqlite3.Connection object',
109111
]
110112

111113
[tool.mypy]

tests/test_documents.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import pytest
1313
from anyio import create_task_group, sleep
14+
from jupyter_server_ydoc.test_utils import Websocket
1415
from pycrdt_websocket import WebsocketProvider
1516

1617
jupyter_ydocs = {ep.name: ep.load() for ep in entry_points(group="jupyter_ydoc")}
@@ -32,12 +33,12 @@ async def test_dirty(
3233
await rtc_create_file(file_path)
3334
jupyter_ydoc = jupyter_ydocs[file_type]()
3435

35-
async with await rtc_connect_doc_client(file_format, file_type, file_path) as ws:
36-
async with WebsocketProvider(jupyter_ydoc.ydoc, ws):
37-
for _ in range(2):
38-
jupyter_ydoc.dirty = True
39-
await sleep(rtc_document_save_delay * 1.5)
40-
assert not jupyter_ydoc.dirty
36+
websocket, room_name = await rtc_connect_doc_client(file_format, file_type, file_path)
37+
async with websocket as ws, WebsocketProvider(jupyter_ydoc.ydoc, Websocket(ws, room_name)):
38+
for _ in range(2):
39+
jupyter_ydoc.dirty = True
40+
await sleep(rtc_document_save_delay * 1.5)
41+
assert not jupyter_ydoc.dirty
4142

4243

4344
async def cleanup(jp_serverapp):
@@ -59,7 +60,8 @@ async def test_room_concurrent_initialization(
5960
await rtc_create_file(file_path)
6061

6162
async def connect(file_format, file_type, file_path):
62-
async with await rtc_connect_doc_client(file_format, file_type, file_path) as ws:
63+
websocket, room_name = await rtc_connect_doc_client(file_format, file_type, file_path)
64+
async with websocket as ws:
6365
pass
6466

6567
t0 = time()
@@ -84,7 +86,8 @@ async def test_room_sequential_opening(
8486

8587
async def connect(file_format, file_type, file_path):
8688
t0 = time()
87-
async with await rtc_connect_doc_client(file_format, file_type, file_path) as ws:
89+
websocket, room_name = await rtc_connect_doc_client(file_format, file_type, file_path)
90+
async with websocket as ws:
8891
pass
8992
t1 = time()
9093
return t1 - t0

tests/test_handlers.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from typing import Any
99

1010
from jupyter_events.logger import EventLogger
11+
from jupyter_server_ydoc.test_utils import Websocket
1112
from jupyter_ydoc import YUnicode
1213
from pycrdt_websocket import WebsocketProvider
1314

@@ -77,9 +78,8 @@ def _on_document_change(target: str, e: Any) -> None:
7778
doc = YUnicode()
7879
doc.observe(_on_document_change)
7980

80-
async with await rtc_connect_doc_client("text", "file", path) as ws, WebsocketProvider(
81-
doc.ydoc, ws
82-
):
81+
websocket, room_name = await rtc_connect_doc_client("text", "file", path)
82+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
8383
await event.wait()
8484
await sleep(0.1)
8585

@@ -114,9 +114,8 @@ async def my_listener(logger: EventLogger, schema_id: str, data: dict) -> None:
114114
listener=my_listener,
115115
)
116116

117-
async with await rtc_connect_doc_client("text", "file", path) as ws, WebsocketProvider(
118-
doc.ydoc, ws
119-
):
117+
websocket, room_name = await rtc_connect_doc_client("text", "file", path)
118+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
120119
await event.wait()
121120
await sleep(0.1)
122121

@@ -147,9 +146,8 @@ def _on_document_change(target: str, e: Any) -> None:
147146
doc = YUnicode()
148147
doc.observe(_on_document_change)
149148

150-
async with await rtc_connect_doc_client("text", "file", path) as ws, WebsocketProvider(
151-
doc.ydoc, ws
152-
):
149+
websocket, room_name = await rtc_connect_doc_client("text", "file", path)
150+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
153151
await event.wait()
154152
await sleep(0.1)
155153

@@ -173,18 +171,16 @@ async def my_listener(logger: EventLogger, schema_id: str, data: dict) -> None:
173171
path2, _ = await rtc_create_file("test2.txt", "test2")
174172

175173
try:
176-
async with await rtc_connect_doc_client("text2", "file2", path2) as ws, WebsocketProvider(
177-
doc.ydoc, ws
178-
):
174+
websocket, room_name = await rtc_connect_doc_client("text2", "file2", path2)
175+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
179176
await event.wait()
180177
await sleep(0.1)
181178
except Exception:
182179
pass
183180

184181
try:
185-
async with await rtc_connect_doc_client("text2", "file2", path2) as ws, WebsocketProvider(
186-
doc.ydoc, ws
187-
):
182+
websocket, room_name = await rtc_connect_doc_client("text2", "file2", path2)
183+
async with websocket as ws, WebsocketProvider(doc.ydoc, Websocket(ws, room_name)):
188184
await event.wait()
189185
await sleep(0.1)
190186
except Exception:

0 commit comments

Comments
 (0)