repo_cache_test.go

  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}