1package cache
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/bug"
12 "github.com/MichaelMure/git-bug/query"
13 "github.com/MichaelMure/git-bug/repository"
14)
15
16func TestCache(t *testing.T) {
17 repo := repository.CreateTestRepo(false)
18 defer repository.CleanupTestRepos(repo)
19
20 cache, err := NewRepoCache(repo)
21 require.NoError(t, err)
22
23 // Create, set and get user identity
24 iden1, err := cache.NewIdentity("René Descartes", "rene@descartes.fr")
25 require.NoError(t, err)
26 err = cache.SetUserIdentity(iden1)
27 require.NoError(t, err)
28 userIden, err := cache.GetUserIdentity()
29 require.NoError(t, err)
30 require.Equal(t, iden1.Id(), userIden.Id())
31
32 // it's possible to create two identical identities
33 iden2, err := cache.NewIdentity("René Descartes", "rene@descartes.fr")
34 require.NoError(t, err)
35
36 // Two identical identities yield a different id
37 require.NotEqual(t, iden1.Id(), iden2.Id())
38
39 // There is now two identities in the cache
40 require.Len(t, cache.AllIdentityIds(), 2)
41 require.Len(t, cache.identitiesExcerpts, 2)
42 require.Len(t, cache.identities, 2)
43
44 // Create a bug
45 bug1, _, err := cache.NewBug("title", "message")
46 require.NoError(t, err)
47
48 // It's possible to create two identical bugs
49 bug2, _, err := cache.NewBug("title", "message")
50 require.NoError(t, err)
51
52 // two identical bugs yield a different id
53 require.NotEqual(t, bug1.Id(), bug2.Id())
54
55 // There is now two bugs in the cache
56 require.Len(t, cache.AllBugsIds(), 2)
57 require.Len(t, cache.bugExcerpts, 2)
58 require.Len(t, cache.bugs, 2)
59
60 // Resolving
61 _, err = cache.ResolveIdentity(iden1.Id())
62 require.NoError(t, err)
63 _, err = cache.ResolveIdentityExcerpt(iden1.Id())
64 require.NoError(t, err)
65 _, err = cache.ResolveIdentityPrefix(iden1.Id().String()[:10])
66 require.NoError(t, err)
67
68 _, err = cache.ResolveBug(bug1.Id())
69 require.NoError(t, err)
70 _, err = cache.ResolveBugExcerpt(bug1.Id())
71 require.NoError(t, err)
72 _, err = cache.ResolveBugPrefix(bug1.Id().String()[:10])
73 require.NoError(t, err)
74
75 // Querying
76 q, err := query.Parse("status:open author:descartes sort:edit-asc")
77 require.NoError(t, err)
78 require.Len(t, cache.QueryBugs(q), 2)
79
80 // Close
81 require.NoError(t, cache.Close())
82 require.Empty(t, cache.bugs)
83 require.Empty(t, cache.bugExcerpts)
84 require.Empty(t, cache.identities)
85 require.Empty(t, cache.identitiesExcerpts)
86
87 // Reload, only excerpt are loaded
88 require.NoError(t, cache.load())
89 require.Empty(t, cache.bugs)
90 require.Empty(t, cache.identities)
91 require.Len(t, cache.bugExcerpts, 2)
92 require.Len(t, cache.identitiesExcerpts, 2)
93
94 // Resolving load from the disk
95 _, err = cache.ResolveIdentity(iden1.Id())
96 require.NoError(t, err)
97 _, err = cache.ResolveIdentityExcerpt(iden1.Id())
98 require.NoError(t, err)
99 _, err = cache.ResolveIdentityPrefix(iden1.Id().String()[:10])
100 require.NoError(t, err)
101
102 _, err = cache.ResolveBug(bug1.Id())
103 require.NoError(t, err)
104 _, err = cache.ResolveBugExcerpt(bug1.Id())
105 require.NoError(t, err)
106 _, err = cache.ResolveBugPrefix(bug1.Id().String()[:10])
107 require.NoError(t, err)
108}
109
110func TestPushPull(t *testing.T) {
111 repoA, repoB, remote := repository.SetupReposAndRemote()
112 defer repository.CleanupTestRepos(repoA, repoB, remote)
113
114 cacheA, err := NewRepoCache(repoA)
115 require.NoError(t, err)
116
117 cacheB, err := NewRepoCache(repoB)
118 require.NoError(t, err)
119
120 // Create, set and get user identity
121 reneA, err := cacheA.NewIdentity("René Descartes", "rene@descartes.fr")
122 require.NoError(t, err)
123 err = cacheA.SetUserIdentity(reneA)
124 require.NoError(t, err)
125
126 // distribute the identity
127 _, err = cacheA.Push("origin")
128 require.NoError(t, err)
129 err = cacheB.Pull("origin")
130 require.NoError(t, err)
131
132 // Create a bug in A
133 _, _, err = cacheA.NewBug("bug1", "message")
134 require.NoError(t, err)
135
136 // A --> remote --> B
137 _, err = cacheA.Push("origin")
138 require.NoError(t, err)
139
140 err = cacheB.Pull("origin")
141 require.NoError(t, err)
142
143 require.Len(t, cacheB.AllBugsIds(), 1)
144
145 // retrieve and set identity
146 reneB, err := cacheB.ResolveIdentity(reneA.Id())
147 require.NoError(t, err)
148
149 err = cacheB.SetUserIdentity(reneB)
150 require.NoError(t, err)
151
152 // B --> remote --> A
153 _, _, err = cacheB.NewBug("bug2", "message")
154 require.NoError(t, err)
155
156 _, err = cacheB.Push("origin")
157 require.NoError(t, err)
158
159 err = cacheA.Pull("origin")
160 require.NoError(t, err)
161
162 require.Len(t, cacheA.AllBugsIds(), 2)
163}
164
165func TestRemove(t *testing.T) {
166 repo := repository.CreateTestRepo(false)
167 remoteA := repository.CreateTestRepo(true)
168 remoteB := repository.CreateTestRepo(true)
169 defer repository.CleanupTestRepos(repo, remoteA, remoteB)
170
171 err := repo.AddRemote("remoteA", "file://"+remoteA.GetPath())
172 require.NoError(t, err)
173
174 err = repo.AddRemote("remoteB", "file://"+remoteB.GetPath())
175 require.NoError(t, err)
176
177 repoCache, err := NewRepoCache(repo)
178 require.NoError(t, err)
179
180 // generate a bunch of bugs
181 rene, err := repoCache.NewIdentity("René Descartes", "rene@descartes.fr")
182 require.NoError(t, err)
183
184 for i := 0; i < 100; i++ {
185 _, _, err := repoCache.NewBugRaw(rene, time.Now().Unix(), "title", fmt.Sprintf("message%v", i), nil, nil)
186 require.NoError(t, err)
187 }
188
189 // and one more for testing
190 b1, _, err := repoCache.NewBugRaw(rene, time.Now().Unix(), "title", "message", nil, nil)
191 require.NoError(t, err)
192
193 _, err = repoCache.Push("remoteA")
194 require.NoError(t, err)
195
196 _, err = repoCache.Push("remoteB")
197 require.NoError(t, err)
198
199 _, err = repoCache.Fetch("remoteA")
200 require.NoError(t, err)
201
202 _, err = repoCache.Fetch("remoteB")
203 require.NoError(t, err)
204
205 err = repoCache.RemoveBug(b1.Id().String())
206 require.NoError(t, err)
207 assert.Equal(t, 100, len(repoCache.bugs))
208 assert.Equal(t, 100, len(repoCache.bugExcerpts))
209
210 _, err = repoCache.ResolveBug(b1.Id())
211 assert.Error(t, bug.ErrBugNotExist, err)
212}