owpengram-server/internal/config/config_test.go

124 lines
3.3 KiB
Go

package config
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestLoadDefaultsAdvertiseIPToLoopback(t *testing.T) {
t.Setenv("TELESRV_ADVERTISE_IP", "")
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.AdvertiseIP != "127.0.0.1" {
t.Fatalf("AdvertiseIP = %q, want loopback default", cfg.AdvertiseIP)
}
}
func TestLoadUsesExplicitAdvertiseIP(t *testing.T) {
t.Setenv("TELESRV_ADVERTISE_IP", "203.0.113.10")
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.AdvertiseIP != "203.0.113.10" {
t.Fatalf("AdvertiseIP = %q, want explicit env", cfg.AdvertiseIP)
}
}
func TestLoadBusinessAIProvider(t *testing.T) {
t.Setenv("TELESRV_BUSINESS_AI_PROVIDER", "echo")
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.BusinessAIProvider != "echo" {
t.Fatalf("BusinessAIProvider = %q, want echo", cfg.BusinessAIProvider)
}
}
func TestLoadBusinessAIProviderDefaultsToEcho(t *testing.T) {
t.Setenv("TELESRV_BUSINESS_AI_PROVIDER", "")
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.BusinessAIProvider != "echo" {
t.Fatalf("BusinessAIProvider = %q, want echo", cfg.BusinessAIProvider)
}
}
func TestLoadReadsEnvStyleConfigFile(t *testing.T) {
path := filepath.Join(t.TempDir(), "telesrv.env")
writeConfigFile(t, path, `
TELESRV_MAPBOX_TOKEN="file-token"
TELESRV_POSTGRES_MAX_CONNS=77
TELESRV_WEBSOCKET_ALLOWED_ORIGINS=https://one.example, https://two.example
TELESRV_CALL_RING_TIMEOUT=2m
`)
t.Setenv("TELESRV_CONFIG", path)
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.MapboxToken != "file-token" {
t.Fatalf("MapboxToken = %q, want file-token", cfg.MapboxToken)
}
if cfg.PostgresMaxConns != 77 {
t.Fatalf("PostgresMaxConns = %d, want 77", cfg.PostgresMaxConns)
}
if got, want := cfg.WebSocketAllowedOrigins, []string{"https://one.example", "https://two.example"}; len(got) != 2 || got[0] != want[0] || got[1] != want[1] {
t.Fatalf("WebSocketAllowedOrigins = %#v, want %#v", got, want)
}
if cfg.CallRingTimeout != 2*time.Minute {
t.Fatalf("CallRingTimeout = %v, want 2m", cfg.CallRingTimeout)
}
}
func TestLoadEnvironmentOverridesConfigFile(t *testing.T) {
path := filepath.Join(t.TempDir(), "telesrv.env")
writeConfigFile(t, path, `TELESRV_MAPBOX_TOKEN=file-token`)
t.Setenv("TELESRV_CONFIG", path)
t.Setenv("TELESRV_MAPBOX_TOKEN", "env-token")
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
if cfg.MapboxToken != "env-token" {
t.Fatalf("MapboxToken = %q, want env-token", cfg.MapboxToken)
}
}
func TestLoadExplicitMissingConfigFileErrors(t *testing.T) {
t.Setenv("TELESRV_CONFIG", filepath.Join(t.TempDir(), "missing.env"))
if _, err := Load(); err == nil {
t.Fatal("Load succeeded with explicit missing config file, want error")
}
}
func TestLoadRejectsNonTelesrvConfigKeys(t *testing.T) {
path := filepath.Join(t.TempDir(), "telesrv.env")
writeConfigFile(t, path, `MAPBOX_TOKEN=file-token`)
t.Setenv("TELESRV_CONFIG", path)
if _, err := Load(); err == nil {
t.Fatal("Load succeeded with unsupported config key, want error")
}
}
func writeConfigFile(t *testing.T, path, body string) {
t.Helper()
if err := os.WriteFile(path, []byte(body), 0o600); err != nil {
t.Fatalf("write config file: %v", err)
}
}