74 lines
2.3 KiB
Go

package postgresql_test
import (
"context"
"testing"
"time"
"github.com/jackc/pgx/v5/pgxpool"
)
const (
testDBConnString = "postgresql://test_user:test_password@localhost:5433/test_hagrid_db"
)
// setupTestDBPool initializes a connection pool for testing and ensures schema is created.
func setupTestDBPool(t testing.TB) *pgxpool.Pool {
// Allow time for Docker container to start
time.Sleep(2 * time.Second)
pool, err := pgxpool.New(context.Background(), testDBConnString)
if err != nil {
t.Fatalf("Failed to create test DB pool: %v", err)
}
// Ping to ensure connection
if err := pool.Ping(context.Background()); err != nil {
pool.Close()
t.Fatalf("Failed to ping test DB: %v", err)
}
// Initialize schema (your dbStructureSQL from //go:embed)
// Ensure dbStructureSQL is accessible here.
// If it's embedded in main repository.go, you might need to make NewPostgresqlStorageRepo public
// or re-embed it directly in the test file (less ideal).
// Best: embed it in a separate package for common DB utils or make a separate TestInitDB function.
_, err = pool.Exec(context.Background(), dbStructureSQL)
if err != nil {
pool.Close()
t.Fatalf("Failed to initialize test DB schema: %v", err)
}
// Enable pg_trgm for testing Index method if needed
_, err = pool.Exec(context.Background(), "CREATE EXTENSION IF NOT EXISTS pg_trgm;")
if err != nil {
pool.Close()
t.Fatalf("Failed to enable pg_trgm extension: %v", err)
}
// Also create the specific GIN indexes
_, err = pool.Exec(context.Background(), "CREATE INDEX IF NOT EXISTS idx_pgp_uids_uid_gin ON pgp_uids USING GIN (uid gin_trgm_ops);")
if err != nil {
pool.Close()
t.Fatalf("Failed to create idx_pgp_uids_uid_gin: %v", err)
}
_, err = pool.Exec(context.Background(), "CREATE INDEX IF NOT EXISTS idx_pgp_uids_email_gin ON pgp_uids USING GIN (email gin_trgm_ops);")
if err != nil {
pool.Close()
t.Fatalf("Failed to create idx_pgp_uids_email_gin: %v", err)
}
return pool
}
// cleanupTestDB clears all data from relevant tables.
func cleanupTestDB(t testing.TB, pool *pgxpool.Pool) {
// Truncate tables, CASCADE if needed
_, err := pool.Exec(context.Background(), `
truncate table pgp_uids cascade;
truncate table pgp_keys cascade;
`)
if err != nil {
t.Errorf("Failed to cleanup test DB: %v", err)
}
}