bug_actions_test.go

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