wip(sync): use Daphne as live_server for tests

Also clean dependencies.

We still use the channels live server for our tests, but do not use it
anymore for the actual websocket handling.
This commit is contained in:
Yohan Boniface 2025-01-03 10:56:28 +01:00
parent 460a0c9997
commit ab7119e0a4
3 changed files with 22 additions and 43 deletions

View file

@ -54,6 +54,7 @@ dev = [
"isort==5.13.2", "isort==5.13.2",
] ]
test = [ test = [
"daphne==4.1.2",
"factory-boy==3.3.1", "factory-boy==3.3.1",
"playwright>=1.39", "playwright>=1.39",
"pytest==8.3.4", "pytest==8.3.4",
@ -70,10 +71,7 @@ s3 = [
"django-storages[s3]==1.14.4", "django-storages[s3]==1.14.4",
] ]
sync = [ sync = [
"channels==4.2.0",
"daphne==4.1.2",
"pydantic==2.10.5", "pydantic==2.10.5",
"websockets==13.1",
] ]
[project.scripts] [project.scripts]

View file

@ -1,13 +1,12 @@
import os import os
import re import re
import subprocess
import time
from pathlib import Path
import pytest import pytest
from channels.testing import ChannelsLiveServerTestCase from daphne.testing import DaphneProcess
from playwright.sync_api import expect from playwright.sync_api import expect
from umap.asgi import application
from ..base import mock_tiles from ..base import mock_tiles
@ -68,35 +67,17 @@ def login(new_page, settings, live_server):
return do_login return do_login
@pytest.fixture
def websocket_server():
# Find the test-settings, and put them in the current environment
settings_path = (Path(__file__).parent.parent / "settings.py").absolute().as_posix()
os.environ["UMAP_SETTINGS"] = settings_path
ds_proc = subprocess.Popen(
[
"umap",
"run_websocket_server",
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
time.sleep(2)
# Ensure it started properly before yielding
assert not ds_proc.poll(), ds_proc.stdout.read().decode("utf-8")
yield ds_proc
# Shut it down at the end of the pytest session
ds_proc.terminate()
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def channels_live_server(request, settings): def asgi_live_server(request, settings):
server = ChannelsLiveServerTestCase() request.getfixturevalue("transactional_db")
server.serve_static = False server = DaphneProcess("localhost", lambda: application)
server._pre_setup() server.start()
settings.WEBSOCKET_FRONT_URI = f"{server.live_server_ws_url}/ws/sync/{{id}}/" server.ready.wait()
port = server.port.value
settings.WEBSOCKET_FRONT_URI = f"ws://localhost:{port}/ws/sync/{{id}}/"
server.url = f"http://localhost:{port}"
yield server yield server
server._post_teardown() server.terminate()
server.join()

View file

@ -12,7 +12,7 @@ DATALAYER_UPDATE = re.compile(r".*/datalayer/update/.*")
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_markers( def test_websocket_connection_can_sync_markers(
new_page, live_server, channels_live_server, tilelayer new_page, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -80,7 +80,7 @@ def test_websocket_connection_can_sync_markers(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_polygons( def test_websocket_connection_can_sync_polygons(
context, live_server, channels_live_server, tilelayer context, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -164,7 +164,7 @@ def test_websocket_connection_can_sync_polygons(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_map_properties( def test_websocket_connection_can_sync_map_properties(
new_page, live_server, channels_live_server, tilelayer new_page, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -198,7 +198,7 @@ def test_websocket_connection_can_sync_map_properties(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_datalayer_properties( def test_websocket_connection_can_sync_datalayer_properties(
new_page, live_server, channels_live_server, tilelayer new_page, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -227,7 +227,7 @@ def test_websocket_connection_can_sync_datalayer_properties(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_cloned_polygons( def test_websocket_connection_can_sync_cloned_polygons(
context, live_server, channels_live_server, tilelayer context, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -290,7 +290,7 @@ def test_websocket_connection_can_sync_cloned_polygons(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_websocket_connection_can_sync_late_joining_peer( def test_websocket_connection_can_sync_late_joining_peer(
new_page, live_server, channels_live_server, tilelayer new_page, live_server, asgi_live_server, tilelayer
): ):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
@ -351,7 +351,7 @@ def test_websocket_connection_can_sync_late_joining_peer(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_should_sync_datalayers(new_page, live_server, channels_live_server, tilelayer): def test_should_sync_datalayers(new_page, live_server, asgi_live_server, tilelayer):
map = MapFactory(name="sync", edit_status=Map.ANONYMOUS) map = MapFactory(name="sync", edit_status=Map.ANONYMOUS)
map.settings["properties"]["syncEnabled"] = True map.settings["properties"]["syncEnabled"] = True
map.save() map.save()
@ -490,7 +490,7 @@ def test_should_sync_datalayers_delete(
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_create_and_sync_map( def test_create_and_sync_map(
new_page, live_server, channels_live_server, tilelayer, login, user new_page, live_server, asgi_live_server, tilelayer, login, user
): ):
# Create a syncable map with peerA # Create a syncable map with peerA
peerA = login(user, prefix="Page A") peerA = login(user, prefix="Page A")