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) }