From a6502c0888613bd0377a25e43de8ae306c4de4d7 Mon Sep 17 00:00:00 2001 From: bndw Date: Fri, 13 Feb 2026 17:41:13 -0800 Subject: feat: add SQLite storage layer with binary-first event persistence Storage implementation: - Concrete type with constructor (consumer-side interfaces) - Event storage: protobuf + zstd-compressed canonical JSON - Schema: events, deletions, replaceable_events, auth_challenges, rate_limits - WAL mode, STRICT typing, optimized indexes - Methods: StoreEvent, GetEvent, GetEventWithCanonical, DeleteEvent Dependencies: - modernc.org/sqlite v1.45.0 (pure Go SQLite driver) - github.com/klauspost/compress v1.18.4 (zstd compression) 366 lines, 10 tests passing --- internal/storage/storage_test.go | 70 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 internal/storage/storage_test.go (limited to 'internal/storage/storage_test.go') diff --git a/internal/storage/storage_test.go b/internal/storage/storage_test.go new file mode 100644 index 0000000..f2fe401 --- /dev/null +++ b/internal/storage/storage_test.go @@ -0,0 +1,70 @@ +package storage + +import ( + "testing" +) + +func TestNew(t *testing.T) { + // Test in-memory database + store, err := New(":memory:") + if err != nil { + t.Fatalf("failed to create storage: %v", err) + } + defer store.Close() + + // Verify database is accessible + if store.DB() == nil { + t.Fatal("DB() returned nil") + } + + // Verify schema was created by checking if tables exist + var count int + query := `SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name IN ('events', 'deletions', 'replaceable_events')` + err = store.DB().QueryRow(query).Scan(&count) + if err != nil { + t.Fatalf("failed to query tables: %v", err) + } + + if count != 3 { + t.Errorf("expected 3 main tables, got %d", count) + } +} + +func TestNewFileDatabase(t *testing.T) { + // Test file-based database + dbPath := t.TempDir() + "/test.db" + store, err := New(dbPath) + if err != nil { + t.Fatalf("failed to create file-based storage: %v", err) + } + defer store.Close() + + // Verify WAL mode is enabled + var walMode string + err = store.DB().QueryRow("PRAGMA journal_mode").Scan(&walMode) + if err != nil { + t.Fatalf("failed to query journal mode: %v", err) + } + + if walMode != "wal" { + t.Errorf("expected WAL mode, got %s", walMode) + } +} + +func TestClose(t *testing.T) { + store, err := New(":memory:") + if err != nil { + t.Fatalf("failed to create storage: %v", err) + } + + err = store.Close() + if err != nil { + t.Errorf("failed to close storage: %v", err) + } + + // Verify database is closed by attempting a query + err = store.DB().Ping() + if err == nil { + t.Error("expected error when pinging closed database") + } +} -- cgit v1.2.3