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  }