bug_actions_test.go

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