92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
// 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")
|
|
}
|