package db import ( "testing" "github.com/jackc/pgx/v5/pgxpool" ) // applyPoolEnv читает env: пустые переменные не трогают дефолты pgxpool, // заполненные — применяются, кривые — ошибка на старте. func TestApplyPoolEnv(t *testing.T) { // Дефолт: ни одной переменной — конфиг не меняется. cfg := &pgxpool.Config{} before := *cfg if err := applyPoolEnv(cfg); err != nil { t.Fatalf("empty env: %v", err) } if cfg.MaxConns != before.MaxConns || cfg.MinConns != before.MinConns { t.Fatalf("empty env must not touch config: %+v", cfg) } // Заданные значения применяются как есть. t.Setenv("DB_MAX_CONNS", "20") t.Setenv("DB_MIN_CONNS", "2") t.Setenv("DB_MAX_CONN_LIFETIME", "1h") t.Setenv("DB_MAX_CONN_IDLE_TIME", "30m") cfg = &pgxpool.Config{} if err := applyPoolEnv(cfg); err != nil { t.Fatalf("valid env: %v", err) } if cfg.MaxConns != 20 || cfg.MinConns != 2 { t.Fatalf("conns not applied: max=%d min=%d", cfg.MaxConns, cfg.MinConns) } if cfg.MaxConnLifetime.Hours() != 1 { t.Fatalf("lifetime not applied: %v", cfg.MaxConnLifetime) } if cfg.MaxConnIdleTime.Minutes() != 30 { t.Fatalf("idle time not applied: %v", cfg.MaxConnIdleTime) } } // Кривые значения — фейл-фаст, а не молчаливый дефолт. func TestApplyPoolEnvInvalid(t *testing.T) { cases := []struct { env string val string }{ {"DB_MAX_CONNS", "ten"}, {"DB_MAX_CONNS", "0"}, {"DB_MIN_CONNS", "-1"}, {"DB_MAX_CONN_LIFETIME", "1h30"}, {"DB_MAX_CONN_IDLE_TIME", "0s"}, } for _, c := range cases { t.Run(c.env+"="+c.val, func(t *testing.T) { t.Setenv(c.env, c.val) if err := applyPoolEnv(&pgxpool.Config{}); err == nil { t.Fatalf("%s=%s must fail", c.env, c.val) } }) } }