You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.2 KiB
Go

package postgres
// Tests for PostgreSQL config helpers and health check behavior.
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/require"
)
// TestDefaultConfig verifies default configuration values for the client.
func TestDefaultConfig(t *testing.T) {
cfg := DefaultConfig()
require.Equal(t, "localhost", cfg.Host)
require.Equal(t, 5432, cfg.Port)
}
// TestConfigDSNAndURL verifies DSN and URL formatting include expected parts.
func TestConfigDSNAndURL(t *testing.T) {
cfg := DefaultConfig()
require.Contains(t, cfg.DSN(), "host=localhost")
require.Contains(t, cfg.URL(), "postgresql://")
}
// TestConfigFromEnvDefaults verifies defaults are used when env vars are absent.
func TestConfigFromEnvDefaults(t *testing.T) {
t.Setenv("POSTGRES_HOST", "")
t.Setenv("POSTGRES_PORT", "")
t.Setenv("POSTGRES_USER", "")
t.Setenv("POSTGRES_PASSWORD", "")
t.Setenv("POSTGRES_DB", "")
t.Setenv("POSTGRES_SSLMODE", "")
cfg := ConfigFromEnv()
def := DefaultConfig()
require.Equal(t, def.Host, cfg.Host)
require.Equal(t, def.Port, cfg.Port)
require.Equal(t, def.User, cfg.User)
require.Equal(t, def.Password, cfg.Password)
require.Equal(t, def.Database, cfg.Database)
require.Equal(t, def.SSLMode, cfg.SSLMode)
}
// TestConfigFromEnvOverrides verifies valid env vars override defaults.
func TestConfigFromEnvOverrides(t *testing.T) {
t.Setenv("POSTGRES_HOST", "db")
t.Setenv("POSTGRES_PORT", "15432")
t.Setenv("POSTGRES_USER", "user")
t.Setenv("POSTGRES_PASSWORD", "secret")
t.Setenv("POSTGRES_DB", "app")
t.Setenv("POSTGRES_SSLMODE", "require")
t.Setenv("POSTGRES_MAX_OPEN_CONNS", "50")
t.Setenv("POSTGRES_MAX_IDLE_CONNS", "20")
t.Setenv("POSTGRES_CONN_MAX_LIFETIME", "10m")
t.Setenv("POSTGRES_CONN_MAX_IDLE_TIME", "2m")
cfg := ConfigFromEnv()
require.Equal(t, "db", cfg.Host)
require.Equal(t, 15432, cfg.Port)
require.Equal(t, "user", cfg.User)
require.Equal(t, "secret", cfg.Password)
require.Equal(t, "app", cfg.Database)
require.Equal(t, "require", cfg.SSLMode)
require.Equal(t, 50, cfg.MaxOpenConns)
require.Equal(t, 20, cfg.MaxIdleConns)
require.Equal(t, 10*time.Minute, cfg.ConnMaxLifetime)
require.Equal(t, 2*time.Minute, cfg.ConnMaxIdleTime)
}
// TestConfigFromEnvInvalidFallsBack verifies invalid numeric/duration values fall back.
func TestConfigFromEnvInvalidFallsBack(t *testing.T) {
def := DefaultConfig()
t.Setenv("POSTGRES_PORT", "not-a-number")
t.Setenv("POSTGRES_MAX_OPEN_CONNS", "x")
t.Setenv("POSTGRES_CONN_MAX_LIFETIME", "invalid")
cfg := ConfigFromEnv()
require.Equal(t, def.Port, cfg.Port)
require.Equal(t, def.MaxOpenConns, cfg.MaxOpenConns)
require.Equal(t, def.ConnMaxLifetime, cfg.ConnMaxLifetime)
}
// TestHealthCheckInvalidConfig verifies config validation runs before DB connection.
func TestHealthCheckInvalidConfig(t *testing.T) {
cfg := DefaultConfig()
cfg.Host = ""
err := HealthCheck(context.Background(), cfg)
require.Error(t, err)
require.Contains(t, err.Error(), "host is required")
}
// TestHealthCheckConnectionFailure verifies connection issues are surfaced.
func TestHealthCheckConnectionFailure(t *testing.T) {
cfg := DefaultConfig()
cfg.Host = "127.0.0.1"
cfg.Port = 65432 // typically closed
err := HealthCheck(context.Background(), cfg)
require.Error(t, err)
}