package testutil import ( "context" "database/sql" "os" "path/filepath" "runtime" "testing" "time" "github.com/jackc/pgx/v5/pgxpool" _ "github.com/jackc/pgx/v5/stdlib" "github.com/pressly/goose/v3" ) func TestPool(t *testing.T) *pgxpool.Pool { t.Helper() dsn := os.Getenv("TEST_DATABASE_URL") if dsn == "" { t.Skip("TEST_DATABASE_URL not set") } db, err := sql.Open("pgx", dsn) if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = db.Close() }) if err := goose.SetDialect("postgres"); err != nil { t.Fatal(err) } if err := goose.Up(db, migrationsDir(t)); err != nil { t.Fatal(err) } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() pool, err := pgxpool.New(ctx, dsn) if err != nil { t.Fatal(err) } t.Cleanup(pool.Close) Truncate(t, pool) t.Cleanup(func() { Truncate(t, pool) }) return pool } func Truncate(t *testing.T, pool *pgxpool.Pool) { t.Helper() ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() _, err := pool.Exec(ctx, ` TRUNCATE widget_cache, widget_instances, service_urls, services, asset_files, groups RESTART IDENTITY CASCADE`) if err != nil { t.Fatal(err) } } func migrationsDir(t *testing.T) string { t.Helper() _, file, _, ok := runtime.Caller(0) if !ok { t.Fatal("cannot resolve testutil path") } return filepath.Clean(filepath.Join(filepath.Dir(file), "..", "..", "..", "db", "migrations")) }