75 lines
3.3 KiB
Go
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")
|
|
}
|
|
}
|