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