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.3 KiB
Go

package postgres
// Tests for PostgreSQL config helpers and health check behavior.
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/require"
)
// TestDefaultConfig ensures default config behavior is handled correctly.
func TestDefaultConfig(t *testing.T) {
cfg := DefaultConfig()
require.Equal(t, "localhost", cfg.Host)
require.Equal(t, 5432, cfg.Port)
}
// TestConfigDSNAndURL ensures config dsn and url behavior is handled correctly.
func TestConfigDSNAndURL(t *testing.T) {
cfg := DefaultConfig()
require.Contains(t, cfg.DSN(), "host=localhost")
require.Contains(t, cfg.URL(), "postgresql://")
}
// TestConfigFromEnvDefaults ensures config from env defaults behavior is handled correctly.
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 ensures config from env overrides behavior is handled correctly.
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 ensures config from env invalid falls back behavior is handled correctly.
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 ensures health check invalid config behavior is handled correctly.
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 ensures health check connection failure behavior is handled correctly.
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)
}