1package git2go
2
3import (
4	"bytes"
5	"encoding/gob"
6	"errors"
7	"fmt"
8	"testing"
9
10	"github.com/stretchr/testify/require"
11)
12
13func TestSerializableError(t *testing.T) {
14	for _, tc := range []struct {
15		desc          string
16		input         error
17		output        error
18		containsTyped bool
19	}{
20		{
21			desc:   "plain error",
22			input:  errors.New("plain error"),
23			output: wrapError{Message: "plain error"},
24		},
25		{
26			desc:   "wrapped plain error",
27			input:  fmt.Errorf("error wrapper: %w", errors.New("plain error")),
28			output: wrapError{Message: "error wrapper: plain error", Err: wrapError{Message: "plain error"}},
29		},
30		{
31			desc:          "wrapped typed error",
32			containsTyped: true,
33			input:         fmt.Errorf("error wrapper: %w", InvalidArgumentError("typed error")),
34			output:        wrapError{Message: "error wrapper: typed error", Err: InvalidArgumentError("typed error")},
35		},
36		{
37			desc:          "typed wrapper",
38			containsTyped: true,
39			input: wrapError{
40				Message: "error wrapper: typed error 1: typed error 2",
41				Err: wrapError{
42					Message: "typed error 1: typed error 2",
43					Err:     InvalidArgumentError("typed error 2"),
44				},
45			},
46			output: wrapError{
47				Message: "error wrapper: typed error 1: typed error 2",
48				Err: wrapError{
49					Message: "typed error 1: typed error 2",
50					Err:     InvalidArgumentError("typed error 2"),
51				},
52			},
53		},
54	} {
55		t.Run(tc.desc, func(t *testing.T) {
56			encoded := &bytes.Buffer{}
57			require.NoError(t, gob.NewEncoder(encoded).Encode(SerializableError(tc.input)))
58			var err wrapError
59			require.NoError(t, gob.NewDecoder(encoded).Decode(&err))
60			require.Equal(t, tc.output, err)
61
62			var typedErr InvalidArgumentError
63			require.Equal(t, tc.containsTyped, errors.As(err, &typedErr))
64		})
65	}
66}
67
68func TestSerialization_SerializeTo(t *testing.T) {
69	type testStruct struct {
70		Contents string `json:"contents"`
71	}
72
73	var buf bytes.Buffer
74
75	input := testStruct{
76		Contents: "foobar",
77	}
78	err := serializeTo(&buf, &input)
79	require.NoError(t, err)
80	require.NotZero(t, buf.Len())
81
82	var output testStruct
83	err = deserialize(buf.String(), &output)
84	require.NoError(t, err)
85	require.Equal(t, input, output)
86}
87