@@ -1963,3 +1963,177 @@ func Test_GetTag(t *testing.T) {
19631963 })
19641964 }
19651965}
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