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/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}