ACP / MCP

This commit is contained in:
2026-06-12 11:44:19 +08:00
parent 2a9661a6ef
commit 4ea4adfd8e
47 changed files with 2558 additions and 240 deletions
+71
View File
@@ -0,0 +1,71 @@
package acp_test
import (
"context"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/yan1h/agent-coding-workflow/internal/acp"
"github.com/yan1h/agent-coding-workflow/internal/infra/errs"
)
func TestAgentKindService_MCPServers_Validation(t *testing.T) {
t.Parallel()
ctx := context.Background()
svc := acp.NewAgentKindService(newFakeAgentKindRepo(), testEncryptor(t), nil)
admin := acp.Caller{UserID: uuid.New(), IsAdmin: true}
base := acp.CreateAgentKindInput{Name: "k", DisplayName: "K", BinaryPath: "/x", Enabled: true}
cases := []struct {
name string
servers []acp.McpServerSpec
}{
{"missing name", []acp.McpServerSpec{{Type: acp.McpStdio, Command: "/x"}}},
{"reserved acw name", []acp.McpServerSpec{{Name: "acw", Type: acp.McpHTTP, URL: "http://x"}}},
{"duplicate name", []acp.McpServerSpec{
{Name: "d", Type: acp.McpStdio, Command: "/x"},
{Name: "d", Type: acp.McpHTTP, URL: "http://x"},
}},
{"stdio without command", []acp.McpServerSpec{{Name: "a", Type: acp.McpStdio}}},
{"http without url", []acp.McpServerSpec{{Name: "a", Type: acp.McpHTTP}}},
{"invalid type", []acp.McpServerSpec{{Name: "a", Type: "magic"}}},
}
for _, tc := range cases {
in := base
in.MCPServers = tc.servers
_, err := svc.Create(ctx, admin, in)
ae, ok := errs.As(err)
require.True(t, ok, "case %s should fail", tc.name)
assert.Equal(t, errs.CodeInvalidInput, ae.Code, "case %s", tc.name)
}
}
func TestAgentKindService_MCPServers_CreateAndUpdate(t *testing.T) {
t.Parallel()
ctx := context.Background()
svc := acp.NewAgentKindService(newFakeAgentKindRepo(), testEncryptor(t), nil)
admin := acp.Caller{UserID: uuid.New(), IsAdmin: true}
k, err := svc.Create(ctx, admin, acp.CreateAgentKindInput{
Name: "k", DisplayName: "K", BinaryPath: "/x", Enabled: true,
MCPServers: []acp.McpServerSpec{
{Name: "ctx7", Type: acp.McpHTTP, URL: "https://mcp.ctx7.dev", Headers: map[string]string{"X-Key": "v"}},
},
})
require.NoError(t, err)
assert.NotEmpty(t, k.EncryptedMCPServers) // 已加密落库
// nil = 不改
updated, err := svc.Update(ctx, admin, k.ID, acp.UpdateAgentKindInput{})
require.NoError(t, err)
assert.Equal(t, k.EncryptedMCPServers, updated.EncryptedMCPServers)
// 空列表 = 清空
updated, err = svc.Update(ctx, admin, k.ID, acp.UpdateAgentKindInput{MCPServers: []acp.McpServerSpec{}})
require.NoError(t, err)
assert.NotEqual(t, k.EncryptedMCPServers, updated.EncryptedMCPServers)
}