@@ -634,3 +634,119 @@ func TestOptionalPaginationParams(t *testing.T) {
634634 })
635635 }
636636}
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