@@ -2,6 +2,7 @@ package github
22
33import (
44 "context"
5+ "errors"
56 "net/http"
67 "net/url"
78 "testing"
@@ -12,6 +13,15 @@ import (
1213 "github.com/stretchr/testify/require"
1314)
1415
16+ // errorTransport is a http.RoundTripper that always returns an error.
17+ type errorTransport struct {
18+ err error
19+ }
20+
21+ func (t * errorTransport ) RoundTrip (* http.Request ) (* http.Response , error ) {
22+ return nil , t .err
23+ }
24+
1525type resourceResponseType int
1626
1727const (
@@ -272,3 +282,33 @@ func Test_repositoryResourceContents(t *testing.T) {
272282 })
273283 }
274284}
285+
286+ // Test_repositoryResourceContentsHandler_NetworkError tests that a network error
287+ // during raw content fetch does not cause a panic (nil response body dereference).
288+ func Test_repositoryResourceContentsHandler_NetworkError (t * testing.T ) {
289+ base , _ := url .Parse ("https://raw.example.com/" )
290+ networkErr := errors .New ("network error: connection refused" )
291+
292+ httpClient := & http.Client {Transport : & errorTransport {err : networkErr }}
293+ client := github .NewClient (httpClient )
294+ mockRawClient := raw .NewClient (client , base )
295+ deps := BaseDeps {
296+ Client : client ,
297+ RawClient : mockRawClient ,
298+ }
299+ ctx := ContextWithDeps (context .Background (), deps )
300+
301+ handler := RepositoryResourceContentsHandler (repositoryResourceContentURITemplate )
302+
303+ request := & mcp.ReadResourceRequest {
304+ Params : & mcp.ReadResourceParams {
305+ URI : "repo://owner/repo/contents/README.md" ,
306+ },
307+ }
308+
309+ // This should not panic, even though the HTTP client returns an error
310+ resp , err := handler (ctx , request )
311+ require .Error (t , err )
312+ require .Nil (t , resp )
313+ require .ErrorContains (t , err , "failed to get raw content" )
314+ }
0 commit comments