bug_actions_test.go

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