1package cache
  2
  3import (
  4	"testing"
  5
  6	"github.com/stretchr/testify/require"
  7
  8	"github.com/MichaelMure/git-bug/query"
  9	"github.com/MichaelMure/git-bug/repository"
 10)
 11
 12func TestCache(t *testing.T) {
 13	repo := repository.CreateTestRepo(false)
 14	defer repository.CleanupTestRepos(t, repo)
 15
 16	cache, err := NewRepoCache(repo)
 17	require.NoError(t, err)
 18
 19	// Create, set and get user identity
 20	iden1, err := cache.NewIdentity("René Descartes", "rene@descartes.fr")
 21	require.NoError(t, err)
 22	err = cache.SetUserIdentity(iden1)
 23	require.NoError(t, err)
 24	userIden, err := cache.GetUserIdentity()
 25	require.NoError(t, err)
 26	require.Equal(t, iden1.Id(), userIden.Id())
 27
 28	// it's possible to create two identical identities
 29	iden2, err := cache.NewIdentity("René Descartes", "rene@descartes.fr")
 30	require.NoError(t, err)
 31
 32	// Two identical identities yield a different id
 33	require.NotEqual(t, iden1.Id(), iden2.Id())
 34
 35	// There is now two identities in the cache
 36	require.Len(t, cache.AllIdentityIds(), 2)
 37	require.Len(t, cache.identitiesExcerpts, 2)
 38	require.Len(t, cache.identities, 2)
 39
 40	// Create a bug
 41	bug1, _, err := cache.NewBug("title", "message")
 42	require.NoError(t, err)
 43
 44	// It's possible to create two identical bugs
 45	bug2, _, err := cache.NewBug("title", "message")
 46	require.NoError(t, err)
 47
 48	// two identical bugs yield a different id
 49	require.NotEqual(t, bug1.Id(), bug2.Id())
 50
 51	// There is now two bugs in the cache
 52	require.Len(t, cache.AllBugsIds(), 2)
 53	require.Len(t, cache.bugExcerpts, 2)
 54	require.Len(t, cache.bugs, 2)
 55
 56	// Resolving
 57	_, err = cache.ResolveIdentity(iden1.Id())
 58	require.NoError(t, err)
 59	_, err = cache.ResolveIdentityExcerpt(iden1.Id())
 60	require.NoError(t, err)
 61	_, err = cache.ResolveIdentityPrefix(iden1.Id().String()[:10])
 62	require.NoError(t, err)
 63
 64	_, err = cache.ResolveBug(bug1.Id())
 65	require.NoError(t, err)
 66	_, err = cache.ResolveBugExcerpt(bug1.Id())
 67	require.NoError(t, err)
 68	_, err = cache.ResolveBugPrefix(bug1.Id().String()[:10])
 69	require.NoError(t, err)
 70
 71	// Querying
 72	q, err := query.Parse("status:open author:descartes sort:edit-asc")
 73	require.NoError(t, err)
 74	require.Len(t, cache.QueryBugs(q), 2)
 75
 76	// Close
 77	require.NoError(t, cache.Close())
 78	require.Empty(t, cache.bugs)
 79	require.Empty(t, cache.bugExcerpts)
 80	require.Empty(t, cache.identities)
 81	require.Empty(t, cache.identitiesExcerpts)
 82
 83	// Reload, only excerpt are loaded
 84	require.NoError(t, cache.load())
 85	require.Empty(t, cache.bugs)
 86	require.Empty(t, cache.identities)
 87	require.Len(t, cache.bugExcerpts, 2)
 88	require.Len(t, cache.identitiesExcerpts, 2)
 89
 90	// Resolving load from the disk
 91	_, err = cache.ResolveIdentity(iden1.Id())
 92	require.NoError(t, err)
 93	_, err = cache.ResolveIdentityExcerpt(iden1.Id())
 94	require.NoError(t, err)
 95	_, err = cache.ResolveIdentityPrefix(iden1.Id().String()[:10])
 96	require.NoError(t, err)
 97
 98	_, err = cache.ResolveBug(bug1.Id())
 99	require.NoError(t, err)
100	_, err = cache.ResolveBugExcerpt(bug1.Id())
101	require.NoError(t, err)
102	_, err = cache.ResolveBugPrefix(bug1.Id().String()[:10])
103	require.NoError(t, err)
104}
105
106func TestPushPull(t *testing.T) {
107	repoA, repoB, remote := repository.SetupReposAndRemote(t)
108	defer repository.CleanupTestRepos(t, repoA, repoB, remote)
109
110	cacheA, err := NewRepoCache(repoA)
111	require.NoError(t, err)
112
113	cacheB, err := NewRepoCache(repoB)
114	require.NoError(t, err)
115
116	// Create, set and get user identity
117	reneA, err := cacheA.NewIdentity("René Descartes", "rene@descartes.fr")
118	require.NoError(t, err)
119	err = cacheA.SetUserIdentity(reneA)
120	require.NoError(t, err)
121
122	// distribute the identity
123	_, err = cacheA.Push("origin")
124	require.NoError(t, err)
125	err = cacheB.Pull("origin")
126	require.NoError(t, err)
127
128	// Create a bug in A
129	_, _, err = cacheA.NewBug("bug1", "message")
130	require.NoError(t, err)
131
132	// A --> remote --> B
133	_, err = cacheA.Push("origin")
134	require.NoError(t, err)
135
136	err = cacheB.Pull("origin")
137	require.NoError(t, err)
138
139	require.Len(t, cacheB.AllBugsIds(), 1)
140
141	// retrieve and set identity
142	reneB, err := cacheB.ResolveIdentity(reneA.Id())
143	require.NoError(t, err)
144
145	err = cacheB.SetUserIdentity(reneB)
146	require.NoError(t, err)
147
148	// B --> remote --> A
149	_, _, err = cacheB.NewBug("bug2", "message")
150	require.NoError(t, err)
151
152	_, err = cacheB.Push("origin")
153	require.NoError(t, err)
154
155	err = cacheA.Pull("origin")
156	require.NoError(t, err)
157
158	require.Len(t, cacheA.AllBugsIds(), 2)
159}