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