feat: Improve error handling with custom error types and detailed messages

This commit is contained in:
2024-11-11 15:01:20 +02:00
parent 6346c9a829
commit 2bb8589eb7
3 changed files with 148 additions and 22 deletions

View File

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