// Package errors 提供错误处理框架 package errors import ( "errors" "testing" "github.com/stretchr/testify/assert" ) func TestBuildError_Error(t *testing.T) { // 测试没有底层错误的情况 err := NewBuildError( ErrConfigParse, "ConfigParser", "Failed to parse config file", nil, map[string]interface{}{"file": "config.yaml"}, ) assert.Equal(t, "[CONFIG_PARSE_ERROR] ConfigParser: Failed to parse config file", err.Error()) assert.Equal(t, ErrConfigParse, err.Code()) assert.Equal(t, "ConfigParser", err.Component()) assert.Equal(t, "config.yaml", err.Details()["file"]) // 测试有底层错误的情况 cause := errors.New("file not found") err = NewBuildError( ErrConfigParse, "ConfigParser", "Failed to parse config file", cause, map[string]interface{}{"file": "config.yaml"}, ) assert.Contains(t, err.Error(), "caused by: file not found") assert.Equal(t, cause, err.Unwrap()) } func TestWrap(t *testing.T) { cause := errors.New("original error") wrapped := Wrap(cause, "context message") assert.Contains(t, wrapped.Error(), "context message") assert.Contains(t, wrapped.Error(), "original error") assert.True(t, errors.Is(wrapped, cause)) } func TestWrapWithCode(t *testing.T) { cause := errors.New("original error") wrapped := WrapWithCode( cause, ErrConfigParse, "ConfigParser", "Failed to parse config", map[string]interface{}{"file": "config.yaml"}, ) assert.Equal(t, ErrConfigParse, wrapped.Code()) assert.Equal(t, "ConfigParser", wrapped.Component()) assert.Contains(t, wrapped.Error(), "Failed to parse config") assert.Equal(t, "config.yaml", wrapped.Details()["file"]) } func TestIsCode(t *testing.T) { err := NewBuildError( ErrConfigParse, "ConfigParser", "Failed to parse config file", nil, nil, ) assert.True(t, IsCode(err, ErrConfigParse)) assert.False(t, IsCode(err, ErrBuildFailed)) assert.False(t, IsCode(errors.New("regular error"), ErrConfigParse)) } func TestFormatErrorList(t *testing.T) { errs := []error{ errors.New("error 1"), errors.New("error 2"), errors.New("error 3"), } formatted := FormatErrorList(errs) assert.Contains(t, formatted, "error 1") assert.Contains(t, formatted, "error 2") assert.Contains(t, formatted, "error 3") assert.Contains(t, formatted, "\n") }