Files
dingtalk-workspace-cli/internal/helpers/aisearch_test.go

100 lines
3.8 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.
package helpers
import (
"strings"
"testing"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/corecmd/runtimeannotate"
)
func TestAisearchPersonFlagsDoNotLeakIntoContentCommands(t *testing.T) {
root := newAisearchCommand()
person, _, err := root.Find([]string{"person"})
if err != nil {
t.Fatal(err)
}
for _, name := range []string{"query", "dimension"} {
flag := person.Flags().Lookup(name)
if flag == nil || flag.Hidden {
t.Fatalf("person --%s = %#v, want visible local flag", name, flag)
}
}
if person.Flags().Lookup("query").Shorthand != "" {
t.Fatal("new Primary --query must not acquire a shorthand")
}
keyword := person.Flags().Lookup("keyword")
if keyword == nil || !keyword.Hidden || keyword.Shorthand != "w" {
t.Fatalf("person --keyword = %#v, want hidden legacy flag with -w", keyword)
}
if got := keyword.Annotations[runtimeannotate.AnnotationFlagAliasOf]; len(got) != 1 || got[0] != "query" {
t.Fatalf("person --keyword alias_of = %#v, want query", got)
}
if got := keyword.Annotations[runtimeannotate.AnnotationFlagAliasOrigin]; len(got) != 1 || got[0] != runtimeannotate.FlagAliasOriginCorecmdV1 {
t.Fatalf("person --keyword alias_origin = %#v, want %q", got, runtimeannotate.FlagAliasOriginCorecmdV1)
}
for _, name := range []string{"name", "q", "text"} {
flag := person.Flags().Lookup(name)
if flag == nil || !flag.Hidden {
t.Fatalf("person --%s = %#v, want preserved hidden guess flag", name, flag)
}
if got := flag.Annotations[runtimeannotate.AnnotationFlagAliasOf]; len(got) != 0 {
t.Fatalf("person --%s unexpectedly gained alias_of metadata: %#v", name, got)
}
}
for _, path := range []string{"enterprise", "behavior"} {
cmd, _, err := root.Find([]string{path})
if err != nil {
t.Fatal(err)
}
if flag := cmd.Flags().Lookup("dimension"); flag != nil {
t.Fatalf("%s unexpectedly accepts person-only --dimension", path)
}
for _, name := range []string{"keyword", "query"} {
flag := cmd.Flags().Lookup(name)
if flag == nil || !flag.Hidden {
t.Fatalf("%s --%s = %#v, want hidden compatibility flag", path, name, flag)
}
}
}
}
func TestAisearchPersonQueryPrimaryCompatibility(t *testing.T) {
tests := []struct {
name string
args []string
want string
}{
{name: "root new", args: []string{"--query", "new"}, want: "new"},
{name: "root old", args: []string{"--keyword", "old"}, want: "old"},
{name: "root old shorthand", args: []string{"-w", "old-short"}, want: "old-short"},
{name: "root both old wins", args: []string{"--query", "new", "--keyword", "old"}, want: "old"},
{name: "person new", args: []string{"person", "--query", "new"}, want: "new"},
{name: "person old", args: []string{"person", "--keyword", "old"}, want: "old"},
{name: "person old shorthand", args: []string{"person", "-w", "old-short"}, want: "old-short"},
{name: "person both old wins", args: []string{"person", "--query", "new", "--keyword", "old"}, want: "old"},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
caller := &scriptedToolCaller{}
installScriptedCaller(t, caller)
if err := executeFilterCoverage(t, newAisearchCommand(), tc.args...); err != nil {
t.Fatal(err)
}
if caller.tool != "enterprise_person_search" || caller.args["keyword"] != tc.want {
t.Fatalf("call = %s %#v, want backend keyword %q", caller.tool, caller.args, tc.want)
}
})
}
installScriptedCaller(t, &scriptedToolCaller{})
err := executeFilterCoverage(t, newAisearchCommand(), "person")
if err == nil || !strings.Contains(err.Error(), "--query") || strings.Contains(err.Error(), "--keyword") {
t.Fatalf("missing query error = %v, want only new Primary", err)
}
}