@@ -2,6 +2,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
22import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' ;
33import { mock } from 'jest-mock-extended' ;
44import {
5+ NodeConnectionTypes ,
56 NodeOperationError ,
67 type ILoadOptionsFunctions ,
78 type INode ,
@@ -284,5 +285,78 @@ describe('McpClientTool', () => {
284285 headers : { Accept : 'text/event-stream' , Authorization : 'Bearer my-token' } ,
285286 } ) ;
286287 } ) ;
288+
289+ it ( 'should successfully execute a tool' , async ( ) => {
290+ jest . spyOn ( Client . prototype , 'connect' ) . mockResolvedValue ( ) ;
291+ jest . spyOn ( Client . prototype , 'callTool' ) . mockResolvedValue ( { content : 'Sunny' } ) ;
292+ jest . spyOn ( Client . prototype , 'listTools' ) . mockResolvedValue ( {
293+ tools : [
294+ {
295+ name : 'Weather Tool' ,
296+ description : 'Gets the current weather' ,
297+ inputSchema : { type : 'object' , properties : { location : { type : 'string' } } } ,
298+ } ,
299+ ] ,
300+ } ) ;
301+
302+ const supplyDataResult = await new McpClientTool ( ) . supplyData . call (
303+ mock < ISupplyDataFunctions > ( {
304+ getNode : jest . fn ( ( ) =>
305+ mock < INode > ( {
306+ typeVersion : 1 ,
307+ } ) ,
308+ ) ,
309+ logger : { debug : jest . fn ( ) , error : jest . fn ( ) } ,
310+ addInputData : jest . fn ( ( ) => ( { index : 0 } ) ) ,
311+ } ) ,
312+ 0 ,
313+ ) ;
314+
315+ expect ( supplyDataResult . closeFunction ) . toBeInstanceOf ( Function ) ;
316+ expect ( supplyDataResult . response ) . toBeInstanceOf ( McpToolkit ) ;
317+
318+ const tools = ( supplyDataResult . response as McpToolkit ) . getTools ( ) ;
319+ const toolResult = await tools [ 0 ] . invoke ( { location : 'Berlin' } ) ;
320+ expect ( toolResult ) . toEqual ( 'Sunny' ) ;
321+ } ) ;
322+
323+ it ( 'should handle tool errors' , async ( ) => {
324+ jest . spyOn ( Client . prototype , 'connect' ) . mockResolvedValue ( ) ;
325+ jest
326+ . spyOn ( Client . prototype , 'callTool' )
327+ . mockResolvedValue ( { isError : true , content : [ { text : 'Weather unknown at location' } ] } ) ;
328+ jest . spyOn ( Client . prototype , 'listTools' ) . mockResolvedValue ( {
329+ tools : [
330+ {
331+ name : 'Weather Tool' ,
332+ description : 'Gets the current weather' ,
333+ inputSchema : { type : 'object' , properties : { location : { type : 'string' } } } ,
334+ } ,
335+ ] ,
336+ } ) ;
337+
338+ const supplyDataFunctions = mock < ISupplyDataFunctions > ( {
339+ getNode : jest . fn ( ( ) =>
340+ mock < INode > ( {
341+ typeVersion : 1 ,
342+ } ) ,
343+ ) ,
344+ logger : { debug : jest . fn ( ) , error : jest . fn ( ) } ,
345+ addInputData : jest . fn ( ( ) => ( { index : 0 } ) ) ,
346+ } ) ;
347+ const supplyDataResult = await new McpClientTool ( ) . supplyData . call ( supplyDataFunctions , 0 ) ;
348+
349+ expect ( supplyDataResult . closeFunction ) . toBeInstanceOf ( Function ) ;
350+ expect ( supplyDataResult . response ) . toBeInstanceOf ( McpToolkit ) ;
351+
352+ const tools = ( supplyDataResult . response as McpToolkit ) . getTools ( ) ;
353+ const toolResult = await tools [ 0 ] . invoke ( { location : 'Berlin' } ) ;
354+ expect ( toolResult ) . toEqual ( 'Weather unknown at location' ) ;
355+ expect ( supplyDataFunctions . addOutputData ) . toHaveBeenCalledWith (
356+ NodeConnectionTypes . AiTool ,
357+ 0 ,
358+ new NodeOperationError ( supplyDataFunctions . getNode ( ) , 'Weather unknown at location' ) ,
359+ ) ;
360+ } ) ;
287361 } ) ;
288362} ) ;
0 commit comments