@@ -1963,3 +1963,177 @@ func Test_GetTag(t *testing.T) {
1963
1963
})
1964
1964
}
1965
1965
}
1966
+
1967
+ func Test_ListReleases (t * testing.T ) {
1968
+ mockClient := github .NewClient (nil )
1969
+ tool , _ := ListReleases (stubGetClientFn (mockClient ), translations .NullTranslationHelper )
1970
+
1971
+ assert .Equal (t , "list_releases" , tool .Name )
1972
+ assert .NotEmpty (t , tool .Description )
1973
+ assert .Contains (t , tool .InputSchema .Properties , "owner" )
1974
+ assert .Contains (t , tool .InputSchema .Properties , "repo" )
1975
+ assert .ElementsMatch (t , tool .InputSchema .Required , []string {"owner" , "repo" })
1976
+
1977
+ mockReleases := []* github.RepositoryRelease {
1978
+ {
1979
+ ID : github .Ptr (int64 (1 )),
1980
+ TagName : github .Ptr ("v1.0.0" ),
1981
+ Name : github .Ptr ("First Release" ),
1982
+ },
1983
+ {
1984
+ ID : github .Ptr (int64 (2 )),
1985
+ TagName : github .Ptr ("v0.9.0" ),
1986
+ Name : github .Ptr ("Beta Release" ),
1987
+ },
1988
+ }
1989
+
1990
+ tests := []struct {
1991
+ name string
1992
+ mockedClient * http.Client
1993
+ requestArgs map [string ]interface {}
1994
+ expectError bool
1995
+ expectedResult []* github.RepositoryRelease
1996
+ expectedErrMsg string
1997
+ }{
1998
+ {
1999
+ name : "successful releases list" ,
2000
+ mockedClient : mock .NewMockedHTTPClient (
2001
+ mock .WithRequestMatch (
2002
+ mock .GetReposReleasesByOwnerByRepo ,
2003
+ mockReleases ,
2004
+ ),
2005
+ ),
2006
+ requestArgs : map [string ]interface {}{
2007
+ "owner" : "owner" ,
2008
+ "repo" : "repo" ,
2009
+ },
2010
+ expectError : false ,
2011
+ expectedResult : mockReleases ,
2012
+ },
2013
+ {
2014
+ name : "releases list fails" ,
2015
+ mockedClient : mock .NewMockedHTTPClient (
2016
+ mock .WithRequestMatchHandler (
2017
+ mock .GetReposReleasesByOwnerByRepo ,
2018
+ http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
2019
+ w .WriteHeader (http .StatusNotFound )
2020
+ _ , _ = w .Write ([]byte (`{"message": "Not Found"}` ))
2021
+ }),
2022
+ ),
2023
+ ),
2024
+ requestArgs : map [string ]interface {}{
2025
+ "owner" : "owner" ,
2026
+ "repo" : "repo" ,
2027
+ },
2028
+ expectError : true ,
2029
+ expectedErrMsg : "failed to list releases" ,
2030
+ },
2031
+ }
2032
+
2033
+ for _ , tc := range tests {
2034
+ t .Run (tc .name , func (t * testing.T ) {
2035
+ client := github .NewClient (tc .mockedClient )
2036
+ _ , handler := ListReleases (stubGetClientFn (client ), translations .NullTranslationHelper )
2037
+ request := createMCPRequest (tc .requestArgs )
2038
+ result , err := handler (context .Background (), request )
2039
+
2040
+ if tc .expectError {
2041
+ require .Error (t , err )
2042
+ assert .Contains (t , err .Error (), tc .expectedErrMsg )
2043
+ return
2044
+ }
2045
+
2046
+ require .NoError (t , err )
2047
+ textContent := getTextResult (t , result )
2048
+ var returnedReleases []* github.RepositoryRelease
2049
+ err = json .Unmarshal ([]byte (textContent .Text ), & returnedReleases )
2050
+ require .NoError (t , err )
2051
+ assert .Len (t , returnedReleases , len (tc .expectedResult ))
2052
+ for i , rel := range returnedReleases {
2053
+ assert .Equal (t , * tc .expectedResult [i ].TagName , * rel .TagName )
2054
+ }
2055
+ })
2056
+ }
2057
+ }
2058
+
2059
+ func Test_GetLatestRelease (t * testing.T ) {
2060
+ mockClient := github .NewClient (nil )
2061
+ tool , _ := GetLatestRelease (stubGetClientFn (mockClient ), translations .NullTranslationHelper )
2062
+
2063
+ assert .Equal (t , "get_latest_release" , tool .Name )
2064
+ assert .NotEmpty (t , tool .Description )
2065
+ assert .Contains (t , tool .InputSchema .Properties , "owner" )
2066
+ assert .Contains (t , tool .InputSchema .Properties , "repo" )
2067
+ assert .ElementsMatch (t , tool .InputSchema .Required , []string {"owner" , "repo" })
2068
+
2069
+ mockRelease := & github.RepositoryRelease {
2070
+ ID : github .Ptr (int64 (1 )),
2071
+ TagName : github .Ptr ("v1.0.0" ),
2072
+ Name : github .Ptr ("First Release" ),
2073
+ }
2074
+
2075
+ tests := []struct {
2076
+ name string
2077
+ mockedClient * http.Client
2078
+ requestArgs map [string ]interface {}
2079
+ expectError bool
2080
+ expectedResult * github.RepositoryRelease
2081
+ expectedErrMsg string
2082
+ }{
2083
+ {
2084
+ name : "successful latest release fetch" ,
2085
+ mockedClient : mock .NewMockedHTTPClient (
2086
+ mock .WithRequestMatch (
2087
+ mock .GetReposReleasesLatestByOwnerByRepo ,
2088
+ mockRelease ,
2089
+ ),
2090
+ ),
2091
+ requestArgs : map [string ]interface {}{
2092
+ "owner" : "owner" ,
2093
+ "repo" : "repo" ,
2094
+ },
2095
+ expectError : false ,
2096
+ expectedResult : mockRelease ,
2097
+ },
2098
+ {
2099
+ name : "latest release fetch fails" ,
2100
+ mockedClient : mock .NewMockedHTTPClient (
2101
+ mock .WithRequestMatchHandler (
2102
+ mock .GetReposReleasesLatestByOwnerByRepo ,
2103
+ http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
2104
+ w .WriteHeader (http .StatusNotFound )
2105
+ _ , _ = w .Write ([]byte (`{"message": "Not Found"}` ))
2106
+ }),
2107
+ ),
2108
+ ),
2109
+ requestArgs : map [string ]interface {}{
2110
+ "owner" : "owner" ,
2111
+ "repo" : "repo" ,
2112
+ },
2113
+ expectError : true ,
2114
+ expectedErrMsg : "failed to get latest release" ,
2115
+ },
2116
+ }
2117
+
2118
+ for _ , tc := range tests {
2119
+ t .Run (tc .name , func (t * testing.T ) {
2120
+ client := github .NewClient (tc .mockedClient )
2121
+ _ , handler := GetLatestRelease (stubGetClientFn (client ), translations .NullTranslationHelper )
2122
+ request := createMCPRequest (tc .requestArgs )
2123
+ result , err := handler (context .Background (), request )
2124
+
2125
+ if tc .expectError {
2126
+ require .Error (t , err )
2127
+ assert .Contains (t , err .Error (), tc .expectedErrMsg )
2128
+ return
2129
+ }
2130
+
2131
+ require .NoError (t , err )
2132
+ textContent := getTextResult (t , result )
2133
+ var returnedRelease github.RepositoryRelease
2134
+ err = json .Unmarshal ([]byte (textContent .Text ), & returnedRelease )
2135
+ require .NoError (t , err )
2136
+ assert .Equal (t , * tc .expectedResult .TagName , * returnedRelease .TagName )
2137
+ })
2138
+ }
2139
+ }
0 commit comments