182 lines
4.0 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|