// Package testutil provides testing utilities for rdev-api. package testutil import ( "context" "database/sql" "os" "testing" "time" _ "github.com/lib/pq" // PostgreSQL driver ) // TestDB returns a database connection for testing. // Uses TEST_DATABASE_URL or falls back to the standard local dev connection. func TestDB(t *testing.T) *sql.DB { t.Helper() dsn := os.Getenv("TEST_DATABASE_URL") if dsn == "" { dsn = "postgres://appuser:localdev@localhost:5433/rdev?sslmode=disable" } db, err := sql.Open("postgres", dsn) if err != nil { t.Fatalf("open database: %v", err) } // Verify connection ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := db.PingContext(ctx); err != nil { t.Skipf("database not available: %v", err) } t.Cleanup(func() { db.Close() }) return db } // CleanupTestKeys removes all test keys from the database. func CleanupTestKeys(t *testing.T, db *sql.DB) { t.Helper() _, err := db.Exec("DELETE FROM api_keys WHERE name LIKE 'test-%'") if err != nil { t.Fatalf("cleanup test keys: %v", err) } } // TimePtr returns a pointer to a time.Time. func TimePtr(t time.Time) *time.Time { return &t } // MustParseTime parses a time string or panics. func MustParseTime(layout, value string) time.Time { t, err := time.Parse(layout, value) if err != nil { panic(err) } return t }