Files
agent-dashboard/internal/inbox/store_test.go
T
2026-05-26 17:49:31 +08:00

132 lines
3.1 KiB
Go

package inbox
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestAppendCreatesJSONLFile(t *testing.T) {
dir := t.TempDir()
store := NewStore(filepath.Join(dir, "inbox.jsonl"))
rec := Record{
ID: "id-1",
Time: time.Date(2026, 5, 26, 16, 0, 0, 0, time.UTC),
Host: "host-a",
Agent: "cursor",
Event: "stop",
CWD: "/work/proj",
Title: "Cursor - proj",
Body: "等待输入",
Status: StatusPending,
}
if err := store.Append(rec); err != nil {
t.Fatal(err)
}
path := filepath.Join(dir, "inbox.jsonl")
if _, err := os.Stat(path); err != nil {
t.Fatalf("expected inbox file: %v", err)
}
recs, err := store.List()
if err != nil {
t.Fatal(err)
}
if len(recs) != 1 {
t.Fatalf("expected 1 record, got %d", len(recs))
}
if recs[0].ID != "id-1" || recs[0].Status != StatusPending {
t.Fatalf("unexpected record: %+v", recs[0])
}
}
func TestPendingFiltersDoneRecords(t *testing.T) {
store := NewStore(filepath.Join(t.TempDir(), "inbox.jsonl"))
mustAppend(t, store, Record{ID: "pending", Status: StatusPending})
mustAppend(t, store, Record{ID: "done", Status: StatusDone})
recs, err := store.Pending()
if err != nil {
t.Fatal(err)
}
if len(recs) != 1 || recs[0].ID != "pending" {
t.Fatalf("unexpected pending records: %+v", recs)
}
}
func TestMarkDoneRewritesMatchingRecords(t *testing.T) {
store := NewStore(filepath.Join(t.TempDir(), "inbox.jsonl"))
mustAppend(t, store, Record{ID: "a", Status: StatusPending})
mustAppend(t, store, Record{ID: "b", Status: StatusPending})
n, err := store.MarkDone([]string{"b"})
if err != nil {
t.Fatal(err)
}
if n != 1 {
t.Fatalf("expected 1 updated, got %d", n)
}
recs, err := store.List()
if err != nil {
t.Fatal(err)
}
if recs[0].Status != StatusPending || recs[1].Status != StatusDone {
t.Fatalf("unexpected statuses: %+v", recs)
}
}
func TestRemoveAndClearDone(t *testing.T) {
store := NewStore(filepath.Join(t.TempDir(), "inbox.jsonl"))
mustAppend(t, store, Record{ID: "a", Status: StatusPending})
mustAppend(t, store, Record{ID: "b", Status: StatusDone})
mustAppend(t, store, Record{ID: "c", Status: StatusPending})
removed, err := store.Remove([]string{"a"})
if err != nil {
t.Fatal(err)
}
if removed != 1 {
t.Fatalf("expected 1 removed, got %d", removed)
}
cleared, err := store.ClearDone()
if err != nil {
t.Fatal(err)
}
if cleared != 1 {
t.Fatalf("expected 1 cleared, got %d", cleared)
}
recs, err := store.List()
if err != nil {
t.Fatal(err)
}
if len(recs) != 1 || recs[0].ID != "c" {
t.Fatalf("unexpected records: %+v", recs)
}
}
func TestListSkipsInvalidJSONLLines(t *testing.T) {
path := filepath.Join(t.TempDir(), "inbox.jsonl")
data := []byte("{bad json\n{\"id\":\"ok\",\"status\":\"pending\"}\n")
if err := os.WriteFile(path, data, 0644); err != nil {
t.Fatal(err)
}
store := NewStore(path)
recs, err := store.List()
if err != nil {
t.Fatal(err)
}
if len(recs) != 1 || recs[0].ID != "ok" {
t.Fatalf("unexpected records: %+v", recs)
}
}
func mustAppend(t *testing.T, store Store, rec Record) {
t.Helper()
if err := store.Append(rec); err != nil {
t.Fatal(err)
}
}