Skip to content

Commit bd1883a

Browse files
test: add integration test for session state round-trip
This test verifies that session state can be extracted, serialized to JSON, deserialized, and restored with all fields intact. Related: #2111
1 parent 045462e commit bd1883a

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

tests/client/test_session.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,3 +829,74 @@ async def test_client_session_from_state():
829829
pass
830830

831831

832+
@pytest.mark.anyio
833+
async def test_client_session_state_roundtrip():
834+
"""Test that session state can be serialized and restored."""
835+
from mcp.shared.session_state import SessionState
836+
837+
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[SessionMessage](1)
838+
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[SessionMessage](1)
839+
840+
async def mock_server():
841+
session_message = await client_to_server_receive.receive()
842+
jsonrpc_request = session_message.message
843+
assert isinstance(jsonrpc_request, JSONRPCRequest)
844+
845+
result = InitializeResult(
846+
protocol_version=LATEST_PROTOCOL_VERSION,
847+
capabilities=ServerCapabilities(
848+
logging=None,
849+
resources=None,
850+
tools=None,
851+
experimental=None,
852+
prompts=None,
853+
),
854+
server_info=Implementation(name="mock-server", version="0.1.0"),
855+
)
856+
857+
async with server_to_client_send:
858+
await server_to_client_send.send(
859+
SessionMessage(
860+
JSONRPCResponse(
861+
jsonrpc="2.0",
862+
id=jsonrpc_request.id,
863+
result=result.model_dump(by_alias=True, mode="json", exclude_none=True),
864+
)
865+
)
866+
)
867+
await client_to_server_receive.receive()
868+
869+
async with (
870+
ClientSession(
871+
server_to_client_receive,
872+
client_to_server_send,
873+
) as original_session,
874+
anyio.create_task_group() as tg,
875+
client_to_server_send,
876+
client_to_server_receive,
877+
server_to_client_send,
878+
server_to_client_receive,
879+
):
880+
tg.start_soon(mock_server)
881+
882+
# Initialize the session
883+
await original_session.initialize()
884+
885+
# Extract state
886+
original_state = original_session.get_session_state()
887+
888+
# Verify it can be serialized to JSON
889+
json_str = original_state.model_dump_json()
890+
891+
# Verify it can be deserialized from JSON
892+
restored_state = SessionState.model_validate_json(json_str)
893+
894+
# Verify all fields match
895+
assert restored_state.session_id == original_state.session_id
896+
assert restored_state.protocol_version == original_state.protocol_version
897+
assert restored_state.next_request_id == original_state.next_request_id
898+
assert restored_state.server_capabilities == original_state.server_capabilities
899+
assert restored_state.server_info == original_state.server_info
900+
assert restored_state.initialized_sent == original_state.initialized_sent
901+
902+

0 commit comments

Comments
 (0)