|
4 | 4 | "context" |
5 | 5 | "encoding/json" |
6 | 6 | "net/http" |
| 7 | + "net/http/httptest" |
| 8 | + "net/url" |
7 | 9 | "testing" |
8 | 10 | "time" |
9 | 11 |
|
@@ -1293,3 +1295,104 @@ func Test_PushFiles(t *testing.T) { |
1293 | 1295 | }) |
1294 | 1296 | } |
1295 | 1297 | } |
| 1298 | + |
| 1299 | +func Test_ListBranches(t *testing.T) { |
| 1300 | + // Create a test server |
| 1301 | + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 1302 | + assert.Equal(t, "/repos/owner/repo/branches", r.URL.Path) |
| 1303 | + assert.Equal(t, "GET", r.Method) |
| 1304 | + |
| 1305 | + // Check query parameters |
| 1306 | + query := r.URL.Query() |
| 1307 | + if page := query.Get("page"); page != "" { |
| 1308 | + assert.Equal(t, "2", page) |
| 1309 | + } |
| 1310 | + if perPage := query.Get("per_page"); perPage != "" { |
| 1311 | + assert.Equal(t, "30", perPage) |
| 1312 | + } |
| 1313 | + |
| 1314 | + // Return mock branches |
| 1315 | + mockBranches := []github.Branch{ |
| 1316 | + {Name: github.String("main")}, |
| 1317 | + {Name: github.String("develop")}, |
| 1318 | + } |
| 1319 | + mockResponse(t, http.StatusOK, mockBranches)(w, r) |
| 1320 | + })) |
| 1321 | + defer ts.Close() |
| 1322 | + |
| 1323 | + // Create a GitHub client using the test server URL |
| 1324 | + client := github.NewClient(nil) |
| 1325 | + client.BaseURL, _ = url.Parse(ts.URL + "/") |
| 1326 | + |
| 1327 | + // Create the tool |
| 1328 | + tool, handler := ListBranches(client, translations.NullTranslationHelper) |
| 1329 | + |
| 1330 | + // Test cases |
| 1331 | + tests := []struct { |
| 1332 | + name string |
| 1333 | + args map[string]interface{} |
| 1334 | + wantErr bool |
| 1335 | + errContains string |
| 1336 | + }{ |
| 1337 | + { |
| 1338 | + name: "success", |
| 1339 | + args: map[string]interface{}{ |
| 1340 | + "owner": "owner", |
| 1341 | + "repo": "repo", |
| 1342 | + "page": float64(2), |
| 1343 | + }, |
| 1344 | + wantErr: false, |
| 1345 | + }, |
| 1346 | + { |
| 1347 | + name: "missing owner", |
| 1348 | + args: map[string]interface{}{ |
| 1349 | + "repo": "repo", |
| 1350 | + }, |
| 1351 | + wantErr: true, |
| 1352 | + errContains: "missing required parameter: owner", |
| 1353 | + }, |
| 1354 | + { |
| 1355 | + name: "missing repo", |
| 1356 | + args: map[string]interface{}{ |
| 1357 | + "owner": "owner", |
| 1358 | + }, |
| 1359 | + wantErr: true, |
| 1360 | + errContains: "missing required parameter: repo", |
| 1361 | + }, |
| 1362 | + } |
| 1363 | + |
| 1364 | + for _, tt := range tests { |
| 1365 | + t.Run(tt.name, func(t *testing.T) { |
| 1366 | + // Create request |
| 1367 | + request := createMCPRequest(tt.args) |
| 1368 | + |
| 1369 | + // Call handler |
| 1370 | + result, err := handler(context.Background(), request) |
| 1371 | + if tt.wantErr { |
| 1372 | + require.Error(t, err) |
| 1373 | + if tt.errContains != "" { |
| 1374 | + assert.Contains(t, err.Error(), tt.errContains) |
| 1375 | + } |
| 1376 | + return |
| 1377 | + } |
| 1378 | + |
| 1379 | + require.NoError(t, err) |
| 1380 | + textContent := getTextResult(t, result) |
| 1381 | + |
| 1382 | + // Verify response |
| 1383 | + var branches []github.Branch |
| 1384 | + err = json.Unmarshal([]byte(textContent.Text), &branches) |
| 1385 | + require.NoError(t, err) |
| 1386 | + assert.Len(t, branches, 2) |
| 1387 | + assert.Equal(t, "main", *branches[0].Name) |
| 1388 | + assert.Equal(t, "develop", *branches[1].Name) |
| 1389 | + }) |
| 1390 | + } |
| 1391 | + |
| 1392 | + // Verify tool definition |
| 1393 | + assert.Equal(t, "list_branches", tool.Name) |
| 1394 | + assert.Contains(t, tool.InputSchema.Required, "owner") |
| 1395 | + assert.Contains(t, tool.InputSchema.Required, "repo") |
| 1396 | + assert.NotContains(t, tool.InputSchema.Required, "page") |
| 1397 | + assert.NotContains(t, tool.InputSchema.Required, "perPage") |
| 1398 | +} |
0 commit comments