Files
dingtalk-workspace-cli/internal/helpers/wiki_proxy_test.go
539d10f80f feat: 合并 pre-mcp-discovery 分支能力到 main(服务发现保持生产) (#391)
将 test/pre-mcp-discovery 分支上多位同学的能力改动整体合入 main,
服务发现端点保持生产 https://mcp.dingtalk.com,未携带分支上的预发改动。

主要内容:
- 修雨域(chat / report / todo / contact / mail)对齐 wukong 基线 (#355)
- DWS 内容生产能力增强 (#387)、文档导出与 OA 对齐 (#362 #388 #390)
- envelope 注册 cli.Aliases 为 cobra aliases、命令结构与 JSON 解析优化
- skills 多包同步 wukong 对齐内容(attendance/calendar/minutes/oa/sheet 等)
- product/oa 进一步对齐 wukong

排除项:未携带 566b4e1(test: point service discovery to pre-mcp.dingtalk.com);
以下 4 个常量保持生产:skill_command.go / auth/endpoints.go / cli/loader.go / market/registry.go。

Co-authored-by: john <32427341+wqyenjoy@users.noreply.github.com>
Co-authored-by: wxianfeng <wang.fl1429@gmail.com>
2026-06-02 21:04:12 +08:00

139 lines
4.1 KiB
Go

// Copyright 2026 Alibaba Group
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package helpers
import (
"bytes"
"reflect"
"strings"
"testing"
)
func TestWikiTopLevelListProxyExecutesSpaceList(t *testing.T) {
t.Parallel()
runner := &wikiCommandRunner{}
cmd := wikiHandler{}.Command(runner)
var out, errOut bytes.Buffer
cmd.SetOut(&out)
cmd.SetErr(&errOut)
cmd.SetArgs([]string{"list", "--format", "json"})
if err := cmd.Execute(); err != nil {
t.Fatalf("Execute() error = %v\nstderr:\n%s", err, errOut.String())
}
if !strings.Contains(strings.ToLower(errOut.String()), "redirecting to") {
t.Fatalf("stderr = %q, want redirecting hint", errOut.String())
}
if runner.last.CanonicalProduct != "wiki" {
t.Fatalf("product = %q, want wiki", runner.last.CanonicalProduct)
}
if runner.last.Tool != "list_wikiSpaces" {
t.Fatalf("tool = %q, want list_wikiSpaces", runner.last.Tool)
}
if runner.last.LegacyPath != "wiki space list" {
t.Fatalf("legacy path = %q, want wiki space list", runner.last.LegacyPath)
}
}
func TestWikiNodeReadProxyExecutesDocRead(t *testing.T) {
t.Parallel()
runner := &wikiCommandRunner{}
cmd := wikiHandler{}.Command(runner)
var out, errOut bytes.Buffer
cmd.SetOut(&out)
cmd.SetErr(&errOut)
cmd.SetArgs([]string{"node", "read", "--node", "NODE_001", "--format", "json"})
if err := cmd.Execute(); err != nil {
t.Fatalf("Execute() error = %v\nstderr:\n%s", err, errOut.String())
}
if !strings.Contains(strings.ToLower(errOut.String()), "redirecting to") {
t.Fatalf("stderr = %q, want redirecting hint", errOut.String())
}
if runner.last.CanonicalProduct != "doc" {
t.Fatalf("product = %q, want doc", runner.last.CanonicalProduct)
}
if runner.last.Tool != "get_document_content" {
t.Fatalf("tool = %q, want get_document_content", runner.last.Tool)
}
if got := runner.last.Params["nodeId"]; got != "NODE_001" {
t.Fatalf("nodeId = %#v, want NODE_001", got)
}
}
func TestWikiFileSearchProxyRenamesWorkspace(t *testing.T) {
t.Parallel()
runner := &wikiCommandRunner{}
cmd := wikiHandler{}.Command(runner)
var out, errOut bytes.Buffer
cmd.SetOut(&out)
cmd.SetErr(&errOut)
cmd.SetArgs([]string{
"file", "search",
"--query", "测试",
"--workspace", "WS_001",
"--format", "json",
})
if err := cmd.Execute(); err != nil {
t.Fatalf("Execute() error = %v\nstderr:\n%s", err, errOut.String())
}
if runner.last.CanonicalProduct != "doc" {
t.Fatalf("product = %q, want doc", runner.last.CanonicalProduct)
}
if runner.last.Tool != "search_documents" {
t.Fatalf("tool = %q, want search_documents", runner.last.Tool)
}
if got := runner.last.Params["keyword"]; got != "测试" {
t.Fatalf("keyword = %#v, want 测试", got)
}
if got := runner.last.Params["workspaceIds"]; !reflect.DeepEqual(got, []string{"WS_001"}) {
t.Fatalf("workspaceIds = %#v, want []string{WS_001}", got)
}
}
func TestWikiProxyUnknownSubcommandsDoNotPanic(t *testing.T) {
t.Parallel()
cases := [][]string{
{"node", "delete", "--node", "FAKE"},
{"file", "read", "--node", "FAKE"},
}
for _, args := range cases {
args := args
t.Run(strings.Join(args[:2], " "), func(t *testing.T) {
t.Parallel()
runner := &wikiCommandRunner{}
cmd := wikiHandler{}.Command(runner)
var out, errOut bytes.Buffer
cmd.SetOut(&out)
cmd.SetErr(&errOut)
cmd.SetArgs(args)
err := cmd.Execute()
if err == nil {
t.Fatalf("Execute() error = nil, want unknown subcommand")
}
combined := strings.ToLower(out.String() + errOut.String() + err.Error())
if strings.Contains(combined, "panic") || strings.Contains(combined, "runtime error") {
t.Fatalf("unexpected panic output: %s", combined)
}
})
}
}