package testutil import ( "os" "strings" "testing" "github.com/google/uuid" "github.com/jmoiron/sqlx" internaldb "github.com/kandev/kandev/internal/db" ) // OpenIsolatedPostgres opens dsn with a unique schema on a single connection. // It lets package tests share one Postgres database without racing on // DROP SCHEMA public when Go runs packages in parallel. func OpenIsolatedPostgres(t testing.TB, dsn string) *sqlx.DB { t.Helper() schema := "kandev_test_" + strings.ReplaceAll(uuid.NewString(), "-", "") raw, err := internaldb.OpenPostgres(dsn, 1, 1) if err != nil { t.Fatalf("open postgres: %v", err) } db := sqlx.NewDb(raw, "pgx") db.SetMaxOpenConns(1) db.SetMaxIdleConns(1) if _, err := db.Exec("CREATE SCHEMA " + schema); err != nil { _ = db.Close() t.Fatalf("create postgres schema %s: %v", schema, err) } t.Cleanup(func() { _, _ = db.Exec("DROP SCHEMA IF EXISTS " + schema + " CASCADE") _ = db.Close() }) if _, err := db.Exec("SET search_path TO " + schema); err != nil { t.Fatalf("set postgres search_path %s: %v", schema, err) } return db } func PostgresDSNFromEnv(t testing.TB) string { t.Helper() dsn := os.Getenv("KANDEV_TEST_POSTGRES_DSN") if dsn == "" { t.Skip("set KANDEV_TEST_POSTGRES_DSN to run Postgres tests") } return dsn }