axe/internal/db/db_test.go

63 lines
1.9 KiB
Go
Raw Normal View History

2026-10-18 19:07:25 +00:00
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)
}
})
}
}