def _project_and_conversation(logged_in): client, _, projects, _, headers = logged_in repo = projects / "socket-repo" repo.mkdir() project = client.post("/api/projects", headers=headers, json={"name": "socket", "path": str(repo)}).json() conversation = client.post(f"/api/projects/{project['id']}/conversations", headers=headers, json={"title": "Diagnostic"}).json() return client, conversation def test_conversation_websocket_restores_state(logged_in): client, conversation = _project_and_conversation(logged_in) with client.websocket_connect(f"/ws/conversations/{conversation['id']}", headers={"origin": "http://testserver"}) as socket: event = socket.receive_json() assert event["type"] == "state" assert event["conversation"]["title"] == "Diagnostic" def test_websocket_rejects_unknown_conversation(logged_in): client, *_ = logged_in try: with client.websocket_connect("/ws/conversations/00000000-0000-0000-0000-000000000000", headers={"origin": "http://testserver"}): assert False, "connection should be rejected" except Exception: pass def test_websocket_requires_authentication(app_env): client, *_ = app_env with pytest.raises(WebSocketDisconnect): with client.websocket_connect("/ws/conversations/00000000-0000-0000-0000-000000000000", headers={"origin": "http://testserver"}): pass import pytest from starlette.websockets import WebSocketDisconnect