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