Files
agentic-coding-workflow/internal/acp/mcp_inject_internal_test.go
T
2026-06-12 11:44:19 +08:00

83 lines
2.7 KiB
Go

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"`)
}