feat: Improve error handling with custom error types and detailed messages
This commit is contained in:
@@ -38,22 +38,56 @@ func TestGetConfig(t *testing.T) {
|
||||
|
||||
func TestParsePositiveInt(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
input string
|
||||
want int
|
||||
wantErr bool
|
||||
name string
|
||||
param string
|
||||
input string
|
||||
want int
|
||||
wantErr bool
|
||||
errType interface{}
|
||||
errMessage string
|
||||
}{
|
||||
{"valid positive", "42", 42, false},
|
||||
{"zero", "0", 0, true},
|
||||
{"negative", "-1", 0, true},
|
||||
{"invalid", "abc", 0, true},
|
||||
{
|
||||
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.input)
|
||||
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)
|
||||
@@ -61,3 +95,52 @@ func TestParsePositiveInt(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user