Skip to content

Commit 9da6b5f

Browse files
committed
Add tests covering session_id extraction from InitializeResult._meta
Lines 215-217 (meta session_id extraction) and 239 (session_id property) in client/session.py were uncovered. Two new tests exercise these paths: one where _meta contains a string session_id and one where it contains a non-string value (integer), verifying the isinstance guard.
1 parent 1b08567 commit 9da6b5f

1 file changed

Lines changed: 107 additions & 0 deletions

File tree

tests/client/test_session.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,3 +768,110 @@ async def mock_server():
768768
await session.initialize()
769769

770770
await session.call_tool(name=mocked_tool.name, arguments={"foo": "bar"}, meta=meta)
771+
772+
773+
@pytest.mark.anyio
774+
async def test_session_id_extracted_from_meta():
775+
"""session_id is set when InitializeResult._meta contains a string session_id."""
776+
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[SessionMessage](1)
777+
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[SessionMessage](1)
778+
779+
async def mock_server():
780+
session_message = await client_to_server_receive.receive()
781+
jsonrpc_request = session_message.message
782+
assert isinstance(jsonrpc_request.root, JSONRPCRequest)
783+
784+
result = ServerResult(
785+
InitializeResult(
786+
protocolVersion=LATEST_PROTOCOL_VERSION,
787+
capabilities=ServerCapabilities(),
788+
serverInfo=Implementation(name="mock-server", version="0.1.0"),
789+
)
790+
)
791+
result_dict = result.model_dump(by_alias=True, mode="json", exclude_none=True)
792+
# Inject session_id into _meta as a FastMCP server would
793+
result_dict["_meta"] = {"session_id": "test-session-abc"}
794+
795+
async with server_to_client_send:
796+
await server_to_client_send.send(
797+
SessionMessage(
798+
JSONRPCMessage(
799+
JSONRPCResponse(
800+
jsonrpc="2.0",
801+
id=jsonrpc_request.root.id,
802+
result=result_dict,
803+
)
804+
)
805+
)
806+
)
807+
await client_to_server_receive.receive()
808+
809+
async with (
810+
ClientSession(
811+
server_to_client_receive,
812+
client_to_server_send,
813+
) as session,
814+
anyio.create_task_group() as tg,
815+
client_to_server_send,
816+
client_to_server_receive,
817+
server_to_client_send,
818+
server_to_client_receive,
819+
):
820+
assert session.session_id is None
821+
tg.start_soon(mock_server)
822+
await session.initialize()
823+
824+
assert session.session_id == "test-session-abc"
825+
826+
827+
@pytest.mark.anyio
828+
async def test_session_id_not_set_when_meta_has_non_string_value():
829+
"""session_id stays None when _meta is present but session_id is not a string."""
830+
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[SessionMessage](1)
831+
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[SessionMessage](1)
832+
833+
async def mock_server():
834+
session_message = await client_to_server_receive.receive()
835+
jsonrpc_request = session_message.message
836+
assert isinstance(jsonrpc_request.root, JSONRPCRequest)
837+
838+
result = ServerResult(
839+
InitializeResult(
840+
protocolVersion=LATEST_PROTOCOL_VERSION,
841+
capabilities=ServerCapabilities(),
842+
serverInfo=Implementation(name="mock-server", version="0.1.0"),
843+
)
844+
)
845+
result_dict = result.model_dump(by_alias=True, mode="json", exclude_none=True)
846+
# _meta present but session_id is an integer, not a string
847+
result_dict["_meta"] = {"session_id": 42}
848+
849+
async with server_to_client_send:
850+
await server_to_client_send.send(
851+
SessionMessage(
852+
JSONRPCMessage(
853+
JSONRPCResponse(
854+
jsonrpc="2.0",
855+
id=jsonrpc_request.root.id,
856+
result=result_dict,
857+
)
858+
)
859+
)
860+
)
861+
await client_to_server_receive.receive()
862+
863+
async with (
864+
ClientSession(
865+
server_to_client_receive,
866+
client_to_server_send,
867+
) as session,
868+
anyio.create_task_group() as tg,
869+
client_to_server_send,
870+
client_to_server_receive,
871+
server_to_client_send,
872+
server_to_client_receive,
873+
):
874+
tg.start_soon(mock_server)
875+
await session.initialize()
876+
877+
assert session.session_id is None

0 commit comments

Comments
 (0)