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