@@ -606,3 +606,93 @@ func TestMetricMetadataToolHandler(t *testing.T) {
606
606
})
607
607
}
608
608
}
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