sync: collector/ 同步自 inkstone/arcrun-rag@10eb2cb(桌面小幫手 0.18.53)

This commit is contained in:
2026-09-14 07:05:34 +08:00
parent bce422f6fe
commit e4327ecd37
13 changed files with 820 additions and 22 deletions
+85
View File
@@ -0,0 +1,85 @@
package main
import (
"strings"
"testing"
"time"
"arcrun-rag/collector"
)
// TestSyncingSubSaysWhereAndWhy 守住 `inkstone/arcrun-rag#200`
// 「同步中」底下那一行要講得出做到哪、卡在哪,不再是一句永遠不變的「請稍候」。
func TestSyncingSubSaysWhereAndWhy(t *testing.T) {
now := time.Date(2026, 9, 14, 0, 30, 0, 0, time.Local)
label := func(host string) string {
if host == "arcrun-cypher-executor.leo21c.workers.dev" {
return "leo21c"
}
return host
}
fresh := now.Add(-10 * time.Second).Format(time.RFC3339)
cases := []struct {
name string
in *collector.RoundProgress
want []string // 全部都要出現
not []string // 一個都不准出現
}{
{
name: "舊版 collector 沒寫 in_round=沿用原本那句",
in: nil,
want: []string{syncingSubFallback},
},
{
name: "正在送=講資料夾、知識庫、哪件事、送了幾份",
in: &collector.RoundProgress{
Account: "arcrun-cypher-executor.leo21c.workers.dev", Folder: "/Users/x/Documents/tech_projects/ISEP",
Step: "送出一份筆記", Ingested: 11, UpdatedAt: fresh,
},
want: []string{"正在處理 ISEPleo21c", "送出一份筆記", "這一輪已送上 11 份"},
not: []string{"請稍候", "分鐘沒有新進展"},
},
{
name: "卡住=只講卡在哪",
in: &collector.RoundProgress{
Account: "arcrun-cypher-executor.leo21c.workers.dev", Folder: "/Users/x/Documents/KB",
Step: "送出目錄索引", UpdatedAt: fresh,
Waiting: &collector.StalledCall{Step: "送出目錄索引",
Note: "還在等知識庫「arcrun-cypher-executor.leo21c.workers.dev」回覆「送出目錄索引」,已經等了 30 秒。"},
},
want: []string{"卡在「KBleo21c)」", "已經等了 30 秒"},
not: []string{"請稍候", "正在處理"},
},
{
name: "很久沒有任何寫入=明講沒在動",
in: &collector.RoundProgress{
Account: "arcrun-cypher-executor.leo21c.workers.dev", Step: "確認雲端 AI 可不可以用",
UpdatedAt: now.Add(-12 * time.Minute).Format(time.RFC3339),
},
want: []string{"正在處理 leo21c", "已經 12 分鐘沒有新進展"},
},
{
name: "有失敗也要說",
in: &collector.RoundProgress{
Account: "h", Folder: "/a/B", Ingested: 2, Failed: 1, UpdatedAt: fresh,
},
want: []string{"這一輪已送上 2 份", "1 份沒送成功"},
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := syncingSub(c.in, now, label)
for _, w := range c.want {
if !strings.Contains(got, w) {
t.Errorf("缺「%s」:%q", w, got)
}
}
for _, n := range c.not {
if strings.Contains(got, n) {
t.Errorf("不該出現「%s」:%q", n, got)
}
}
})
}
}