daemon: integrate QoL slices 1-5 (model/rename/catalog, history deletes, stats, repo prepare+imageUsed+built) — 95.3% cover green
This commit is contained in:
@@ -166,3 +166,85 @@ func TestStoreEventsLatestAndBefore(t *testing.T) {
|
||||
t.Fatalf("latest unknown session = %d events, want 0", len(missing))
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreDeleteSessionEvents(t *testing.T) {
|
||||
store := openTestStore(t)
|
||||
for _, e := range []Event{
|
||||
{SessionID: "s1", Seq: 1, TS: 10, Type: evMessageStart, Payload: []byte(`{}`)},
|
||||
{SessionID: "s1", Seq: 2, TS: 11, Type: evMessageEnd, Payload: []byte(`{}`)},
|
||||
{SessionID: "s2", Seq: 1, TS: 12, Type: evAgentSettled, Payload: []byte(`{}`)},
|
||||
} {
|
||||
if err := store.AppendEvent(e); err != nil {
|
||||
t.Fatalf("append %s#%d: %v", e.SessionID, e.Seq, err)
|
||||
}
|
||||
}
|
||||
|
||||
deleted, err := store.DeleteSessionEvents("s1")
|
||||
if err != nil || deleted != 2 {
|
||||
t.Fatalf("delete s1 events = %d %v, want 2 nil", deleted, err)
|
||||
}
|
||||
if evts, _ := store.EventsAfter("s1", 0, 100); len(evts) != 0 {
|
||||
t.Fatalf("s1 events after delete = %d, want 0", len(evts))
|
||||
}
|
||||
if last, _ := store.LastSeq("s1"); last != 0 {
|
||||
t.Fatalf("s1 lastSeq after delete = %d, want 0", last)
|
||||
}
|
||||
// other sessions untouched
|
||||
evts, err := store.EventsAfter("s2", 0, 100)
|
||||
if err != nil || len(evts) != 1 || evts[0].Seq != 1 {
|
||||
t.Fatalf("s2 events = %v %v, want seq 1 only", evts, err)
|
||||
}
|
||||
|
||||
// unknown / already-cleared session: 0 rows, no error
|
||||
if deleted, err := store.DeleteSessionEvents("s1"); err != nil || deleted != 0 {
|
||||
t.Fatalf("second delete = %d %v, want 0 nil", deleted, err)
|
||||
}
|
||||
if deleted, err := store.DeleteSessionEvents("ghost"); err != nil || deleted != 0 {
|
||||
t.Fatalf("unknown session = %d %v, want 0 nil", deleted, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreDeleteSession(t *testing.T) {
|
||||
store := openTestStore(t)
|
||||
name := "gone"
|
||||
if err := store.UpsertSession(SessionInfo{ID: "s1", Name: &name, Cwd: "/w", Model: "glm-5.3", Provider: "zai-renaud", StartedAt: 1}); err != nil {
|
||||
t.Fatalf("upsert s1: %v", err)
|
||||
}
|
||||
if err := store.UpsertSession(SessionInfo{ID: "s2", Cwd: "/w2", Model: "glm-5.3", Provider: "zai-renaud", StartedAt: 2}); err != nil {
|
||||
t.Fatalf("upsert s2: %v", err)
|
||||
}
|
||||
if err := store.UpsertContainer("s1", "cid", "group/proj"); err != nil {
|
||||
t.Fatalf("upsert container: %v", err)
|
||||
}
|
||||
for _, e := range []Event{
|
||||
{SessionID: "s1", Seq: 1, TS: 10, Type: evMessageStart, Payload: []byte(`{}`)},
|
||||
{SessionID: "s2", Seq: 1, TS: 10, Type: evMessageStart, Payload: []byte(`{}`)},
|
||||
} {
|
||||
if err := store.AppendEvent(e); err != nil {
|
||||
t.Fatalf("append: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := store.DeleteSession("s1"); err != nil {
|
||||
t.Fatalf("delete session: %v", err)
|
||||
}
|
||||
rows, err := store.Sessions()
|
||||
if err != nil || len(rows) != 1 || rows[0].ID != "s2" {
|
||||
t.Fatalf("sessions after delete = %v %v, want only s2", rows, err)
|
||||
}
|
||||
if evts, _ := store.EventsAfter("s1", 0, 100); len(evts) != 0 {
|
||||
t.Fatalf("s1 events after delete = %d, want 0", len(evts))
|
||||
}
|
||||
if _, ok, _ := store.GetContainer("s1"); ok {
|
||||
t.Fatal("s1 container row should be gone")
|
||||
}
|
||||
// s2 untouched
|
||||
if evts, _ := store.EventsAfter("s2", 0, 100); len(evts) != 1 {
|
||||
t.Fatalf("s2 events after delete = %d, want 1", len(evts))
|
||||
}
|
||||
|
||||
// idempotent: unknown session deletes cleanly
|
||||
if err := store.DeleteSession("ghost"); err != nil {
|
||||
t.Fatalf("delete unknown session: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user