wip(sync): use our async_live_server for websocket related PW tests

As now both http and ws are on the same domain, let's use one test server
able to serve both.

Co-authored-by: David Larlet <david@larlet.fr>
This commit is contained in:
Yohan Boniface 2025-01-20 18:55:42 +01:00
parent 1bf100d7a8
commit a07ee482ce
2 changed files with 29 additions and 38 deletions

View file

@ -3,6 +3,7 @@ import re
import pytest import pytest
from daphne.testing import DaphneProcess from daphne.testing import DaphneProcess
from django.contrib.staticfiles.handlers import ASGIStaticFilesHandler
from playwright.sync_api import expect from playwright.sync_api import expect
from umap.asgi import application from umap.asgi import application
@ -68,13 +69,11 @@ def login(new_page, settings, live_server):
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def asgi_live_server(request, settings): def asgi_live_server(request, live_server):
request.getfixturevalue("transactional_db") server = DaphneProcess("localhost", lambda: ASGIStaticFilesHandler(application))
server = DaphneProcess("localhost", lambda: application)
server.start() server.start()
server.ready.wait() server.ready.wait()
port = server.port.value port = server.port.value
settings.WEBSOCKET_FRONT_URI = f"ws://localhost:{port}/ws/sync/{{id}}/"
server.url = f"http://localhost:{port}" server.url = f"http://localhost:{port}"
yield server yield server

View file

@ -11,9 +11,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, asgi_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
map.save() map.save()
@ -21,9 +19,9 @@ def test_websocket_connection_can_sync_markers(
# Create two tabs # Create two tabs
peerA = new_page("Page A") peerA = new_page("Page A")
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = new_page("Page B") peerB = new_page("Page B")
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
a_marker_pane = peerA.locator(".leaflet-marker-pane > div") a_marker_pane = peerA.locator(".leaflet-marker-pane > div")
b_marker_pane = peerB.locator(".leaflet-marker-pane > div") b_marker_pane = peerB.locator(".leaflet-marker-pane > div")
@ -79,9 +77,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, asgi_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
map.save() map.save()
@ -89,9 +85,9 @@ def test_websocket_connection_can_sync_polygons(
# Create two tabs # Create two tabs
peerA = context.new_page() peerA = context.new_page()
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = context.new_page() peerB = context.new_page()
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
b_map_el = peerB.locator("#map") b_map_el = peerB.locator("#map")
@ -164,7 +160,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, asgi_live_server, tilelayer new_page, 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
@ -173,9 +169,9 @@ def test_websocket_connection_can_sync_map_properties(
# Create two tabs # Create two tabs
peerA = new_page() peerA = new_page()
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = new_page() peerB = new_page()
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
# Name change is synced # Name change is synced
peerA.get_by_role("link", name="Edit map name and caption").click() peerA.get_by_role("link", name="Edit map name and caption").click()
@ -198,7 +194,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, asgi_live_server, tilelayer new_page, 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
@ -207,9 +203,9 @@ def test_websocket_connection_can_sync_datalayer_properties(
# Create two tabs # Create two tabs
peerA = new_page() peerA = new_page()
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = new_page() peerB = new_page()
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
# Layer addition, name and type are synced # Layer addition, name and type are synced
peerA.get_by_role("link", name="Manage layers").click() peerA.get_by_role("link", name="Manage layers").click()
@ -227,7 +223,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, asgi_live_server, tilelayer context, 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
@ -236,9 +232,9 @@ def test_websocket_connection_can_sync_cloned_polygons(
# Create two tabs # Create two tabs
peerA = context.new_page() peerA = context.new_page()
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = context.new_page() peerB = context.new_page()
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
b_map_el = peerB.locator("#map") b_map_el = peerB.locator("#map")
@ -290,7 +286,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, asgi_live_server, tilelayer new_page, 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
@ -299,7 +295,7 @@ def test_websocket_connection_can_sync_late_joining_peer(
# Create first peer (A) and have it join immediately # Create first peer (A) and have it join immediately
peerA = new_page("Page A") peerA = new_page("Page A")
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
# Add a marker from peer A # Add a marker from peer A
a_create_marker = peerA.get_by_title("Draw a marker") a_create_marker = peerA.get_by_title("Draw a marker")
@ -326,7 +322,7 @@ def test_websocket_connection_can_sync_late_joining_peer(
# Now create peer B and have it join # Now create peer B and have it join
peerB = new_page("Page B") peerB = new_page("Page B")
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
# Check if peer B has received all the updates # Check if peer B has received all the updates
b_marker_pane = peerB.locator(".leaflet-marker-pane > div") b_marker_pane = peerB.locator(".leaflet-marker-pane > div")
@ -351,7 +347,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, asgi_live_server, tilelayer): def test_should_sync_datalayers(new_page, 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()
@ -360,9 +356,9 @@ def test_should_sync_datalayers(new_page, live_server, asgi_live_server, tilelay
# Create two tabs # Create two tabs
peerA = new_page("Page A") peerA = new_page("Page A")
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = new_page("Page B") peerB = new_page("Page B")
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
# Create a new layer from peerA # Create a new layer from peerA
peerA.get_by_role("link", name="Manage layers").click() peerA.get_by_role("link", name="Manage layers").click()
@ -423,9 +419,7 @@ def test_should_sync_datalayers(new_page, live_server, asgi_live_server, tilelay
@pytest.mark.xdist_group(name="websockets") @pytest.mark.xdist_group(name="websockets")
def test_should_sync_datalayers_delete( def test_should_sync_datalayers_delete(new_page, asgi_live_server, tilelayer):
new_page, live_server, websocket_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()
@ -464,9 +458,9 @@ def test_should_sync_datalayers_delete(
# Create two tabs # Create two tabs
peerA = new_page("Page A") peerA = new_page("Page A")
peerA.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerA.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerB = new_page("Page B") peerB = new_page("Page B")
peerB.goto(f"{live_server.url}{map.get_absolute_url()}?edit") peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit")
peerA.get_by_role("button", name="Open browser").click() peerA.get_by_role("button", name="Open browser").click()
expect(peerA.get_by_text("datalayer 1")).to_be_visible() expect(peerA.get_by_text("datalayer 1")).to_be_visible()
@ -489,12 +483,10 @@ 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, asgi_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")
peerA.goto(f"{live_server.url}/en/map/new/") peerA.goto(f"{asgi_live_server.url}/en/map/new/")
with peerA.expect_response(re.compile("./map/create/.*")): with peerA.expect_response(re.compile("./map/create/.*")):
peerA.get_by_role("button", name="Save Draft").click() peerA.get_by_role("button", name="Save Draft").click()
peerA.get_by_role("link", name="Map advanced properties").click() peerA.get_by_role("link", name="Map advanced properties").click()