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