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