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