1package git2go
2
3import (
4	"bytes"
5	"testing"
6
7	"github.com/stretchr/testify/require"
8)
9
10func TestConflictsCommand_Serialization(t *testing.T) {
11	testcases := []struct {
12		desc string
13		cmd  ConflictsCommand
14		err  string
15	}{
16		{
17			desc: "missing repository",
18			cmd:  ConflictsCommand{},
19			err:  "missing repository",
20		},
21		{
22			desc: "missing theirs",
23			cmd: ConflictsCommand{
24				Repository: "foo",
25				Ours:       "refs/heads/master",
26			},
27			err: "missing theirs",
28		},
29		{
30			desc: "missing ours",
31			cmd: ConflictsCommand{
32				Repository: "foo",
33				Theirs:     "refs/heads/master",
34			},
35			err: "missing ours",
36		},
37		{
38			desc: "valid command",
39			cmd: ConflictsCommand{
40				Repository: "foo",
41				Ours:       "refs/heads/master",
42				Theirs:     "refs/heads/foo",
43			},
44		},
45	}
46
47	for _, tc := range testcases {
48		t.Run(tc.desc, func(t *testing.T) {
49			serialized, err := serialize(tc.cmd)
50			require.NoError(t, err)
51
52			deserialized, err := ConflictsCommandFromSerialized(serialized)
53
54			if tc.err != "" {
55				require.Error(t, err)
56				require.Contains(t, err.Error(), tc.err)
57			} else {
58				require.NoError(t, err)
59				require.Equal(t, deserialized, tc.cmd)
60			}
61		})
62	}
63}
64
65func TestConflictsResult_Serialization(t *testing.T) {
66	serializeResult := func(t *testing.T, result ConflictsResult) string {
67		var buf bytes.Buffer
68		err := result.SerializeTo(&buf)
69		require.NoError(t, err)
70		return buf.String()
71	}
72
73	testcases := []struct {
74		desc       string
75		serialized string
76		expected   ConflictsResult
77		err        string
78	}{
79		{
80			desc:       "empty merge result",
81			serialized: serializeResult(t, ConflictsResult{}),
82			expected:   ConflictsResult{},
83		},
84		{
85			desc: "merge result with commit",
86			serialized: serializeResult(t, ConflictsResult{
87				Conflicts: []Conflict{
88					{
89						Ancestor: ConflictEntry{Path: "dir/ancestor", Mode: 0o100644},
90						Our:      ConflictEntry{Path: "dir/our", Mode: 0o100644},
91						Their:    ConflictEntry{Path: "dir/their", Mode: 0o100644},
92						Content:  []byte("content"),
93					},
94				},
95			}),
96			expected: ConflictsResult{
97				Conflicts: []Conflict{
98					{
99						Ancestor: ConflictEntry{Path: "dir/ancestor", Mode: 0o100644},
100						Our:      ConflictEntry{Path: "dir/our", Mode: 0o100644},
101						Their:    ConflictEntry{Path: "dir/their", Mode: 0o100644},
102						Content:  []byte("content"),
103					},
104				},
105			},
106		},
107		{
108			desc:       "invalid serialized representation",
109			serialized: "xvlc",
110			err:        "invalid character",
111		},
112	}
113
114	for _, tc := range testcases {
115		t.Run(tc.desc, func(t *testing.T) {
116			var deserialized ConflictsResult
117			err := deserialize(tc.serialized, &deserialized)
118
119			if tc.err != "" {
120				require.Error(t, err)
121				require.Contains(t, err.Error(), tc.err)
122			} else {
123				require.NoError(t, err)
124				require.Equal(t, deserialized, tc.expected)
125			}
126		})
127	}
128}
129