test: ≥95% coverage — daemon 96.9% (go), web 95.5-99% (vitest 142 tests); store.ts hooks-order crash fix
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package main
|
||||
|
||||
// store_extra_test.go — open failure, closed-handle error branches, corrupt rows.
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestOpenStoreBadPath(t *testing.T) {
|
||||
if _, err := OpenStore(filepath.Join(t.TempDir(), "occupied.db", "x.db")); err == nil {
|
||||
t.Fatal("OpenStore under a file path must fail")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreClosedHandleErrors(t *testing.T) {
|
||||
store := openTestStore(t)
|
||||
if err := store.Close(); err != nil {
|
||||
t.Fatalf("close: %v", err)
|
||||
}
|
||||
errStr := func(err error) string {
|
||||
if err == nil {
|
||||
return ""
|
||||
}
|
||||
return err.Error()
|
||||
}
|
||||
if err := store.AppendEvent(Event{SessionID: "s", Seq: 1, Type: evAgentSettled}); errStr(err) == "" {
|
||||
t.Fatal("AppendEvent on closed store must error")
|
||||
}
|
||||
if _, err := store.LastSeq("s"); errStr(err) == "" {
|
||||
t.Fatal("LastSeq on closed store must error")
|
||||
}
|
||||
if _, err := store.EventsAfter("s", 0, 10); errStr(err) == "" {
|
||||
t.Fatal("EventsAfter on closed store must error")
|
||||
}
|
||||
if err := store.UpsertSession(SessionInfo{ID: "s"}); errStr(err) == "" {
|
||||
t.Fatal("UpsertSession on closed store must error")
|
||||
}
|
||||
if err := store.TouchSession("s", 1, 1); errStr(err) == "" {
|
||||
t.Fatal("TouchSession on closed store must error")
|
||||
}
|
||||
if err := store.SetOnline("s", true); errStr(err) == "" {
|
||||
t.Fatal("SetOnline on closed store must error")
|
||||
}
|
||||
if _, err := store.Sessions(); errStr(err) == "" {
|
||||
t.Fatal("Sessions on closed store must error")
|
||||
}
|
||||
if _, _, err := store.GetSetting("k"); errStr(err) == "" {
|
||||
t.Fatal("GetSetting on closed store must error")
|
||||
}
|
||||
if err := store.SetSetting("k", "v"); errStr(err) == "" {
|
||||
t.Fatal("SetSetting on closed store must error")
|
||||
}
|
||||
if err := store.DeleteSetting("k"); errStr(err) == "" {
|
||||
t.Fatal("DeleteSetting on closed store must error")
|
||||
}
|
||||
if err := store.UpsertContainer("s", "c", "r"); errStr(err) == "" {
|
||||
t.Fatal("UpsertContainer on closed store must error")
|
||||
}
|
||||
if _, _, err := store.GetContainer("s"); errStr(err) == "" {
|
||||
t.Fatal("GetContainer on closed store must error")
|
||||
}
|
||||
if err := store.DeleteContainer("s"); errStr(err) == "" {
|
||||
t.Fatal("DeleteContainer on closed store must error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreCorruptRows(t *testing.T) {
|
||||
store := openTestStore(t)
|
||||
|
||||
// undecodable info blob → Sessions errors
|
||||
if _, err := store.db.Exec(`INSERT INTO sessions(id, info) VALUES('bad', 'not json')`); err != nil {
|
||||
t.Fatalf("insert corrupt session: %v", err)
|
||||
}
|
||||
if _, err := store.Sessions(); err == nil || !strings.Contains(err.Error(), "decode session info") {
|
||||
t.Fatalf("Sessions with corrupt info = %v", err)
|
||||
}
|
||||
|
||||
// non-integer seq → EventsAfter scan error
|
||||
if _, err := store.db.Exec(`INSERT INTO events(sessionId, seq, ts, type, payload)
|
||||
VALUES('s1', 'not-a-number', 1, 'x', '{}')`); err != nil {
|
||||
t.Fatalf("insert corrupt event: %v", err)
|
||||
}
|
||||
if _, err := store.EventsAfter("s1", 0, 10); err == nil {
|
||||
t.Fatal("EventsAfter with text seq must scan-error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreAppendEventDefaultPayload(t *testing.T) {
|
||||
store := openTestStore(t)
|
||||
if err := store.AppendEvent(Event{SessionID: "s1", Seq: 1, TS: 1, Type: evBye}); err != nil {
|
||||
t.Fatalf("append empty payload: %v", err)
|
||||
}
|
||||
events, err := store.EventsAfter("s1", 0, 10)
|
||||
if err != nil || len(events) != 1 {
|
||||
t.Fatalf("events = %v %v", events, err)
|
||||
}
|
||||
if string(events[0].Payload) != "{}" {
|
||||
t.Fatalf("payload = %q, want {}", events[0].Payload)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user