52 lines
1.3 KiB
Go
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
|
|
}
|