aboutsummaryrefslogtreecommitdiffstats
path: root/bug/bug_actions_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'bug/bug_actions_test.go')
-rw-r--r--bug/bug_actions_test.go388
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")
+ }
+}