Skip to content

Commit

Permalink
zapcore: Improve errors unit tests (#1414)
Browse files Browse the repository at this point in the history
Updates and adds some unit tests for the zapcore/errors.go file.
  • Loading branch information
justinhwang committed Mar 7, 2024
1 parent 8f5ee80 commit b39f8b6
Showing 1 changed file with 50 additions and 34 deletions.
84 changes: 50 additions & 34 deletions zapcore/error_test.go
Expand Up @@ -43,7 +43,20 @@ func (e errTooManyUsers) Format(s fmt.State, verb rune) {
// Implement fmt.Formatter, but don't add any information beyond the basic
// Error method.
if verb == 'v' && s.Flag('+') {
io.WriteString(s, e.Error())
_, _ = io.WriteString(s, e.Error())
}
}

type errTooFewUsers int

func (e errTooFewUsers) Error() string {
return fmt.Sprintf("%d too few users", int(e))
}

func (e errTooFewUsers) Format(s fmt.State, verb rune) {
if verb == 'v' && s.Flag('+') {
_, _ = io.WriteString(s, "verbose: ")
_, _ = io.WriteString(s, e.Error())
}
}

Expand All @@ -66,87 +79,90 @@ func (e customMultierr) Errors() []error {

func TestErrorEncoding(t *testing.T) {
tests := []struct {
k string
t FieldType // defaults to ErrorType
iface interface{}
want map[string]interface{}
key string
iface any
want map[string]any
}{
{
k: "k",
key: "k",
iface: errTooManyUsers(2),
want: map[string]interface{}{
want: map[string]any{
"k": "2 too many users",
},
},
{
k: "err",
key: "k",
iface: errTooFewUsers(2),
want: map[string]any{
"k": "2 too few users",
"kVerbose": "verbose: 2 too few users",
},
},
{
key: "err",
iface: multierr.Combine(
errors.New("foo"),
errors.New("bar"),
errors.New("baz"),
),
want: map[string]interface{}{
want: map[string]any{
"err": "foo; bar; baz",
"errCauses": []interface{}{
map[string]interface{}{"error": "foo"},
map[string]interface{}{"error": "bar"},
map[string]interface{}{"error": "baz"},
"errCauses": []any{
map[string]any{"error": "foo"},
map[string]any{"error": "bar"},
map[string]any{"error": "baz"},
},
},
},
{
k: "e",
key: "e",
iface: customMultierr{},
want: map[string]interface{}{
want: map[string]any{
"e": "great sadness",
"eCauses": []interface{}{
map[string]interface{}{"error": "foo"},
map[string]interface{}{
"eCauses": []any{
map[string]any{"error": "foo"},
map[string]any{
"error": "bar; baz",
"errorCauses": []interface{}{
map[string]interface{}{"error": "bar"},
map[string]interface{}{"error": "baz"},
"errorCauses": []any{
map[string]any{"error": "bar"},
map[string]any{"error": "baz"},
},
},
},
},
},
{
k: "k",
key: "k",
iface: fmt.Errorf("failed: %w", errors.New("egad")),
want: map[string]interface{}{
want: map[string]any{
"k": "failed: egad",
},
},
{
k: "error",
key: "error",
iface: multierr.Combine(
fmt.Errorf("hello: %w",
multierr.Combine(errors.New("foo"), errors.New("bar")),
),
errors.New("baz"),
fmt.Errorf("world: %w", errors.New("qux")),
),
want: map[string]interface{}{
want: map[string]any{
"error": "hello: foo; bar; baz; world: qux",
"errorCauses": []interface{}{
map[string]interface{}{
"errorCauses": []any{
map[string]any{
"error": "hello: foo; bar",
},
map[string]interface{}{"error": "baz"},
map[string]interface{}{"error": "world: qux"},
map[string]any{"error": "baz"},
map[string]any{"error": "world: qux"},
},
},
},
}

for _, tt := range tests {
if tt.t == UnknownType {
tt.t = ErrorType
}

enc := NewMapObjectEncoder()
f := Field{Key: tt.k, Type: tt.t, Interface: tt.iface}
f := Field{Key: tt.key, Type: ErrorType, Interface: tt.iface}
f.AddTo(enc)
assert.Equal(t, tt.want, enc.Fields, "Unexpected output from field %+v.", f)
}
Expand Down

0 comments on commit b39f8b6

Please sign in to comment.