You've already forked agentic-coding-workflow
ACP / MCP
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
package acp
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"testing"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func marshalServers(t *testing.T, servers []any) string {
|
||||
t.Helper()
|
||||
b, err := json.Marshal(servers)
|
||||
require.NoError(t, err)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func TestBuildMcpServers_AcwInjectedWithHTTPCapability(t *testing.T) {
|
||||
t.Parallel()
|
||||
out := buildMcpServers(nil, "http://x/mcp", "tok123", true, false, slog.Default(), uuid.New())
|
||||
require.Len(t, out, 1)
|
||||
|
||||
j := marshalServers(t, out)
|
||||
assert.Contains(t, j, `"type":"http"`)
|
||||
assert.Contains(t, j, `"name":"acw"`)
|
||||
assert.Contains(t, j, `"url":"http://x/mcp"`)
|
||||
assert.Contains(t, j, `{"name":"Authorization","value":"Bearer tok123"}`)
|
||||
}
|
||||
|
||||
func TestBuildMcpServers_AcwSkippedWithoutCapabilityOrConfig(t *testing.T) {
|
||||
t.Parallel()
|
||||
// 无 http 能力 → 跳过自家 MCP
|
||||
out := buildMcpServers(nil, "http://x/mcp", "tok", false, false, slog.Default(), uuid.New())
|
||||
assert.Empty(t, out)
|
||||
// 未配置 public_url / token → 不注入
|
||||
out = buildMcpServers(nil, "", "tok", true, true, slog.Default(), uuid.New())
|
||||
assert.Empty(t, out)
|
||||
out = buildMcpServers(nil, "http://x/mcp", "", true, true, slog.Default(), uuid.New())
|
||||
assert.Empty(t, out)
|
||||
}
|
||||
|
||||
func TestBuildMcpServers_StdioBaselineNoTypeField(t *testing.T) {
|
||||
t.Parallel()
|
||||
specs := []McpServerSpec{{
|
||||
Name: "fs", Type: McpStdio, Command: "/bin/mcp-fs",
|
||||
Env: map[string]string{"B": "2", "A": "1"},
|
||||
}}
|
||||
// stdio 不受能力门控(http/sse 均 false 仍下发)
|
||||
out := buildMcpServers(specs, "", "", false, false, slog.Default(), uuid.New())
|
||||
require.Len(t, out, 1)
|
||||
|
||||
j := marshalServers(t, out)
|
||||
// ACP v1:stdio 无 type 判别字段;args/env 必填(空数组);env 按 key 排序
|
||||
assert.NotContains(t, j, `"type"`)
|
||||
assert.Contains(t, j, `"command":"/bin/mcp-fs"`)
|
||||
assert.Contains(t, j, `"args":[]`)
|
||||
assert.Contains(t, j, `"env":[{"name":"A","value":"1"},{"name":"B","value":"2"}]`)
|
||||
}
|
||||
|
||||
func TestBuildMcpServers_CapabilityFiltering(t *testing.T) {
|
||||
t.Parallel()
|
||||
specs := []McpServerSpec{
|
||||
{Name: "h", Type: McpHTTP, URL: "http://h"},
|
||||
{Name: "s", Type: McpSSE, URL: "http://s"},
|
||||
{Name: "io", Type: McpStdio, Command: "/x"},
|
||||
}
|
||||
|
||||
// 仅 http 能力:sse 条目被跳过
|
||||
out := buildMcpServers(specs, "", "", true, false, slog.Default(), uuid.New())
|
||||
j := marshalServers(t, out)
|
||||
require.Len(t, out, 2)
|
||||
assert.Contains(t, j, `"name":"h"`)
|
||||
assert.NotContains(t, j, `"name":"s"`)
|
||||
assert.Contains(t, j, `"name":"io"`)
|
||||
|
||||
// 全能力:全部下发,sse 条目 type 正确
|
||||
out = buildMcpServers(specs, "", "", true, true, slog.Default(), uuid.New())
|
||||
require.Len(t, out, 3)
|
||||
assert.Contains(t, marshalServers(t, out), `"type":"sse"`)
|
||||
}
|
||||
Reference in New Issue
Block a user