@@ -634,3 +634,119 @@ func TestOptionalPaginationParams(t *testing.T) {
634
634
})
635
635
}
636
636
}
637
+
638
+ func Test_GetLatestVersion (t * testing.T ) {
639
+ // Verify tool definition
640
+ mockClient := github .NewClient (nil )
641
+ tool ,_ := getLatestVersion (mockClient ,"v1.0.0" ,translations .NullTranslationHelper )
642
+
643
+ assert .Equal (t ,"get_latest_version" ,tool .Name )
644
+ assert .NotEmpty (t ,tool .Description )
645
+
646
+ // Setup mock release response
647
+ mockRelease := & github.RepositoryRelease {
648
+ TagName :github .Ptr ("v1.1.0" ),
649
+ Name :github .Ptr ("Release v1.1.0" ),
650
+ HTMLURL :github .Ptr ("https://github.com/github/github-mcp-server/releases/tag/v1.1.0" ),
651
+ PublishedAt :& github.Timestamp {Time :time .Now ().Add (- 24 * time .Hour )},
652
+ }
653
+
654
+ tests := []struct {
655
+ name string
656
+ mockedClient * http.Client
657
+ currentVersion string
658
+ expectError bool
659
+ expectedResult map [string ]interface {}
660
+ expectedErrMsg string
661
+ }{
662
+ {
663
+ name :"successful get latest version - up to date" ,
664
+ mockedClient :mock .NewMockedHTTPClient (
665
+ mock .WithRequestMatchHandler (
666
+ mock .GetReposReleasesLatestByOwnerByRepo ,
667
+ mockResponse (t ,http .StatusOK ,mockRelease ),
668
+ ),
669
+ ),
670
+ currentVersion :"v1.1.0" ,
671
+ expectError :false ,
672
+ expectedResult :map [string ]interface {}{
673
+ "current_version" :"v1.1.0" ,
674
+ "latest_version" :"v1.1.0" ,
675
+ "up_to_date" :true ,
676
+ "release_url" :"https://github.com/github/github-mcp-server/releases/tag/v1.1.0" ,
677
+ // We can't test exact published_at since it's dynamic
678
+ },
679
+ },
680
+ {
681
+ name :"successful get latest version - outdated" ,
682
+ mockedClient :mock .NewMockedHTTPClient (
683
+ mock .WithRequestMatchHandler (
684
+ mock .GetReposReleasesLatestByOwnerByRepo ,
685
+ mockResponse (t ,http .StatusOK ,mockRelease ),
686
+ ),
687
+ ),
688
+ currentVersion :"v1.0.0" ,
689
+ expectError :false ,
690
+ expectedResult :map [string ]interface {}{
691
+ "current_version" :"v1.0.0" ,
692
+ "latest_version" :"v1.1.0" ,
693
+ "up_to_date" :false ,
694
+ "release_url" :"https://github.com/github/github-mcp-server/releases/tag/v1.1.0" ,
695
+ // We can't test exact published_at since it's dynamic
696
+ },
697
+ },
698
+ {
699
+ name :"API request fails" ,
700
+ mockedClient :mock .NewMockedHTTPClient (
701
+ mock .WithRequestMatchHandler (
702
+ mock .GetReposReleasesLatestByOwnerByRepo ,
703
+ http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
704
+ w .WriteHeader (http .StatusNotFound )
705
+ _ ,_ = w .Write ([]byte (`{"message": "Not Found"}` ))
706
+ }),
707
+ ),
708
+ ),
709
+ currentVersion :"v1.0.0" ,
710
+ expectError :true ,
711
+ expectedErrMsg :"failed to get latest release" ,
712
+ },
713
+ }
714
+
715
+ for _ ,tc := range tests {
716
+ t .Run (tc .name ,func (t * testing.T ) {
717
+ // Setup client with mock
718
+ client := github .NewClient (tc .mockedClient )
719
+ _ ,handler := getLatestVersion (client ,tc .currentVersion ,translations .NullTranslationHelper )
720
+
721
+ // Create call request with empty parameters (none needed for this API)
722
+ request := createMCPRequest (map [string ]interface {}{})
723
+
724
+ // Call handler
725
+ result ,err := handler (context .Background (),request )
726
+
727
+ // Verify results
728
+ if tc .expectError {
729
+ require .Error (t ,err )
730
+ assert .Contains (t ,err .Error (),tc .expectedErrMsg )
731
+ return
732
+ }
733
+
734
+ require .NoError (t ,err )
735
+
736
+ // Parse result and get text content
737
+ textContent := getTextResult (t ,result )
738
+
739
+ // Unmarshal and verify the result
740
+ var resultMap map [string ]interface {}
741
+ err = json .Unmarshal ([]byte (textContent .Text ),& resultMap )
742
+ require .NoError (t ,err )
743
+
744
+ // Verify expected fields
745
+ assert .Equal (t ,tc .expectedResult ["current_version" ],resultMap ["current_version" ])
746
+ assert .Equal (t ,tc .expectedResult ["latest_version" ],resultMap ["latest_version" ])
747
+ assert .Equal (t ,tc .expectedResult ["up_to_date" ],resultMap ["up_to_date" ])
748
+ assert .Equal (t ,tc .expectedResult ["release_url" ],resultMap ["release_url" ])
749
+ assert .NotEmpty (t ,resultMap ["published_at" ])
750
+ })
751
+ }
752
+ }