From 2d10ac9e8626a8273e04300b9c1cf1c86dfbcad8 Mon Sep 17 00:00:00 2001 From: Coco Sheng Date: Wed, 20 May 2026 13:09:35 -0400 Subject: [PATCH] test(core): fix mcp-client test failure and add compliance transport tests --- packages/core/src/tools/mcp-client.test.ts | 2 +- .../tools/mcp-compliance-transport.test.ts | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/packages/core/src/tools/mcp-client.test.ts b/packages/core/src/tools/mcp-client.test.ts index 0ed7c68ac9..4aa9bef289 100644 --- a/packages/core/src/tools/mcp-client.test.ts +++ b/packages/core/src/tools/mcp-client.test.ts @@ -2213,7 +2213,7 @@ describe('mcp-client', () => { // For SSEClientTransport, the fetch is private or passed to the SDK. // We can check if it creates the transport successfully. - expect(transport).toBeInstanceOf(SSEClientTransport); + expect(unwrap(transport)).toBeInstanceOf(SSEClientTransport); } finally { vi.unstubAllEnvs(); vi.unstubAllGlobals(); diff --git a/packages/core/src/tools/mcp-compliance-transport.test.ts b/packages/core/src/tools/mcp-compliance-transport.test.ts index 3cfe86de2a..3217b4461c 100644 --- a/packages/core/src/tools/mcp-compliance-transport.test.ts +++ b/packages/core/src/tools/mcp-compliance-transport.test.ts @@ -128,4 +128,70 @@ describe('McpComplianceTransport', () => { mockTransport.onmessage!(emptyResponse); expect(onMessage.mock.calls[0][0].result.structuredContent).toBeUndefined(); }); + + it('should only parse text content blocks', async () => { + const mockTransport = createMockTransport(); + const complianceTransport = new McpComplianceTransport(mockTransport); + const onMessage = vi.fn(); + complianceTransport.onmessage = onMessage; + + const mediaResponse: JSONRPCMessage = { + jsonrpc: '2.0', + id: 1, + result: { + content: [ + { + type: 'image', + data: 'base64data', + mimeType: 'image/png', + }, + ], + }, + }; + + mockTransport.onmessage!(mediaResponse); + expect(onMessage.mock.calls[0][0].result.structuredContent).toBeUndefined(); + }); + + it('should handle responses with multiple content blocks (only fixes the first one if it is text)', async () => { + const mockTransport = createMockTransport(); + const complianceTransport = new McpComplianceTransport(mockTransport); + const onMessage = vi.fn(); + complianceTransport.onmessage = onMessage; + + const multiResponse: JSONRPCMessage = { + jsonrpc: '2.0', + id: 1, + result: { + content: [ + { type: 'text', text: JSON.stringify({ first: true }) }, + { type: 'text', text: 'second item' }, + ], + }, + }; + + mockTransport.onmessage!(multiResponse); + expect(onMessage.mock.calls[0][0].result.structuredContent).toEqual({ + first: true, + }); + }); + + it('should handle error responses gracefully', async () => { + const mockTransport = createMockTransport(); + const complianceTransport = new McpComplianceTransport(mockTransport); + const onMessage = vi.fn(); + complianceTransport.onmessage = onMessage; + + const errorResponse: JSONRPCMessage = { + jsonrpc: '2.0', + id: 1, + error: { + code: -32000, + message: 'Internal error', + }, + }; + + mockTransport.onmessage!(errorResponse); + expect(onMessage).toHaveBeenCalledWith(errorResponse); + }); });