@@ -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
+ }
0 commit comments