Files
kandev/apps/backend/internal/testutil/postgres.go
T
2026-06-14 17:47:40 +01:00

51 lines
1.2 KiB
Go

package testutil
import (
"os"
"strings"
"testing"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
_ "github.com/jackc/pgx/v5/stdlib"
)
// 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(), "-", "")
db, err := sqlx.Open("pgx", dsn)
if err != nil {
t.Fatalf("open postgres: %v", err)
}
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
}