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