1package bug
2
3import (
4 "fmt"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/MichaelMure/git-bug/identity"
12 "github.com/MichaelMure/git-bug/repository"
13)
14
15func TestBugId(t *testing.T) {
16 mockRepo := repository.NewMockRepoForTest()
17
18 bug1 := NewBug()
19
20 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
21 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
22
23 bug1.Append(createOp)
24
25 err := bug1.Commit(mockRepo)
26
27 if err != nil {
28 t.Fatal(err)
29 }
30
31 bug1.Id()
32}
33
34func TestBugValidity(t *testing.T) {
35 mockRepo := repository.NewMockRepoForTest()
36
37 bug1 := NewBug()
38
39 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
40 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
41
42 if bug1.Validate() == nil {
43 t.Fatal("Empty bug should be invalid")
44 }
45
46 bug1.Append(createOp)
47
48 if bug1.Validate() != nil {
49 t.Fatal("Bug with just a CreateOp should be valid")
50 }
51
52 err := bug1.Commit(mockRepo)
53 if err != nil {
54 t.Fatal(err)
55 }
56
57 bug1.Append(createOp)
58
59 if bug1.Validate() == nil {
60 t.Fatal("Bug with multiple CreateOp should be invalid")
61 }
62
63 err = bug1.Commit(mockRepo)
64 if err == nil {
65 t.Fatal("Invalid bug should not commit")
66 }
67}
68
69func TestBugCommitLoad(t *testing.T) {
70 bug1 := NewBug()
71
72 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
73 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
74 setTitleOp := NewSetTitleOp(rene, time.Now().Unix(), "title2", "title1")
75 addCommentOp := NewAddCommentOp(rene, time.Now().Unix(), "message2", nil)
76
77 bug1.Append(createOp)
78 bug1.Append(setTitleOp)
79
80 repo := repository.NewMockRepoForTest()
81
82 assert.True(t, bug1.NeedCommit())
83
84 err := bug1.Commit(repo)
85 assert.Nil(t, err)
86 assert.False(t, bug1.NeedCommit())
87
88 bug2, err := ReadLocalBug(repo, bug1.Id())
89 assert.NoError(t, err)
90 equivalentBug(t, bug1, bug2)
91
92 // add more op
93
94 bug1.Append(addCommentOp)
95
96 assert.True(t, bug1.NeedCommit())
97
98 err = bug1.Commit(repo)
99 assert.Nil(t, err)
100 assert.False(t, bug1.NeedCommit())
101
102 bug3, err := ReadLocalBug(repo, bug1.Id())
103 assert.NoError(t, err)
104 equivalentBug(t, bug1, bug3)
105}
106
107func equivalentBug(t *testing.T, expected, actual *Bug) {
108 assert.Equal(t, len(expected.packs), len(actual.packs))
109
110 for i := range expected.packs {
111 for j := range expected.packs[i].Operations {
112 actual.packs[i].Operations[j].base().id = expected.packs[i].Operations[j].base().id
113 }
114 }
115
116 assert.Equal(t, expected, actual)
117}
118
119func TestBugRemove(t *testing.T) {
120 repo := repository.CreateGoGitTestRepo(false)
121 remoteA := repository.CreateGoGitTestRepo(true)
122 remoteB := repository.CreateGoGitTestRepo(true)
123 defer repository.CleanupTestRepos(repo, remoteA, remoteB)
124
125 err := repo.AddRemote("remoteA", "file://"+remoteA.GetPath())
126 require.NoError(t, err)
127
128 err = repo.AddRemote("remoteB", "file://"+remoteB.GetPath())
129 require.NoError(t, err)
130
131 // generate a bunch of bugs
132 rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
133 err = rene.Commit(repo)
134 require.NoError(t, err)
135
136 for i := 0; i < 100; i++ {
137 b := NewBug()
138 createOp := NewCreateOp(rene, time.Now().Unix(), "title", fmt.Sprintf("message%v", i), nil)
139 b.Append(createOp)
140 err = b.Commit(repo)
141 require.NoError(t, err)
142 }
143
144 // and one more for testing
145 b := NewBug()
146 createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
147 b.Append(createOp)
148 err = b.Commit(repo)
149 require.NoError(t, err)
150
151 _, err = Push(repo, "remoteA")
152 require.NoError(t, err)
153
154 _, err = Push(repo, "remoteB")
155 require.NoError(t, err)
156
157 _, err = Fetch(repo, "remoteA")
158 require.NoError(t, err)
159
160 _, err = Fetch(repo, "remoteB")
161 require.NoError(t, err)
162
163 err = RemoveBug(repo, b.Id())
164 require.NoError(t, err)
165
166 _, err = ReadLocalBug(repo, b.Id())
167 require.Error(t, ErrBugNotExist, err)
168
169 _, err = ReadRemoteBug(repo, "remoteA", b.Id())
170 require.Error(t, ErrBugNotExist, err)
171
172 _, err = ReadRemoteBug(repo, "remoteB", b.Id())
173 require.Error(t, ErrBugNotExist, err)
174
175 ids, err := ListLocalIds(repo)
176 require.NoError(t, err)
177 require.Len(t, ids, 100)
178}