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