Files
synapbus/internal/storage/sqlite_test.go
T
Algis DumbrisandClaude Opus 4.6 2f55ce87c3 feat: implement core foundation (storage, messaging, agents, MCP server)
Implements the foundational layer that all SynapBus features depend on:

- internal/storage: SQLite connection manager (WAL mode, busy_timeout,
  foreign_keys) and embedded migration runner using modernc.org/sqlite
- internal/messaging: MessagingService with send, read inbox, claim,
  mark done/failed, and FTS5 search. SQLite-backed MessageStore with
  conversation auto-creation and read/unread tracking via inbox_state.
- internal/agents: AgentService with register, authenticate (bcrypt),
  update, deregister, discover by capability. HTTP auth middleware.
- internal/mcp: MCP server using mark3labs/mcp-go with 9 registered
  tools (send_message, read_inbox, claim_messages, mark_done,
  search_messages, register_agent, discover_agents, update_agent,
  deregister_agent). SSE transport, health endpoint, connection manager.
- internal/trace: Async trace recorder with buffered channel for
  recording agent actions to SQLite traces table.
- cmd/synapbus: Updated main.go wiring storage, migrations, services,
  MCP server, chi router, and graceful shutdown.

All code compiles with CGO_ENABLED=0. Full test suite passes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:45:22 +02:00

83 lines
1.8 KiB
Go

package storage
import (
"context"
"testing"
)
func TestNew(t *testing.T) {
tests := []struct {
name string
dataDir string
wantErr bool
}{
{
name: "in-memory database",
dataDir: ":memory:",
wantErr: false,
},
{
name: "empty string creates in-memory",
dataDir: "",
wantErr: false,
},
{
name: "temp directory",
dataDir: t.TempDir(),
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
db, err := New(ctx, tt.dataDir)
if (err != nil) != tt.wantErr {
t.Fatalf("New() error = %v, wantErr %v", err, tt.wantErr)
}
if err != nil {
return
}
defer db.Close()
// Verify WAL mode (in-memory uses "memory" journal mode)
if tt.dataDir != "" && tt.dataDir != ":memory:" {
var journalMode string
err = db.QueryRow("PRAGMA journal_mode").Scan(&journalMode)
if err != nil {
t.Fatalf("failed to query journal_mode: %v", err)
}
if journalMode != "wal" {
t.Errorf("journal_mode = %s, want wal", journalMode)
}
}
// Verify foreign keys are enabled
var fk int
err = db.QueryRow("PRAGMA foreign_keys").Scan(&fk)
if err != nil {
t.Fatalf("failed to query foreign_keys: %v", err)
}
if fk != 1 {
t.Errorf("foreign_keys = %d, want 1", fk)
}
// Verify busy_timeout
var timeout int
err = db.QueryRow("PRAGMA busy_timeout").Scan(&timeout)
if err != nil {
t.Fatalf("failed to query busy_timeout: %v", err)
}
if timeout != 5000 {
t.Errorf("busy_timeout = %d, want 5000", timeout)
}
// Verify database is usable
_, err = db.Exec("CREATE TABLE test (id INTEGER PRIMARY KEY)")
if err != nil {
t.Fatalf("failed to create test table: %v", err)
}
})
}
}