@@ -3,8 +3,23 @@ package toolsets
33import (
44 "errors"
55 "testing"
6+
7+ "github.com/modelcontextprotocol/go-sdk/mcp"
68)
79
10+ // mockTool creates a minimal ServerTool for testing
11+ func mockTool (name string , readOnly bool ) ServerTool {
12+ return ServerTool {
13+ Tool : mcp.Tool {
14+ Name : name ,
15+ Annotations : & mcp.ToolAnnotations {
16+ ReadOnlyHint : readOnly ,
17+ },
18+ },
19+ RegisterFunc : func (_ * mcp.Server ) {},
20+ }
21+ }
22+
823func TestNewToolsetGroupIsEmptyWithoutEverythingOn (t * testing.T ) {
924 tsg := NewToolsetGroup (false )
1025 if len (tsg .Toolsets ) != 0 {
@@ -262,3 +277,119 @@ func TestToolsetGroup_GetToolset(t *testing.T) {
262277 t .Errorf ("expected error to be ToolsetDoesNotExistError, got %v" , err )
263278 }
264279}
280+
281+ func TestAddDeprecatedToolAliases (t * testing.T ) {
282+ tsg := NewToolsetGroup (false )
283+
284+ // Test adding aliases
285+ tsg .AddDeprecatedToolAliases (map [string ]string {
286+ "old_name" : "new_name" ,
287+ "get_issue" : "issue_read" ,
288+ "create_pr" : "pull_request_create" ,
289+ })
290+
291+ if len (tsg .deprecatedAliases ) != 3 {
292+ t .Errorf ("expected 3 aliases, got %d" , len (tsg .deprecatedAliases ))
293+ }
294+ if tsg .deprecatedAliases ["old_name" ] != "new_name" {
295+ t .Errorf ("expected alias 'old_name' -> 'new_name', got '%s'" , tsg .deprecatedAliases ["old_name" ])
296+ }
297+ if tsg .deprecatedAliases ["get_issue" ] != "issue_read" {
298+ t .Errorf ("expected alias 'get_issue' -> 'issue_read'" )
299+ }
300+ if tsg .deprecatedAliases ["create_pr" ] != "pull_request_create" {
301+ t .Errorf ("expected alias 'create_pr' -> 'pull_request_create'" )
302+ }
303+ }
304+
305+ func TestResolveToolAliases (t * testing.T ) {
306+ tsg := NewToolsetGroup (false )
307+ tsg .AddDeprecatedToolAliases (map [string ]string {
308+ "get_issue" : "issue_read" ,
309+ "create_pr" : "pull_request_create" ,
310+ })
311+
312+ // Test resolving a mix of aliases and canonical names
313+ input := []string {"get_issue" , "some_tool" , "create_pr" }
314+ resolved , aliasesUsed := tsg .ResolveToolAliases (input )
315+
316+ // Verify resolved names
317+ if len (resolved ) != 3 {
318+ t .Fatalf ("expected 3 resolved names, got %d" , len (resolved ))
319+ }
320+ if resolved [0 ] != "issue_read" {
321+ t .Errorf ("expected 'issue_read', got '%s'" , resolved [0 ])
322+ }
323+ if resolved [1 ] != "some_tool" {
324+ t .Errorf ("expected 'some_tool' (unchanged), got '%s'" , resolved [1 ])
325+ }
326+ if resolved [2 ] != "pull_request_create" {
327+ t .Errorf ("expected 'pull_request_create', got '%s'" , resolved [2 ])
328+ }
329+
330+ // Verify aliasesUsed map
331+ if len (aliasesUsed ) != 2 {
332+ t .Fatalf ("expected 2 aliases used, got %d" , len (aliasesUsed ))
333+ }
334+ if aliasesUsed ["get_issue" ] != "issue_read" {
335+ t .Errorf ("expected aliasesUsed['get_issue'] = 'issue_read', got '%s'" , aliasesUsed ["get_issue" ])
336+ }
337+ if aliasesUsed ["create_pr" ] != "pull_request_create" {
338+ t .Errorf ("expected aliasesUsed['create_pr'] = 'pull_request_create', got '%s'" , aliasesUsed ["create_pr" ])
339+ }
340+ }
341+
342+ func TestFindToolByName (t * testing.T ) {
343+ tsg := NewToolsetGroup (false )
344+
345+ // Create a toolset with a tool
346+ toolset := NewToolset ("test-toolset" , "Test toolset" )
347+ toolset .readTools = append (toolset .readTools , mockTool ("issue_read" , true ))
348+ tsg .AddToolset (toolset )
349+
350+ // Find by canonical name
351+ tool , toolsetName , err := tsg .FindToolByName ("issue_read" )
352+ if err != nil {
353+ t .Fatalf ("expected no error, got %v" , err )
354+ }
355+ if tool .Tool .Name != "issue_read" {
356+ t .Errorf ("expected tool name 'issue_read', got '%s'" , tool .Tool .Name )
357+ }
358+ if toolsetName != "test-toolset" {
359+ t .Errorf ("expected toolset name 'test-toolset', got '%s'" , toolsetName )
360+ }
361+
362+ // FindToolByName does NOT resolve aliases - it expects canonical names
363+ _ , _ , err = tsg .FindToolByName ("get_issue" )
364+ if err == nil {
365+ t .Error ("expected error when using alias directly with FindToolByName" )
366+ }
367+ }
368+
369+ func TestRegisterSpecificTools (t * testing.T ) {
370+ tsg := NewToolsetGroup (false )
371+
372+ // Create a toolset with both read and write tools
373+ toolset := NewToolset ("test-toolset" , "Test toolset" )
374+ toolset .readTools = append (toolset .readTools , mockTool ("issue_read" , true ))
375+ toolset .writeTools = append (toolset .writeTools , mockTool ("issue_write" , false ))
376+ tsg .AddToolset (toolset )
377+
378+ // Test registering with canonical names
379+ err := tsg .RegisterSpecificTools (nil , []string {"issue_read" }, false )
380+ if err != nil {
381+ t .Errorf ("expected no error registering tool, got %v" , err )
382+ }
383+
384+ // Test registering write tool in read-only mode (should skip but not error)
385+ err = tsg .RegisterSpecificTools (nil , []string {"issue_write" }, true )
386+ if err != nil {
387+ t .Errorf ("expected no error when skipping write tool in read-only mode, got %v" , err )
388+ }
389+
390+ // Test registering non-existent tool (should error)
391+ err = tsg .RegisterSpecificTools (nil , []string {"nonexistent" }, false )
392+ if err == nil {
393+ t .Error ("expected error for non-existent tool" )
394+ }
395+ }
0 commit comments