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