Files
golib/hlog/config_test.go
2026-01-13 12:55:30 +11:00

182 lines
4.0 KiB
Go

package hlog
import (
"os"
"testing"
"github.com/rs/zerolog"
)
func TestConfigFromEnv(t *testing.T) {
tests := []struct {
name string
envVars map[string]string
want *Config
wantErr bool
errMsg string
}{
{
name: "default values",
envVars: map[string]string{},
want: &Config{
LogLevel: zerolog.InfoLevel,
LogOutput: "console",
LogDir: "",
LogFileName: "",
LogAppend: true,
},
wantErr: false,
},
{
name: "custom values",
envVars: map[string]string{
"LOG_LEVEL": "debug",
"LOG_OUTPUT": "both",
"LOG_DIR": "/var/log/myapp",
"LOG_FILE_NAME": "application.log",
"LOG_APPEND": "false",
},
want: &Config{
LogLevel: zerolog.DebugLevel,
LogOutput: "both",
LogDir: "/var/log/myapp",
LogFileName: "application.log",
LogAppend: false,
},
wantErr: false,
},
{
name: "file output mode",
envVars: map[string]string{
"LOG_LEVEL": "warn",
"LOG_OUTPUT": "file",
"LOG_DIR": "/tmp/logs",
"LOG_FILE_NAME": "test.log",
"LOG_APPEND": "true",
},
want: &Config{
LogLevel: zerolog.WarnLevel,
LogOutput: "file",
LogDir: "/tmp/logs",
LogFileName: "test.log",
LogAppend: true,
},
wantErr: false,
},
{
name: "invalid log level",
envVars: map[string]string{
"LOG_LEVEL": "invalid",
"LOG_OUTPUT": "console",
},
want: nil,
wantErr: true,
errMsg: "LogLevel",
},
{
name: "invalid log output",
envVars: map[string]string{
"LOG_LEVEL": "info",
"LOG_OUTPUT": "invalid",
},
want: nil,
wantErr: true,
errMsg: "Invalid LOG_OUTPUT",
},
{
name: "trace log level with defaults",
envVars: map[string]string{
"LOG_LEVEL": "trace",
"LOG_OUTPUT": "console",
},
want: &Config{
LogLevel: zerolog.TraceLevel,
LogOutput: "console",
LogDir: "",
LogFileName: "",
LogAppend: true,
},
wantErr: false,
},
{
name: "file output without LOG_DIR",
envVars: map[string]string{
"LOG_OUTPUT": "file",
"LOG_FILE_NAME": "test.log",
},
want: nil,
wantErr: true,
errMsg: "LOG_DIR not set",
},
{
name: "file output without LOG_FILE_NAME",
envVars: map[string]string{
"LOG_OUTPUT": "file",
"LOG_DIR": "/tmp",
},
want: nil,
wantErr: true,
errMsg: "LOG_FILE_NAME not set",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Clear all environment variables first
os.Unsetenv("LOG_LEVEL")
os.Unsetenv("LOG_OUTPUT")
os.Unsetenv("LOG_DIR")
os.Unsetenv("LOG_FILE_NAME")
os.Unsetenv("LOG_APPEND")
// Set test environment variables (only set if value provided)
for k, v := range tt.envVars {
os.Setenv(k, v)
}
// Cleanup after test
defer func() {
os.Unsetenv("LOG_LEVEL")
os.Unsetenv("LOG_OUTPUT")
os.Unsetenv("LOG_DIR")
os.Unsetenv("LOG_FILE_NAME")
os.Unsetenv("LOG_APPEND")
}()
got, err := ConfigFromEnv()
if tt.wantErr {
if err == nil {
t.Errorf("ConfigFromEnv() expected error but got nil")
return
}
if tt.errMsg != "" && err.Error() == "" {
t.Errorf("ConfigFromEnv() error = %v, should contain %v", err, tt.errMsg)
}
return
}
if err != nil {
t.Errorf("ConfigFromEnv() unexpected error = %v", err)
return
}
if got.LogLevel != tt.want.LogLevel {
t.Errorf("ConfigFromEnv() LogLevel = %v, want %v", got.LogLevel, tt.want.LogLevel)
}
if got.LogOutput != tt.want.LogOutput {
t.Errorf("ConfigFromEnv() LogOutput = %v, want %v", got.LogOutput, tt.want.LogOutput)
}
if got.LogDir != tt.want.LogDir {
t.Errorf("ConfigFromEnv() LogDir = %v, want %v", got.LogDir, tt.want.LogDir)
}
if got.LogFileName != tt.want.LogFileName {
t.Errorf("ConfigFromEnv() LogFileName = %v, want %v", got.LogFileName, tt.want.LogFileName)
}
if got.LogAppend != tt.want.LogAppend {
t.Errorf("ConfigFromEnv() LogAppend = %v, want %v", got.LogAppend, tt.want.LogAppend)
}
})
}
}