Files
kandev/apps/backend/internal/testutil/postgres.go
T
2026-09-07 19:28:31 +01:00

52 lines
1.3 KiB
Go

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
}