Full pipeline: IMAP ingress -> OpenClaw dispatch -> callback -> SMTP reply. SQLite stateful storage with idempotency, threading, and retry logic. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
36 lines
540 B
Go
36 lines
540 B
Go
package database
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// TestDB holds a test database instance with automatic cleanup.
|
|
type TestDB struct {
|
|
DB *gorm.DB
|
|
cleanup func()
|
|
}
|
|
|
|
// NewTestDB creates a temporary SQLite database for testing.
|
|
func NewTestDB(t *testing.T) *TestDB {
|
|
t.Helper()
|
|
|
|
dir := t.TempDir()
|
|
dbPath := filepath.Join(dir, "test.db")
|
|
|
|
db, err := Open(dbPath)
|
|
if err != nil {
|
|
t.Fatalf("open test db: %v", err)
|
|
}
|
|
|
|
return &TestDB{
|
|
DB: db,
|
|
cleanup: func() {
|
|
os.RemoveAll(dir)
|
|
},
|
|
}
|
|
}
|