forgejo-mcp/operation/org/membership_test.go
Christoph Görn 7dae37ca2e feat: ✨ add organization management tools (CRUD, membership, teams)
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.
2026-03-20 08:15:39 +01:00

135 lines
3.4 KiB
Go

package org
import (
"context"
"encoding/json"
"net/http"
"testing"
)
func TestListOrgMembersFn_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, "login": "user1"},
{"id": 2, "login": "user2"},
})
})
defer srv.Close()
req := newCallToolRequest(map[string]interface{}{
"org": "test-org",
})
result, err := ListOrgMembersFn(context.Background(), req)
if err != nil {
t.Fatalf("ListOrgMembersFn returned error: %v", err)
}
if result.IsError {
t.Fatal("ListOrgMembersFn returned tool error")
}
}
func TestListOrgMembersFn_MissingOrg(t *testing.T) {
req := newCallToolRequest(map[string]interface{}{})
_, err := ListOrgMembersFn(context.Background(), req)
if err == nil {
t.Fatal("expected error for missing org, got nil")
}
}
func TestCheckOrgMembershipFn_IsMember(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{}{
"org": "test-org",
"user": "testuser",
})
result, err := CheckOrgMembershipFn(context.Background(), req)
if err != nil {
t.Fatalf("CheckOrgMembershipFn returned error: %v", err)
}
if result.IsError {
t.Fatal("CheckOrgMembershipFn returned tool error")
}
}
func TestCheckOrgMembershipFn_NotMember(t *testing.T) {
srv := setupOrgMockServer(t, func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
})
defer srv.Close()
req := newCallToolRequest(map[string]interface{}{
"org": "test-org",
"user": "outsider",
})
result, err := CheckOrgMembershipFn(context.Background(), req)
if err != nil {
t.Fatalf("CheckOrgMembershipFn returned error: %v", err)
}
if result.IsError {
t.Fatal("CheckOrgMembershipFn returned tool error")
}
}
func TestCheckOrgMembershipFn_MissingOrg(t *testing.T) {
req := newCallToolRequest(map[string]interface{}{
"user": "testuser",
})
_, err := CheckOrgMembershipFn(context.Background(), req)
if err == nil {
t.Fatal("expected error for missing org, got nil")
}
}
func TestCheckOrgMembershipFn_MissingUser(t *testing.T) {
req := newCallToolRequest(map[string]interface{}{
"org": "test-org",
})
_, err := CheckOrgMembershipFn(context.Background(), req)
if err == nil {
t.Fatal("expected error for missing user, got nil")
}
}
func TestRemoveOrgMemberFn_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{}{
"org": "test-org",
"user": "testuser",
})
result, err := RemoveOrgMemberFn(context.Background(), req)
if err != nil {
t.Fatalf("RemoveOrgMemberFn returned error: %v", err)
}
if result.IsError {
t.Fatal("RemoveOrgMemberFn returned tool error")
}
}
func TestRemoveOrgMemberFn_MissingOrg(t *testing.T) {
req := newCallToolRequest(map[string]interface{}{
"user": "testuser",
})
_, err := RemoveOrgMemberFn(context.Background(), req)
if err == nil {
t.Fatal("expected error for missing org, got nil")
}
}
func TestRemoveOrgMemberFn_MissingUser(t *testing.T) {
req := newCallToolRequest(map[string]interface{}{
"org": "test-org",
})
_, err := RemoveOrgMemberFn(context.Background(), req)
if err == nil {
t.Fatal("expected error for missing user, got nil")
}
}