bug_actions_test.go

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