Implements 15 new MCP tools in the `org` domain covering organization CRUD, membership queries, and team management. All tools follow existing patterns and are available via both MCP and CLI modes.
193 lines
4.9 KiB
Go
193 lines
4.9 KiB
Go
package org
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"testing"
|
|
)
|
|
|
|
func TestListOrgTeamsFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode([]map[string]interface{}{
|
|
{"id": 1, "name": "Owners", "permission": "owner"},
|
|
{"id": 2, "name": "Developers", "permission": "write"},
|
|
})
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"org": "test-org",
|
|
})
|
|
result, err := ListOrgTeamsFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("ListOrgTeamsFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("ListOrgTeamsFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestListOrgTeamsFn_MissingOrg(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{})
|
|
_, err := ListOrgTeamsFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing org, got nil")
|
|
}
|
|
}
|
|
|
|
func TestCreateOrgTeamFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusCreated)
|
|
json.NewEncoder(w).Encode(map[string]interface{}{
|
|
"id": 5,
|
|
"name": "devs",
|
|
"permission": "read",
|
|
})
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"org": "test-org",
|
|
"name": "devs",
|
|
})
|
|
result, err := CreateOrgTeamFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("CreateOrgTeamFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("CreateOrgTeamFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestCreateOrgTeamFn_MissingOrg(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"name": "devs",
|
|
})
|
|
_, err := CreateOrgTeamFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing org, got nil")
|
|
}
|
|
}
|
|
|
|
func TestCreateOrgTeamFn_MissingName(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"org": "test-org",
|
|
})
|
|
_, err := CreateOrgTeamFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing name, got nil")
|
|
}
|
|
}
|
|
|
|
func TestAddTeamMemberFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusNoContent)
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"team_id": float64(5),
|
|
"user": "testuser",
|
|
})
|
|
result, err := AddTeamMemberFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("AddTeamMemberFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("AddTeamMemberFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestAddTeamMemberFn_MissingTeamID(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"user": "testuser",
|
|
})
|
|
_, err := AddTeamMemberFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing team_id, got nil")
|
|
}
|
|
}
|
|
|
|
func TestRemoveTeamMemberFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusNoContent)
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"team_id": float64(5),
|
|
"user": "testuser",
|
|
})
|
|
result, err := RemoveTeamMemberFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("RemoveTeamMemberFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("RemoveTeamMemberFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestAddTeamRepoFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusNoContent)
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"team_id": float64(5),
|
|
"org": "test-org",
|
|
"repo": "test-repo",
|
|
})
|
|
result, err := AddTeamRepoFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("AddTeamRepoFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("AddTeamRepoFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestAddTeamRepoFn_MissingTeamID(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"org": "test-org",
|
|
"repo": "test-repo",
|
|
})
|
|
_, err := AddTeamRepoFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing team_id, got nil")
|
|
}
|
|
}
|
|
|
|
func TestRemoveTeamRepoFn_Success(t *testing.T) {
|
|
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusNoContent)
|
|
})
|
|
defer srv.Close()
|
|
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"team_id": float64(5),
|
|
"org": "test-org",
|
|
"repo": "test-repo",
|
|
})
|
|
result, err := RemoveTeamRepoFn(context.Background(), req)
|
|
if err != nil {
|
|
t.Fatalf("RemoveTeamRepoFn returned error: %v", err)
|
|
}
|
|
if result.IsError {
|
|
t.Fatal("RemoveTeamRepoFn returned tool error")
|
|
}
|
|
}
|
|
|
|
func TestRemoveTeamRepoFn_MissingRepo(t *testing.T) {
|
|
req := newCallToolRequest(map[string]interface{}{
|
|
"team_id": float64(5),
|
|
"org": "test-org",
|
|
})
|
|
_, err := RemoveTeamRepoFn(context.Background(), req)
|
|
if err == nil {
|
|
t.Fatal("expected error for missing repo, got nil")
|
|
}
|
|
}
|