package store import ( "context" "path/filepath" "testing" ) func TestOpenCreatesSchema(t *testing.T) { ctx := context.Background() path := filepath.Join(t.TempDir(), "nested", "email_agent.db") s, err := Open(ctx, path) if err != nil { t.Fatalf("Open() error = %v", err) } defer s.Close() v, err := s.SchemaVersion(ctx) if err != nil { t.Fatalf("SchemaVersion() error = %v", err) } if v < 1 { t.Fatalf("SchemaVersion() = %d, want >= 1", v) } wantTables := []string{ "messages", "classifications", "rules", "actions_log", "unsubscribe", "drafts", "summaries", } for _, table := range wantTables { var name string err := s.DB().QueryRowContext(ctx, `SELECT name FROM sqlite_master WHERE type='table' AND name=?`, table).Scan(&name) if err != nil { t.Errorf("table %q missing: %v", table, err) } } } func TestOpenIsIdempotent(t *testing.T) { ctx := context.Background() path := filepath.Join(t.TempDir(), "email_agent.db") s1, err := Open(ctx, path) if err != nil { t.Fatalf("first Open() error = %v", err) } _ = s1.Close() s2, err := Open(ctx, path) if err != nil { t.Fatalf("second Open() error = %v", err) } defer s2.Close() if err := s2.Ping(ctx); err != nil { t.Fatalf("Ping() error = %v", err) } } func TestMessagesInsertAndRead(t *testing.T) { ctx := context.Background() s, err := Open(ctx, filepath.Join(t.TempDir(), "email_agent.db")) if err != nil { t.Fatalf("Open() error = %v", err) } defer s.Close() _, err = s.DB().ExecContext(ctx, `INSERT INTO messages (gmail_id, subject, source_address) VALUES (?, ?, ?)`, "abc123", "Hello", "hello@where-woof.com") if err != nil { t.Fatalf("insert message: %v", err) } var subject string if err := s.DB().QueryRowContext(ctx, `SELECT subject FROM messages WHERE gmail_id = ?`, "abc123").Scan(&subject); err != nil { t.Fatalf("select message: %v", err) } if subject != "Hello" { t.Errorf("subject = %q, want %q", subject, "Hello") } }