Files
knowledge-governance/internal/dingtalkdiscovery/docs_test.go
T
hermes 020cae1228
build / build (push) Successful in 1m9s
style: gofmt 新增的发现与路由文件
2026-10-26 17:23:27 +08:00

75 lines
3.3 KiB
Go

package dingtalkdiscovery
import (
"context"
"errors"
"strings"
"testing"
)
const recentDocsFixture = `{"ok":true,"data":{"count":2,"hasMore":false,"items":[
{"nodeId":"node-a","nodeType":"file","name":"售后周会纪要","docUrl":"https://alidocs.dingtalk.com/i/nodes/node-a","contentType":"ALIDOC","accessTime":"2026-10-25T10:00:00Z"},
{"nodeId":"node-b","nodeType":"file","name":"服务工单统计","docUrl":"https://alidocs.dingtalk.com/i/nodes/node-b","contentType":"ALISHEET","accessTime":"2026-10-24T09:00:00Z"}]}}`
func TestDiscoverDocsListsRecentDocumentsWithTheirType(t *testing.T) {
runner := &fakeRunner{responses: map[string]string{strings.Join(RecentDocsArgs(50), " "): recentDocsFixture}}
result, err := DiscoverDocs(context.Background(), runner, "", 50)
if err != nil {
t.Fatalf("discover docs: %v", err)
}
if len(result.Documents) != 2 {
t.Fatalf("documents = %d, want 2", len(result.Documents))
}
// 文档与表格必须能区分:表格要走 sheet 校验,文档走 doc。
if got := result.Documents[1]; got.ContentType != "ALISHEET" || !IsSheet(got.ContentType) {
t.Fatalf("sheet node not recognised: %+v", got)
}
if IsSheet(result.Documents[0].ContentType) {
t.Fatal("an ALIDOC document must not be treated as a sheet")
}
}
func TestDiscoverDocsSearchesByKeywordWhenOneIsGiven(t *testing.T) {
runner := &fakeRunner{responses: map[string]string{strings.Join(SearchDocsArgs("周会", 50), " "): recentDocsFixture}}
if _, err := DiscoverDocs(context.Background(), runner, " 周会 ", 50); err != nil {
t.Fatalf("search docs: %v", err)
}
if got := runner.seen[0]; !strings.Contains(got, "+search-docs") || !strings.Contains(got, "--query 周会") {
t.Fatalf("keyword search was not used: %s", got)
}
}
func TestDiscoverDocsReportsUnavailableInsteadOfAnEmptyList(t *testing.T) {
runner := &fakeRunner{failures: map[string]error{strings.Join(RecentDocsArgs(50), " "): errors.New("token expired")}}
if _, err := DiscoverDocs(context.Background(), runner, "", 50); !errors.Is(err, ErrUnavailable) {
t.Fatalf("want ErrUnavailable, got %v", err)
}
}
func TestValidateDocumentAsksForSheetSheetsWhenTheNodeIsATable(t *testing.T) {
runner := &fakeRunner{responses: map[string]string{
strings.Join(DocInfoArgs("node-b"), " "): `{"ok":true,"data":{"nodeId":"node-b","name":"服务工单统计","contentType":"ALISHEET"}}`,
strings.Join(SheetListArgs("node-b"), " "): `{"ok":true,"data":{"sheets":[{"sheetId":"s1","name":"10月"}]}}`,
}}
doc, err := ValidateDocument(context.Background(), runner, "node-b")
if err != nil {
t.Fatalf("validate: %v", err)
}
if doc.Name != "服务工单统计" {
t.Fatalf("name = %q", doc.Name)
}
if len(runner.seen) != 2 || !strings.HasPrefix(runner.seen[1], "sheet list") {
t.Fatalf("a table must be verified with sheet list, calls = %v", runner.seen)
}
}
func TestValidateDocumentRejectsUnreadableNodes(t *testing.T) {
runner := &fakeRunner{failures: map[string]error{strings.Join(DocInfoArgs("node-x"), " "): errors.New("404")}}
if _, err := ValidateDocument(context.Background(), runner, "node-x"); !errors.Is(err, ErrUnavailable) {
t.Fatalf("want ErrUnavailable, got %v", err)
}
if _, err := ValidateDocument(context.Background(), runner, " "); !errors.Is(err, ErrUnavailable) {
t.Fatal("an empty node must not validate")
}
}