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) } }) } }