147 lines
3.1 KiB
Go
147 lines
3.1 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestGetConfig(t *testing.T) {
|
|
// Set up test environment variables
|
|
envVars := map[string]string{
|
|
EnvLogLevel: "debug",
|
|
EnvRootPath: ".",
|
|
EnvNumWorkers: "5",
|
|
EnvWorkerBatchSize: "100",
|
|
EnvMaxResponseSize: "1048576",
|
|
EnvResponseTimeout: "30",
|
|
}
|
|
|
|
for k, v := range envVars {
|
|
os.Setenv(k, v)
|
|
defer os.Unsetenv(k)
|
|
}
|
|
|
|
// Get configuration
|
|
config := GetConfig()
|
|
|
|
// Assert configuration values
|
|
assert.Equal(t, zerolog.DebugLevel, config.LogLevel)
|
|
assert.Equal(t, ".", config.RootPath)
|
|
assert.Equal(t, 5, config.NumOfWorkers)
|
|
assert.Equal(t, 100, config.WorkerBatchSize)
|
|
assert.Equal(t, 1048576, config.MaxResponseSize)
|
|
assert.Equal(t, 30, config.ResponseTimeout)
|
|
}
|
|
|
|
func TestParsePositiveInt(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
param string
|
|
input string
|
|
want int
|
|
wantErr bool
|
|
errType interface{}
|
|
errMessage string
|
|
}{
|
|
{
|
|
name: "valid positive",
|
|
param: "TEST_PARAM",
|
|
input: "42",
|
|
want: 42,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "zero",
|
|
param: "TEST_PARAM",
|
|
input: "0",
|
|
wantErr: true,
|
|
errType: &ValidationError{},
|
|
errMessage: "invalid value '0' for TEST_PARAM: must be positive",
|
|
},
|
|
{
|
|
name: "negative",
|
|
param: "TEST_PARAM",
|
|
input: "-1",
|
|
wantErr: true,
|
|
errType: &ValidationError{},
|
|
errMessage: "invalid value '-1' for TEST_PARAM: must be positive",
|
|
},
|
|
{
|
|
name: "invalid",
|
|
param: "TEST_PARAM",
|
|
input: "abc",
|
|
wantErr: true,
|
|
errType: &ValidationError{},
|
|
errMessage: "invalid value 'abc' for TEST_PARAM: must be a valid integer",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := parsePositiveInt(tt.param, tt.input)
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
assert.IsType(t, tt.errType, err)
|
|
if tt.errMessage != "" {
|
|
assert.Equal(t, tt.errMessage, err.Error())
|
|
}
|
|
} else {
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestConfigValidation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
envVars map[string]string
|
|
wantErr bool
|
|
errMessage string
|
|
}{
|
|
{
|
|
name: "invalid log level",
|
|
envVars: map[string]string{
|
|
EnvLogLevel: "invalid",
|
|
},
|
|
wantErr: true,
|
|
errMessage: "invalid value 'invalid' for LOG_LEVEL: must be one of: debug, info, warn, error",
|
|
},
|
|
{
|
|
name: "invalid worker count",
|
|
envVars: map[string]string{
|
|
EnvLogLevel: "debug",
|
|
EnvRootPath: ".",
|
|
EnvNumWorkers: "-1",
|
|
},
|
|
wantErr: true,
|
|
errMessage: "invalid value '-1' for NUM_OF_WORKERS: must be positive",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Clear environment
|
|
os.Clearenv()
|
|
|
|
// Set required environment variables
|
|
for k, v := range tt.envVars {
|
|
os.Setenv(k, v)
|
|
}
|
|
|
|
// Defer cleanup
|
|
defer os.Clearenv()
|
|
|
|
if tt.wantErr {
|
|
assert.PanicsWithError(t, tt.errMessage, func() {
|
|
GetConfig()
|
|
})
|
|
}
|
|
})
|
|
}
|
|
}
|