1package git2go
2
3import (
4	"bytes"
5	"testing"
6	"time"
7
8	"github.com/stretchr/testify/require"
9)
10
11func TestGit2Go_MergeCommandSerialization(t *testing.T) {
12	testcases := []struct {
13		desc string
14		cmd  MergeCommand
15		err  string
16	}{
17		{
18			desc: "missing repository",
19			cmd:  MergeCommand{},
20			err:  "missing repository",
21		},
22		{
23			desc: "missing author name",
24			cmd: MergeCommand{
25				Repository: "foo",
26			},
27			err: "missing author name",
28		},
29		{
30			desc: "missing author mail",
31			cmd: MergeCommand{
32				Repository: "foo",
33				AuthorName: "Au Thor",
34			},
35			err: "missing author mail",
36		},
37		{
38			desc: "missing author message",
39			cmd: MergeCommand{
40				Repository: "foo",
41				AuthorName: "Au Thor",
42				AuthorMail: "au@thor.com",
43			},
44			err: "missing message",
45		},
46		{
47			desc: "missing author ours",
48			cmd: MergeCommand{
49				Repository: "foo",
50				AuthorName: "Au Thor",
51				AuthorMail: "au@thor.com",
52				Message:    "Message",
53			},
54			err: "missing ours",
55		},
56		{
57			desc: "missing theirs",
58			cmd: MergeCommand{
59				Repository: "foo",
60				AuthorName: "Au Thor",
61				AuthorMail: "au@thor.com",
62				Message:    "Message",
63				Ours:       "refs/heads/master",
64			},
65			err: "missing theirs",
66		},
67		{
68			desc: "valid command",
69			cmd: MergeCommand{
70				Repository: "foo",
71				AuthorName: "Au Thor",
72				AuthorMail: "au@thor.com",
73				Message:    "Message",
74				Ours:       "refs/heads/master",
75				Theirs:     "refs/heads/foo",
76			},
77		},
78		{
79			desc: "valid command with date",
80			cmd: MergeCommand{
81				Repository: "foo",
82				AuthorName: "Au Thor",
83				AuthorMail: "au@thor.com",
84				AuthorDate: time.Now().UTC(),
85				Message:    "Message",
86				Ours:       "refs/heads/master",
87				Theirs:     "refs/heads/foo",
88			},
89		},
90	}
91
92	for _, tc := range testcases {
93		t.Run(tc.desc, func(t *testing.T) {
94			serialized, err := serialize(tc.cmd)
95			require.NoError(t, err)
96
97			deserialized, err := MergeCommandFromSerialized(serialized)
98
99			if tc.err != "" {
100				require.Error(t, err)
101				require.Contains(t, err.Error(), tc.err)
102			} else {
103				require.NoError(t, err)
104				require.Equal(t, deserialized, tc.cmd)
105			}
106		})
107	}
108}
109
110func TestGit2Go_MergeResultSerialization(t *testing.T) {
111	serializeResult := func(t *testing.T, result MergeResult) string {
112		t.Helper()
113		var buf bytes.Buffer
114		err := result.SerializeTo(&buf)
115		require.NoError(t, err)
116		return buf.String()
117	}
118
119	testcases := []struct {
120		desc       string
121		serialized string
122		expected   MergeResult
123		err        string
124	}{
125		{
126			desc:       "empty merge result",
127			serialized: serializeResult(t, MergeResult{}),
128			expected:   MergeResult{},
129		},
130		{
131			desc: "merge result with commit",
132			serialized: serializeResult(t, MergeResult{
133				CommitID: "1234",
134			}),
135			expected: MergeResult{
136				CommitID: "1234",
137			},
138		},
139		{
140			desc:       "invalid serialized representation",
141			serialized: "xvlc",
142			err:        "invalid character",
143		},
144	}
145
146	for _, tc := range testcases {
147		t.Run(tc.desc, func(t *testing.T) {
148			var deserialized MergeResult
149			err := deserialize(tc.serialized, &deserialized)
150
151			if tc.err != "" {
152				require.Error(t, err)
153				require.Contains(t, err.Error(), tc.err)
154			} else {
155				require.NoError(t, err)
156				require.Equal(t, deserialized, tc.expected)
157			}
158		})
159	}
160}
161