Skip to content

Commit 1b92d0c

Browse files
committed
test: add tests for target metadata tool handler
Signed-off-by: TJ Hoplock <[email protected]>
1 parent 74f48bb commit 1b92d0c

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

pkg/mcp/tools_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,3 +606,93 @@ func TestMetricMetadataToolHandler(t *testing.T) {
606606
})
607607
}
608608
}
609+
610+
func TestTargetsMetadataToolHandler(t *testing.T) {
611+
testCases := []struct {
612+
name string
613+
request mcp.CallToolRequest
614+
mockTargetsMetadataFunc func(ctx context.Context, matchTarget string, metric string, limit string) ([]promv1.MetricMetadata, error)
615+
validateResult func(t *testing.T, result *mcp.CallToolResult, err error)
616+
}{
617+
{
618+
name: "success with params",
619+
request: mcp.CallToolRequest{
620+
Request: mcp.Request{Method: string(mcp.MethodToolsCall)},
621+
Params: mcp.CallToolParams{
622+
Name: "targets_metadata",
623+
Arguments: map[string]any{
624+
"match_target": `{job="prometheus"}`,
625+
"metric": "go_goroutines",
626+
"limit": "10",
627+
},
628+
},
629+
},
630+
mockTargetsMetadataFunc: func(ctx context.Context, matchTarget string, metric string, limit string) ([]promv1.MetricMetadata, error) {
631+
require.Equal(t, `{job="prometheus"}`, matchTarget)
632+
require.Equal(t, "go_goroutines", metric)
633+
require.Equal(t, "10", limit)
634+
return []promv1.MetricMetadata{}, nil
635+
},
636+
validateResult: func(t *testing.T, result *mcp.CallToolResult, err error) {
637+
require.NoError(t, err)
638+
require.False(t, result.IsError)
639+
},
640+
},
641+
{
642+
name: "success no params",
643+
request: mcp.CallToolRequest{
644+
Request: mcp.Request{Method: string(mcp.MethodToolsCall)},
645+
Params: mcp.CallToolParams{
646+
Name: "targets_metadata",
647+
},
648+
},
649+
mockTargetsMetadataFunc: func(ctx context.Context, matchTarget string, metric string, limit string) ([]promv1.MetricMetadata, error) {
650+
return []promv1.MetricMetadata{}, nil
651+
},
652+
validateResult: func(t *testing.T, result *mcp.CallToolResult, err error) {
653+
require.NoError(t, err)
654+
require.False(t, result.IsError)
655+
},
656+
},
657+
{
658+
name: "API error",
659+
request: mcp.CallToolRequest{
660+
Request: mcp.Request{Method: string(mcp.MethodToolsCall)},
661+
Params: mcp.CallToolParams{
662+
Name: "targets_metadata",
663+
},
664+
},
665+
mockTargetsMetadataFunc: func(ctx context.Context, matchTarget string, metric string, limit string) ([]promv1.MetricMetadata, error) {
666+
return nil, errors.New("prometheus exploded")
667+
},
668+
validateResult: func(t *testing.T, result *mcp.CallToolResult, err error) {
669+
require.NoError(t, err)
670+
require.True(t, result.IsError)
671+
require.Contains(t, toolCallResultAsString(result), "prometheus exploded")
672+
},
673+
},
674+
}
675+
676+
mockAPI := &MockPrometheusAPI{}
677+
mockServer := mcptest.NewUnstartedServer(t)
678+
mockServer.AddTool(targetsMetadataTool, targetsMetadataToolHandler)
679+
680+
ctx := context.WithValue(context.Background(), apiClientKey{}, mockAPI)
681+
err := mockServer.Start(ctx)
682+
require.NoError(t, err)
683+
defer mockServer.Close()
684+
685+
mcpClient := mockServer.Client()
686+
defer mcpClient.Close()
687+
688+
for _, tc := range testCases {
689+
t.Run(tc.name, func(t *testing.T) {
690+
mockAPI.TargetsMetadataFunc = tc.mockTargetsMetadataFunc
691+
692+
res, err := mcpClient.CallTool(ctx, tc.request)
693+
require.NoError(t, err)
694+
695+
tc.validateResult(t, res, err)
696+
})
697+
}
698+
}

0 commit comments

Comments
 (0)