github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/errors/error_test.go (about) 1 package errors 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/require" 9 "go.uber.org/zap" 10 "go.uber.org/zap/zapcore" 11 ) 12 13 func TestWithDetails(t *testing.T) { 14 t.Run("AgentErrorWithNoExistingDetails", func(t *testing.T) { 15 err := NewError("Test error", "") 16 err2 := WithDetails(err, "foo", "bar") 17 18 require.Equal(t, err2.Details, ErrorDetails{"foo": "bar"}) 19 }) 20 21 t.Run("AgentErrorWithExistingDetails", func(t *testing.T) { 22 err := NewError("Test error", "", "foo1", "bar1") 23 err2 := WithDetails(err, "foo2", "bar2") 24 25 require.Equal(t, err2.Details, ErrorDetails{"foo1": "bar1", "foo2": "bar2"}) 26 }) 27 28 t.Run("StandardError", func(t *testing.T) { 29 err := fmt.Errorf("Test error") 30 err2 := WithDetails(err, "foo", "bar") 31 32 require.Equal(t, err2.Details, ErrorDetails{"foo": "bar"}) 33 }) 34 35 t.Run("AgentMethod", func(t *testing.T) { 36 err := NewError("Test error", "").WithDetails("foo", "bar") 37 require.Equal(t, err.Details, ErrorDetails{"foo": "bar"}) 38 }) 39 } 40 41 func TestErrorMessage(t *testing.T) { 42 t.Run("WithDetails", func(t *testing.T) { 43 err := NewError("Test error", "", "foo", "bar") 44 45 require.Equal(t, `Test error: {"foo":"bar"}`, err.Error()) 46 }) 47 48 t.Run("WithoutDetails", func(t *testing.T) { 49 err := NewError("Test error", "") 50 51 require.Equal(t, `Test error`, err.Error()) 52 }) 53 } 54 55 func TestWrap(t *testing.T) { 56 t.Run("AgentError", func(t *testing.T) { 57 err := NewError("Test error", "") 58 err2 := Wrap(err, "Test context") 59 require.Equal(t, "Test context: Test error", err2.Error()) 60 }) 61 62 t.Run("StandardError", func(t *testing.T) { 63 err := fmt.Errorf("Test error") 64 err2 := Wrap(err, "Test context") 65 require.Equal(t, "Test context: Test error", err2.Error()) 66 }) 67 } 68 69 func TestMarshalLogObject(t *testing.T) { 70 cfg := zap.NewProductionConfig() 71 enc := zapcore.NewJSONEncoder(cfg.EncoderConfig) 72 now, _ := time.Parse(time.RFC3339, time.RFC3339) 73 entry := zapcore.Entry{ 74 Level: zapcore.DebugLevel, 75 Time: now, 76 LoggerName: "testlogger", 77 Message: "Got an error", 78 } 79 fields := []zapcore.Field{{ 80 Key: "error", 81 Type: zapcore.ObjectMarshalerType, 82 }} 83 84 t.Run("NoSuggestionOrDetails", func(t *testing.T) { 85 fields[0].Interface = NewError("Test error", "") 86 out, err := enc.EncodeEntry(entry, fields) 87 require.NoError(t, err) 88 89 expected := `{"level":"debug","ts":-6795364578.8713455,"logger":"testlogger","msg":"Got an error","error":{"description":"Test error"}}` + "\n" 90 require.Equal(t, expected, out.String()) 91 }) 92 93 t.Run("SuggestionAndDetails", func(t *testing.T) { 94 fields[0].Interface = NewError("Test error", "Fix it", "foo", "bar") 95 out, err := enc.EncodeEntry(entry, fields) 96 require.NoError(t, err) 97 98 expected := `{"level":"debug","ts":-6795364578.8713455,"logger":"testlogger","msg":"Got an error","error":{"description":"Test error","suggestion":"Fix it","details":{"foo":"bar"}}}` + "\n" 99 require.Equal(t, expected, out.String()) 100 }) 101 }