feat(backthink): 后台自主思考(heartbeat+事件触发 + 打扰决策 fail-closed + 主动推送活跃→IM 兜底 + 限制 + 思考记录)
This commit is contained in:
1 parent
05e23ea590
commit
6f97fded3a
13 files changed
+1968
No files matched your search
@@ -0,0 +1,86 @@
|
||||
package backthink
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestStore_AppendList(t *testing.T) {
|
||||
t.Parallel()
|
||||
s, err := NewStore(context.Background(), newTestDB(t), discardLog())
|
||||
if err != nil {
|
||||
t.Fatalf("NewStore: %v", err)
|
||||
}
|
||||
|
||||
base := time.Date(2026, 9, 6, 10, 0, 0, 0, time.UTC)
|
||||
for i := 0; i < 3; i++ {
|
||||
id, err := s.Append(context.Background(), Record{
|
||||
Trigger: "iot.device_update",
|
||||
At: base.Add(time.Duration(i) * time.Minute),
|
||||
Conclusion: "nothing to report",
|
||||
ShouldPush: i%2 == 0,
|
||||
PushResult: PushResult{Pushed: i == 2, Route: RouteActiveClient, Detail: "ok"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Append %d: %v", i, err)
|
||||
}
|
||||
if id != int64(i+1) {
|
||||
t.Fatalf("Append id = %d, want %d", id, i+1)
|
||||
}
|
||||
}
|
||||
|
||||
records, err := s.List(context.Background(), 0)
|
||||
if err != nil {
|
||||
t.Fatalf("List: %v", err)
|
||||
}
|
||||
if len(records) != 3 {
|
||||
t.Fatalf("len = %d, want 3", len(records))
|
||||
}
|
||||
// Newest first (descending id).
|
||||
if records[0].ID != 3 || records[1].ID != 2 || records[2].ID != 1 {
|
||||
t.Fatalf("order = %d,%d,%d, want 3,2,1", records[0].ID, records[1].ID, records[2].ID)
|
||||
}
|
||||
if !records[0].ShouldPush {
|
||||
t.Fatalf("records[0].ShouldPush = false, want true")
|
||||
}
|
||||
if !records[0].PushResult.Pushed || records[0].PushResult.Route != RouteActiveClient {
|
||||
t.Fatalf("records[0].PushResult = %+v, want pushed active_client", records[0].PushResult)
|
||||
}
|
||||
if !records[0].At.Equal(base.Add(2 * time.Minute)) {
|
||||
t.Fatalf("records[0].At = %v, want %v", records[0].At, base.Add(2*time.Minute))
|
||||
}
|
||||
}
|
||||
|
||||
func TestStore_List_Limit(t *testing.T) {
|
||||
t.Parallel()
|
||||
s, err := NewStore(context.Background(), newTestDB(t), discardLog())
|
||||
if err != nil {
|
||||
t.Fatalf("NewStore: %v", err)
|
||||
}
|
||||
for i := 0; i < 5; i++ {
|
||||
if _, err := s.Append(context.Background(), Record{Trigger: "heartbeat", Conclusion: "x"}); err != nil {
|
||||
t.Fatalf("Append %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
|
||||
records, err := s.List(context.Background(), 2)
|
||||
if err != nil {
|
||||
t.Fatalf("List: %v", err)
|
||||
}
|
||||
if len(records) != 2 {
|
||||
t.Fatalf("len = %d, want 2", len(records))
|
||||
}
|
||||
if records[0].ID != 5 || records[1].ID != 4 {
|
||||
t.Fatalf("ids = %d,%d, want 5,4", records[0].ID, records[1].ID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStore_NewStore_NilDB(t *testing.T) {
|
||||
t.Parallel()
|
||||
_, err := NewStore(context.Background(), nil, discardLog())
|
||||
if !errors.Is(err, ErrNilDB) {
|
||||
t.Fatalf("err = %v, want ErrNilDB", err)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user