bug_actions_test.go

  1package bug
  2
  3import (
  4	"time"
  5
  6	"github.com/MichaelMure/git-bug/identity"
  7	"github.com/MichaelMure/git-bug/util/test"
  8	"github.com/stretchr/testify/require"
  9
 10	"testing"
 11)
 12
 13func TestPushPull(t *testing.T) {
 14	repoA, repoB, remote := test.SetupReposAndRemote(t)
 15	defer test.CleanupRepos(repoA, repoB, remote)
 16
 17	reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 18
 19	bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
 20	require.NoError(t, err)
 21	err = bug1.Commit(repoA)
 22	require.NoError(t, err)
 23
 24	// A --> remote --> B
 25	_, err = Push(repoA, "origin")
 26	require.NoError(t, err)
 27
 28	err = Pull(repoB, "origin")
 29	require.NoError(t, err)
 30
 31	bugs := allBugs(t, ReadAllLocalBugs(repoB))
 32
 33	if len(bugs) != 1 {
 34		t.Fatal("Unexpected number of bugs")
 35	}
 36
 37	// B --> remote --> A
 38	reneB, err := identity.ReadLocal(repoA, reneA.Id())
 39	require.NoError(t, err)
 40
 41	bug2, _, err := Create(reneB, time.Now().Unix(), "bug2", "message")
 42	require.NoError(t, err)
 43	err = bug2.Commit(repoB)
 44	require.NoError(t, err)
 45
 46	_, err = Push(repoB, "origin")
 47	require.NoError(t, err)
 48
 49	err = Pull(repoA, "origin")
 50	require.NoError(t, err)
 51
 52	bugs = allBugs(t, ReadAllLocalBugs(repoA))
 53
 54	if len(bugs) != 2 {
 55		t.Fatal("Unexpected number of bugs")
 56	}
 57}
 58
 59func allBugs(t testing.TB, bugs <-chan StreamedBug) []*Bug {
 60	var result []*Bug
 61	for streamed := range bugs {
 62		if streamed.Err != nil {
 63			t.Fatal(streamed.Err)
 64		}
 65		result = append(result, streamed.Bug)
 66	}
 67	return result
 68}
 69
 70func TestRebaseTheirs(t *testing.T) {
 71	_RebaseTheirs(t)
 72}
 73
 74func BenchmarkRebaseTheirs(b *testing.B) {
 75	for n := 0; n < b.N; n++ {
 76		_RebaseTheirs(b)
 77	}
 78}
 79
 80func _RebaseTheirs(t testing.TB) {
 81	repoA, repoB, remote := test.SetupReposAndRemote(t)
 82	defer test.CleanupRepos(repoA, repoB, remote)
 83
 84	reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 85
 86	bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
 87	require.NoError(t, err)
 88	err = bug1.Commit(repoA)
 89	require.NoError(t, err)
 90
 91	// A --> remote
 92	_, err = Push(repoA, "origin")
 93	require.NoError(t, err)
 94
 95	// remote --> B
 96	err = Pull(repoB, "origin")
 97	require.NoError(t, err)
 98
 99	bug2, err := ReadLocalBug(repoB, bug1.Id())
100	require.NoError(t, err)
101
102	reneB, err := identity.ReadLocal(repoA, reneA.Id())
103	require.NoError(t, err)
104
105	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message2")
106	require.NoError(t, err)
107	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message3")
108	require.NoError(t, err)
109	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message4")
110	require.NoError(t, err)
111	err = bug2.Commit(repoB)
112	require.NoError(t, err)
113
114	// B --> remote
115	_, err = Push(repoB, "origin")
116	require.NoError(t, err)
117
118	// remote --> A
119	err = Pull(repoA, "origin")
120	require.NoError(t, err)
121
122	bugs := allBugs(t, ReadAllLocalBugs(repoB))
123
124	if len(bugs) != 1 {
125		t.Fatal("Unexpected number of bugs")
126	}
127
128	bug3, err := ReadLocalBug(repoA, bug1.Id())
129	require.NoError(t, err)
130
131	if nbOps(bug3) != 4 {
132		t.Fatal("Unexpected number of operations")
133	}
134}
135
136func TestRebaseOurs(t *testing.T) {
137	_RebaseOurs(t)
138}
139
140func BenchmarkRebaseOurs(b *testing.B) {
141	for n := 0; n < b.N; n++ {
142		_RebaseOurs(b)
143	}
144}
145
146func _RebaseOurs(t testing.TB) {
147	repoA, repoB, remote := test.SetupReposAndRemote(t)
148	defer test.CleanupRepos(repoA, repoB, remote)
149
150	reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
151
152	bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
153	require.NoError(t, err)
154	err = bug1.Commit(repoA)
155	require.NoError(t, err)
156
157	// A --> remote
158	_, err = Push(repoA, "origin")
159	require.NoError(t, err)
160
161	// remote --> B
162	err = Pull(repoB, "origin")
163	require.NoError(t, err)
164
165	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message2")
166	require.NoError(t, err)
167	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message3")
168	require.NoError(t, err)
169	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message4")
170	require.NoError(t, err)
171	err = bug1.Commit(repoA)
172	require.NoError(t, err)
173
174	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message5")
175	require.NoError(t, err)
176	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message6")
177	require.NoError(t, err)
178	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message7")
179	require.NoError(t, err)
180	err = bug1.Commit(repoA)
181	require.NoError(t, err)
182
183	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message8")
184	require.NoError(t, err)
185	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message9")
186	require.NoError(t, err)
187	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message10")
188	require.NoError(t, err)
189	err = bug1.Commit(repoA)
190	require.NoError(t, err)
191
192	// remote --> A
193	err = Pull(repoA, "origin")
194	require.NoError(t, err)
195
196	bugs := allBugs(t, ReadAllLocalBugs(repoA))
197
198	if len(bugs) != 1 {
199		t.Fatal("Unexpected number of bugs")
200	}
201
202	bug2, err := ReadLocalBug(repoA, bug1.Id())
203	require.NoError(t, err)
204
205	if nbOps(bug2) != 10 {
206		t.Fatal("Unexpected number of operations")
207	}
208}
209
210func nbOps(b *Bug) int {
211	it := NewOperationIterator(b)
212	counter := 0
213	for it.Next() {
214		counter++
215	}
216	return counter
217}
218
219func TestRebaseConflict(t *testing.T) {
220	_RebaseConflict(t)
221}
222
223func BenchmarkRebaseConflict(b *testing.B) {
224	for n := 0; n < b.N; n++ {
225		_RebaseConflict(b)
226	}
227}
228
229func _RebaseConflict(t testing.TB) {
230	repoA, repoB, remote := test.SetupReposAndRemote(t)
231	defer test.CleanupRepos(repoA, repoB, remote)
232
233	reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
234
235	bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
236	require.NoError(t, err)
237	err = bug1.Commit(repoA)
238	require.NoError(t, err)
239
240	// A --> remote
241	_, err = Push(repoA, "origin")
242	require.NoError(t, err)
243
244	// remote --> B
245	err = Pull(repoB, "origin")
246	require.NoError(t, err)
247
248	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message2")
249	require.NoError(t, err)
250	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message3")
251	require.NoError(t, err)
252	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message4")
253	require.NoError(t, err)
254	err = bug1.Commit(repoA)
255	require.NoError(t, err)
256
257	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message5")
258	require.NoError(t, err)
259	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message6")
260	require.NoError(t, err)
261	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message7")
262	require.NoError(t, err)
263	err = bug1.Commit(repoA)
264	require.NoError(t, err)
265
266	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message8")
267	require.NoError(t, err)
268	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message9")
269	require.NoError(t, err)
270	_, err = AddComment(bug1, reneA, time.Now().Unix(), "message10")
271	require.NoError(t, err)
272	err = bug1.Commit(repoA)
273	require.NoError(t, err)
274
275	bug2, err := ReadLocalBug(repoB, bug1.Id())
276	require.NoError(t, err)
277
278	reneB, err := identity.ReadLocal(repoA, reneA.Id())
279	require.NoError(t, err)
280
281	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message11")
282	require.NoError(t, err)
283	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message12")
284	require.NoError(t, err)
285	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message13")
286	require.NoError(t, err)
287	err = bug2.Commit(repoB)
288	require.NoError(t, err)
289
290	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message14")
291	require.NoError(t, err)
292	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message15")
293	require.NoError(t, err)
294	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message16")
295	require.NoError(t, err)
296	err = bug2.Commit(repoB)
297	require.NoError(t, err)
298
299	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message17")
300	require.NoError(t, err)
301	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message18")
302	require.NoError(t, err)
303	_, err = AddComment(bug2, reneB, time.Now().Unix(), "message19")
304	require.NoError(t, err)
305	err = bug2.Commit(repoB)
306	require.NoError(t, err)
307
308	// A --> remote
309	_, err = Push(repoA, "origin")
310	require.NoError(t, err)
311
312	// remote --> B
313	err = Pull(repoB, "origin")
314	require.NoError(t, err)
315
316	bugs := allBugs(t, ReadAllLocalBugs(repoB))
317
318	if len(bugs) != 1 {
319		t.Fatal("Unexpected number of bugs")
320	}
321
322	bug3, err := ReadLocalBug(repoB, bug1.Id())
323	require.NoError(t, err)
324
325	if nbOps(bug3) != 19 {
326		t.Fatal("Unexpected number of operations")
327	}
328
329	// B --> remote
330	_, err = Push(repoB, "origin")
331	require.NoError(t, err)
332
333	// remote --> A
334	err = Pull(repoA, "origin")
335	require.NoError(t, err)
336
337	bugs = allBugs(t, ReadAllLocalBugs(repoA))
338
339	if len(bugs) != 1 {
340		t.Fatal("Unexpected number of bugs")
341	}
342
343	bug4, err := ReadLocalBug(repoA, bug1.Id())
344	require.NoError(t, err)
345
346	if nbOps(bug4) != 19 {
347		t.Fatal("Unexpected number of operations")
348	}
349}