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}