diff options
Diffstat (limited to 'bug/bug_actions_test.go')
-rw-r--r-- | bug/bug_actions_test.go | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/bug/bug_actions_test.go b/bug/bug_actions_test.go new file mode 100644 index 00000000..ee9fbd72 --- /dev/null +++ b/bug/bug_actions_test.go @@ -0,0 +1,388 @@ +package bug + +import ( + "github.com/MichaelMure/git-bug/repository" + "github.com/stretchr/testify/assert" + + "io/ioutil" + "log" + "os" + "testing" +) + +func createRepo(bare bool) *repository.GitRepo { + dir, err := ioutil.TempDir("", "") + if err != nil { + log.Fatal(err) + } + + // fmt.Println("Creating repo:", dir) + + var creator func(string) (*repository.GitRepo, error) + + if bare { + creator = repository.InitBareGitRepo + } else { + creator = repository.InitGitRepo + } + + repo, err := creator(dir) + if err != nil { + log.Fatal(err) + } + + return repo +} + +func cleanupRepo(repo repository.Repo) error { + path := repo.GetPath() + // fmt.Println("Cleaning repo:", path) + return os.RemoveAll(path) +} + +func setupRepos(t testing.TB) (repoA, repoB, remote *repository.GitRepo) { + repoA = createRepo(false) + repoB = createRepo(false) + remote = createRepo(true) + + remoteAddr := "file://" + remote.GetPath() + + err := repoA.AddRemote("origin", remoteAddr) + if err != nil { + t.Fatal(err) + } + + err = repoB.AddRemote("origin", remoteAddr) + if err != nil { + t.Fatal(err) + } + + return repoA, repoB, remote +} + +func cleanupRepos(repoA, repoB, remote *repository.GitRepo) { + cleanupRepo(repoA) + cleanupRepo(repoB) + cleanupRepo(remote) +} + +func TestPushPull(t *testing.T) { + repoA, repoB, remote := setupRepos(t) + defer cleanupRepos(repoA, repoB, remote) + + bug1, err := Create(rene, unix, "bug1", "message") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + // A --> remote --> B + _, err = Push(repoA, "origin") + assert.Nil(t, err) + + err = Pull(repoB, "origin") + assert.Nil(t, err) + + bugs := allBugs(t, ReadAllLocalBugs(repoB)) + + if len(bugs) != 1 { + t.Fatal("Unexpected number of bugs") + } + + // B --> remote --> A + bug2, err := Create(rene, unix, "bug2", "message") + assert.Nil(t, err) + err = bug2.Commit(repoB) + assert.Nil(t, err) + + _, err = Push(repoB, "origin") + assert.Nil(t, err) + + err = Pull(repoA, "origin") + assert.Nil(t, err) + + bugs = allBugs(t, ReadAllLocalBugs(repoA)) + + if len(bugs) != 2 { + t.Fatal("Unexpected number of bugs") + } +} + +func allBugs(t testing.TB, bugs <-chan StreamedBug) []*Bug { + var result []*Bug + for streamed := range bugs { + if streamed.Err != nil { + t.Fatal(streamed.Err) + } + result = append(result, streamed.Bug) + } + return result +} + +func TestRebaseTheirs(t *testing.T) { + _RebaseTheirs(t) +} + +func BenchmarkRebaseTheirs(b *testing.B) { + for n := 0; n < b.N; n++ { + _RebaseTheirs(b) + } +} + +func _RebaseTheirs(t testing.TB) { + repoA, repoB, remote := setupRepos(t) + defer cleanupRepos(repoA, repoB, remote) + + bug1, err := Create(rene, unix, "bug1", "message") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + // A --> remote + _, err = Push(repoA, "origin") + assert.Nil(t, err) + + // remote --> B + err = Pull(repoB, "origin") + assert.Nil(t, err) + + bug2, err := ReadLocalBug(repoB, bug1.Id()) + assert.Nil(t, err) + + err = AddComment(bug2, rene, unix, "message2") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message3") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message4") + assert.Nil(t, err) + err = bug2.Commit(repoB) + assert.Nil(t, err) + + // B --> remote + _, err = Push(repoB, "origin") + assert.Nil(t, err) + + // remote --> A + err = Pull(repoA, "origin") + assert.Nil(t, err) + + bugs := allBugs(t, ReadAllLocalBugs(repoB)) + + if len(bugs) != 1 { + t.Fatal("Unexpected number of bugs") + } + + bug3, err := ReadLocalBug(repoA, bug1.Id()) + assert.Nil(t, err) + + if nbOps(bug3) != 4 { + t.Fatal("Unexpected number of operations") + } +} + +func TestRebaseOurs(t *testing.T) { + _RebaseOurs(t) +} + +func BenchmarkRebaseOurs(b *testing.B) { + for n := 0; n < b.N; n++ { + _RebaseOurs(b) + } +} + +func _RebaseOurs(t testing.TB) { + repoA, repoB, remote := setupRepos(t) + defer cleanupRepos(repoA, repoB, remote) + + bug1, err := Create(rene, unix, "bug1", "message") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + // A --> remote + _, err = Push(repoA, "origin") + assert.Nil(t, err) + + // remote --> B + err = Pull(repoB, "origin") + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message2") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message3") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message4") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message5") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message6") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message7") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message8") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message9") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message10") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + // remote --> A + err = Pull(repoA, "origin") + assert.Nil(t, err) + + bugs := allBugs(t, ReadAllLocalBugs(repoA)) + + if len(bugs) != 1 { + t.Fatal("Unexpected number of bugs") + } + + bug2, err := ReadLocalBug(repoA, bug1.Id()) + assert.Nil(t, err) + + if nbOps(bug2) != 10 { + t.Fatal("Unexpected number of operations") + } +} + +func nbOps(b *Bug) int { + it := NewOperationIterator(b) + counter := 0 + for it.Next() { + counter++ + } + return counter +} + +func TestRebaseConflict(t *testing.T) { + _RebaseConflict(t) +} + +func BenchmarkRebaseConflict(b *testing.B) { + for n := 0; n < b.N; n++ { + _RebaseConflict(b) + } +} + +func _RebaseConflict(t testing.TB) { + repoA, repoB, remote := setupRepos(t) + defer cleanupRepos(repoA, repoB, remote) + + bug1, err := Create(rene, unix, "bug1", "message") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + // A --> remote + _, err = Push(repoA, "origin") + assert.Nil(t, err) + + // remote --> B + err = Pull(repoB, "origin") + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message2") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message3") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message4") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message5") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message6") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message7") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + err = AddComment(bug1, rene, unix, "message8") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message9") + assert.Nil(t, err) + err = AddComment(bug1, rene, unix, "message10") + assert.Nil(t, err) + err = bug1.Commit(repoA) + assert.Nil(t, err) + + bug2, err := ReadLocalBug(repoB, bug1.Id()) + assert.Nil(t, err) + + err = AddComment(bug2, rene, unix, "message11") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message12") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message13") + assert.Nil(t, err) + err = bug2.Commit(repoB) + assert.Nil(t, err) + + err = AddComment(bug2, rene, unix, "message14") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message15") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message16") + assert.Nil(t, err) + err = bug2.Commit(repoB) + assert.Nil(t, err) + + err = AddComment(bug2, rene, unix, "message17") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message18") + assert.Nil(t, err) + err = AddComment(bug2, rene, unix, "message19") + assert.Nil(t, err) + err = bug2.Commit(repoB) + assert.Nil(t, err) + + // A --> remote + _, err = Push(repoA, "origin") + assert.Nil(t, err) + + // remote --> B + err = Pull(repoB, "origin") + assert.Nil(t, err) + + bugs := allBugs(t, ReadAllLocalBugs(repoB)) + + if len(bugs) != 1 { + t.Fatal("Unexpected number of bugs") + } + + bug3, err := ReadLocalBug(repoB, bug1.Id()) + assert.Nil(t, err) + + if nbOps(bug3) != 19 { + t.Fatal("Unexpected number of operations") + } + + // B --> remote + _, err = Push(repoB, "origin") + assert.Nil(t, err) + + // remote --> A + err = Pull(repoA, "origin") + assert.Nil(t, err) + + bugs = allBugs(t, ReadAllLocalBugs(repoA)) + + if len(bugs) != 1 { + t.Fatal("Unexpected number of bugs") + } + + bug4, err := ReadLocalBug(repoA, bug1.Id()) + assert.Nil(t, err) + + if nbOps(bug4) != 19 { + t.Fatal("Unexpected number of operations") + } +} |