@@ -2,6 +2,7 @@ package github
22
33import (
44 "context"
5+ "errors"
56 "net/http"
67 "net/url"
78 "testing"
@@ -14,6 +15,15 @@ import (
1415 "github.com/stretchr/testify/require"
1516)
1617
18+ // errorTransport is a http.RoundTripper that always returns an error.
19+ type errorTransport struct {
20+ err error
21+ }
22+
23+ func (t * errorTransport ) RoundTrip (* http.Request ) (* http.Response , error ) {
24+ return nil , t .err
25+ }
26+
1727func Test_repositoryResourceContentsHandler (t * testing.T ) {
1828 base , _ := url .Parse ("https://raw.example.com/" )
1929 tests := []struct {
@@ -256,6 +266,37 @@ func Test_repositoryResourceContentsHandler(t *testing.T) {
256266 }
257267}
258268
269+ // Test_repositoryResourceContentsHandler_NetworkError tests that a network error
270+ // during raw content fetch does not cause a panic (nil response body dereference).
271+ func Test_repositoryResourceContentsHandler_NetworkError (t * testing.T ) {
272+ base , _ := url .Parse ("https://raw.example.com/" )
273+ networkErr := errors .New ("network error: connection refused" )
274+
275+ httpClient := & http.Client {Transport : & errorTransport {err : networkErr }}
276+ client := github .NewClient (httpClient )
277+ mockRawClient := raw .NewClient (client , base )
278+ handler := RepositoryResourceContentsHandler (stubGetClientFn (client ), stubGetRawClientFn (mockRawClient ))
279+
280+ request := mcp.ReadResourceRequest {
281+ Params : struct {
282+ URI string `json:"uri"`
283+ Arguments map [string ]any `json:"arguments,omitempty"`
284+ }{
285+ Arguments : map [string ]any {
286+ "owner" : []string {"owner" },
287+ "repo" : []string {"repo" },
288+ "path" : []string {"README.md" },
289+ },
290+ },
291+ }
292+
293+ // This should not panic, even though the HTTP client returns an error
294+ resp , err := handler (context .TODO (), request )
295+ require .Error (t , err )
296+ require .Nil (t , resp )
297+ require .ErrorContains (t , err , "failed to get raw content" )
298+ }
299+
259300func Test_GetRepositoryResourceContent (t * testing.T ) {
260301 mockRawClient := raw .NewClient (github .NewClient (nil ), & url.URL {})
261302 tmpl , _ := GetRepositoryResourceContent (nil , stubGetRawClientFn (mockRawClient ), translations .NullTranslationHelper )
0 commit comments