Select Git revision
errors_test.go
errors_test.go 3.96 KiB
package errors_test
import (
"encoding/json"
"fmt"
"testing"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
)
func TestErrorFormatting(t *testing.T) {
// pretend this is your error stack
// the original error is created by 3rd party library e.g. pg or mysql and may not have stack info
// but from that point on, we use our errors package which includes stack info...
e1 := errors.Errorf("you have problem in your SQL near xxx")
e2 := errors.Wrapf(e1, "query failed")
e3 := errors.Wrapf(e2, "failed to find account")
e4 := errors.Wrapf(e3, "login failed").(*errors.CustomError)
// we can log the error in different ways:
// use %s for a simple message
// -> "login failed"
t.Logf("%%s: %s", e4)
// use either Error() or "%v" for concatenated message:
// -> "login failed, because failed to find account, because query failed, because you have problem in your SQL near xxx"
t.Logf("Error(): %s", e4.Error())
t.Logf("%%v: %v", e4)
// use %+v for complete error with stack:
// -> "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors_test/TestErrorFormatting():errors_test.go(17): login failed, because gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors_test/TestErrorFormatting():errors_test.go(16): failed to find account, because gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors_test/TestErrorFormatting():errors_test.go(15): query failed, because you have problem in your SQL near xxx
t.Logf("%%+v: %+v", e4)
// you may also JSON marshal the error
// ->
jsonError, _ := json.Marshal(e4.Description())
t.Logf("json: %s", string(jsonError))
// using the Description(), one can also verify that the correct
// source references are reported
desc := e4.Description()
if desc.Source == nil || desc.Source.Line != 18 {
t.Fatalf("failed not on line 18")
}
desc = *desc.Cause
if desc.Source == nil || desc.Source.Line != 17 {
t.Fatalf("failed not on line 17")
}
desc = *desc.Cause
if desc.Source == nil || desc.Source.Line != 16 {
t.Fatalf("failed not on line 16")
}
}
func TestErrorStack(t *testing.T) {
// if some function (e.g. 3rd party) fail without stack, then store the calling stack and append as it is wrapped from there...
err := a(1)
t.Logf("err: %+v", err)
}
func a(i int) error {
return errors.Wrapf(b(i), "b failed")
}
func b(i int) error {
return errors.Wrapf(c(i), "c failed")
}
func c(i int) error {