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) } }