88
99"github.com/github/github-mcp-server/pkg/raw"
1010"github.com/google/go-github/v79/github"
11- "github.com/migueleliasweb/go-github-mock/src/mock"
1211"github.com/modelcontextprotocol/go-sdk/mcp"
1312"github.com/stretchr/testify/require"
1413)
@@ -34,16 +33,14 @@ func Test_repositoryResourceContents(t *testing.T) {
3433}{
3534{
3635name :"missing owner" ,
37- mockedClient :mock .NewMockedHTTPClient (
38- mock .WithRequestMatchHandler (
39- raw .GetRawReposContentsByOwnerByRepoByPath ,
36+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
37+ GetRawReposContentsByOwnerByRepoByPath :
4038http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
4139w .Header ().Set ("Content-Type" ,"text/markdown" )
4240_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
4341require .NoError (t ,err )
4442}),
45- ),
46- ),
43+ }),
4744uri :"repo:///repo/contents/README.md" ,
4845handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
4946return RepositoryResourceContentsHandler (deps ,repositoryResourceContentURITemplate )
@@ -53,16 +50,14 @@ func Test_repositoryResourceContents(t *testing.T) {
5350},
5451{
5552name :"missing repo" ,
56- mockedClient :mock .NewMockedHTTPClient (
57- mock .WithRequestMatchHandler (
58- raw .GetRawReposContentsByOwnerByRepoByBranchByPath ,
53+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
54+ GetRawReposContentsByOwnerByRepoByBranchByPath :
5955http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
6056w .Header ().Set ("Content-Type" ,"text/markdown" )
6157_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
6258require .NoError (t ,err )
6359}),
64- ),
65- ),
60+ }),
6661uri :"repo://owner//refs/heads/main/contents/README.md" ,
6762handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
6863return RepositoryResourceContentsHandler (deps ,repositoryResourceBranchContentURITemplate )
@@ -72,16 +67,14 @@ func Test_repositoryResourceContents(t *testing.T) {
7267},
7368{
7469name :"successful blob content fetch" ,
75- mockedClient :mock .NewMockedHTTPClient (
76- mock .WithRequestMatchHandler (
77- raw .GetRawReposContentsByOwnerByRepoByPath ,
70+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
71+ GetRawReposContentsByOwnerByRepoByPath :
7872http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
7973w .Header ().Set ("Content-Type" ,"image/png" )
8074_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
8175require .NoError (t ,err )
8276}),
83- ),
84- ),
77+ }),
8578uri :"repo://owner/repo/contents/data.png" ,
8679handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
8780return RepositoryResourceContentsHandler (deps ,repositoryResourceContentURITemplate )
@@ -96,16 +89,14 @@ func Test_repositoryResourceContents(t *testing.T) {
9689},
9790{
9891name :"successful text content fetch (HEAD)" ,
99- mockedClient :mock .NewMockedHTTPClient (
100- mock .WithRequestMatchHandler (
101- raw .GetRawReposContentsByOwnerByRepoByPath ,
92+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
93+ GetRawReposContentsByOwnerByRepoByPath :
10294http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
10395w .Header ().Set ("Content-Type" ,"text/markdown" )
10496_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
10597require .NoError (t ,err )
10698}),
107- ),
108- ),
99+ }),
109100uri :"repo://owner/repo/contents/README.md" ,
110101handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
111102return RepositoryResourceContentsHandler (deps ,repositoryResourceContentURITemplate )
@@ -120,18 +111,16 @@ func Test_repositoryResourceContents(t *testing.T) {
120111},
121112{
122113name :"successful text content fetch (HEAD)" ,
123- mockedClient :mock .NewMockedHTTPClient (
124- mock .WithRequestMatchHandler (
125- raw .GetRawReposContentsByOwnerByRepoByPath ,
114+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
115+ GetRawReposContentsByOwnerByRepoByPath :
126116http .HandlerFunc (func (w http.ResponseWriter ,r * http.Request ) {
127117w .Header ().Set ("Content-Type" ,"text/plain" )
128118
129119require .Contains (t ,r .URL .Path ,"pkg/github/actions.go" )
130120_ ,err := w .Write ([]byte ("package actions\n \n func main() {\n // Sample Go file content\n }\n " ))
131121require .NoError (t ,err )
132122}),
133- ),
134- ),
123+ }),
135124uri :"repo://owner/repo/contents/pkg/github/actions.go" ,
136125handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
137126return RepositoryResourceContentsHandler (deps ,repositoryResourceContentURITemplate )
@@ -146,16 +135,14 @@ func Test_repositoryResourceContents(t *testing.T) {
146135},
147136{
148137name :"successful text content fetch (branch)" ,
149- mockedClient :mock .NewMockedHTTPClient (
150- mock .WithRequestMatchHandler (
151- raw .GetRawReposContentsByOwnerByRepoByBranchByPath ,
138+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
139+ GetRawReposContentsByOwnerByRepoByBranchByPath :
152140http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
153141w .Header ().Set ("Content-Type" ,"text/markdown" )
154142_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
155143require .NoError (t ,err )
156144}),
157- ),
158- ),
145+ }),
159146uri :"repo://owner/repo/refs/heads/main/contents/README.md" ,
160147handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
161148return RepositoryResourceContentsHandler (deps ,repositoryResourceBranchContentURITemplate )
@@ -170,16 +157,14 @@ func Test_repositoryResourceContents(t *testing.T) {
170157},
171158{
172159name :"successful text content fetch (tag)" ,
173- mockedClient :mock .NewMockedHTTPClient (
174- mock .WithRequestMatchHandler (
175- raw .GetRawReposContentsByOwnerByRepoByTagByPath ,
160+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
161+ GetRawReposContentsByOwnerByRepoByTagByPath :
176162http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
177163w .Header ().Set ("Content-Type" ,"text/markdown" )
178164_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
179165require .NoError (t ,err )
180166}),
181- ),
182- ),
167+ }),
183168uri :"repo://owner/repo/refs/tags/v1.0.0/contents/README.md" ,
184169handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
185170return RepositoryResourceContentsHandler (deps ,repositoryResourceTagContentURITemplate )
@@ -194,16 +179,14 @@ func Test_repositoryResourceContents(t *testing.T) {
194179},
195180{
196181name :"successful text content fetch (sha)" ,
197- mockedClient :mock .NewMockedHTTPClient (
198- mock .WithRequestMatchHandler (
199- raw .GetRawReposContentsByOwnerByRepoBySHAByPath ,
182+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
183+ GetRawReposContentsByOwnerByRepoBySHAByPath :
200184http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
201185w .Header ().Set ("Content-Type" ,"text/markdown" )
202186_ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
203187require .NoError (t ,err )
204188}),
205- ),
206- ),
189+ }),
207190uri :"repo://owner/repo/sha/abc123/contents/README.md" ,
208191handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
209192return RepositoryResourceContentsHandler (deps ,repositoryResourceCommitContentURITemplate )
@@ -218,24 +201,18 @@ func Test_repositoryResourceContents(t *testing.T) {
218201},
219202{
220203name :"successful text content fetch (pr)" ,
221- mockedClient :mock .NewMockedHTTPClient (
222- mock .WithRequestMatchHandler (
223- mock .GetReposPullsByOwnerByRepoByPullNumber ,
224- http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
225- w .Header ().Set ("Content-Type" ,"application/json" )
226- _ ,err := w .Write ([]byte (`{"head": {"sha": "abc123"}}` ))
227- require .NoError (t ,err )
228- }),
229- ),
230- mock .WithRequestMatchHandler (
231- raw .GetRawReposContentsByOwnerByRepoBySHAByPath ,
232- http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
233- w .Header ().Set ("Content-Type" ,"text/markdown" )
234- _ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
235- require .NoError (t ,err )
236- }),
237- ),
238- ),
204+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
205+ GetReposPullsByOwnerByRepoByPullNumber :http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
206+ w .Header ().Set ("Content-Type" ,"application/json" )
207+ _ ,err := w .Write ([]byte (`{"head": {"sha": "abc123"}}` ))
208+ require .NoError (t ,err )
209+ }),
210+ GetRawReposContentsByOwnerByRepoBySHAByPath :http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
211+ w .Header ().Set ("Content-Type" ,"text/markdown" )
212+ _ ,err := w .Write ([]byte ("# Test Repository\n \n This is a test repository." ))
213+ require .NoError (t ,err )
214+ }),
215+ }),
239216uri :"repo://owner/repo/refs/pull/42/head/contents/README.md" ,
240217handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
241218return RepositoryResourceContentsHandler (deps ,repositoryResourcePrContentURITemplate )
@@ -250,15 +227,12 @@ func Test_repositoryResourceContents(t *testing.T) {
250227},
251228{
252229name :"content fetch fails" ,
253- mockedClient :mock .NewMockedHTTPClient (
254- mock .WithRequestMatchHandler (
255- mock .GetReposContentsByOwnerByRepoByPath ,
256- http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
257- w .WriteHeader (http .StatusNotFound )
258- _ ,_ = w .Write ([]byte (`{"message": "Not Found"}` ))
259- }),
260- ),
261- ),
230+ mockedClient :MockHTTPClientWithHandlers (map [string ]http.HandlerFunc {
231+ GetReposContentsByOwnerByRepoByPath :http .HandlerFunc (func (w http.ResponseWriter ,_ * http.Request ) {
232+ w .WriteHeader (http .StatusNotFound )
233+ _ ,_ = w .Write ([]byte (`{"message": "Not Found"}` ))
234+ }),
235+ }),
262236uri :"repo://owner/repo/contents/nonexistent.md" ,
263237handlerFn :func (deps ToolDependencies ) mcp.ResourceHandler {
264238return RepositoryResourceContentsHandler (deps ,repositoryResourceContentURITemplate )
@@ -295,11 +269,11 @@ func Test_repositoryResourceContents(t *testing.T) {
295269
296270content := resp .Contents [0 ]
297271switch tc .expectedResponseType {
298- case resourceResponseTypeBlob :
272+ case resourceResponseTypeBlob :
299273require .Equal (t ,tc .expectedResult .Contents [0 ].Blob ,content .Blob )
300- case resourceResponseTypeText :
274+ case resourceResponseTypeText :
301275require .Equal (t ,tc .expectedResult .Contents [0 ].Text ,content .Text )
302- default :
276+ default :
303277t .Fatalf ("unknown expectedResponseType %v" ,tc .expectedResponseType )
304278}
305279})