|
1 | 1 | package lockdown |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "context" |
5 | 4 | "net/http" |
6 | 5 | "sync" |
7 | 6 | "testing" |
@@ -84,119 +83,21 @@ func newMockRepoAccessCache(t *testing.T, ttl time.Duration) (*RepoAccessCache, |
84 | 83 |
|
85 | 84 | gqlClient := githubv4.NewClient(httpClient) |
86 | 85 |
|
87 | | - return NewRepoAccessCache(gqlClient, WithTTL(ttl)), counting |
88 | | -} |
89 | | - |
90 | | -func requireAccess(ctx context.Context, t *testing.T, cache *RepoAccessCache) { |
91 | | - t.Helper() |
92 | | - |
93 | | - isPrivate, hasPush, err := cache.GetRepoAccessInfo(ctx, testUser, testOwner, testRepo) |
94 | | - require.NoError(t, err) |
95 | | - require.False(t, isPrivate) |
96 | | - require.True(t, hasPush) |
| 86 | + return GetInstance(gqlClient, WithTTL(ttl)), counting |
97 | 87 | } |
98 | 88 |
|
99 | 89 | func TestRepoAccessCacheEvictsAfterTTL(t *testing.T) { |
100 | 90 | t.Parallel() |
101 | 91 | ctx := t.Context() |
102 | 92 |
|
103 | 93 | cache, transport := newMockRepoAccessCache(t, 5*time.Millisecond) |
104 | | - requireAccess(ctx, t, cache) |
105 | | - requireAccess(ctx, t, cache) |
106 | | - require.EqualValues(t, 1, transport.CallCount()) |
107 | | - |
108 | | - time.Sleep(20 * time.Millisecond) |
109 | | - |
110 | | - requireAccess(ctx, t, cache) |
111 | | - require.EqualValues(t, 2, transport.CallCount()) |
112 | | -} |
113 | | - |
114 | | -func TestRepoAccessCacheTTLDisabled(t *testing.T) { |
115 | | - ctx := t.Context() |
116 | | - t.Parallel() |
117 | | - |
118 | | - // make sure cache TTL is sufficiently large to avoid evictions during the test |
119 | | - cache, transport := newMockRepoAccessCache(t, 1000*time.Millisecond) |
120 | | - |
121 | | - requireAccess(ctx, t, cache) |
122 | | - requireAccess(ctx, t, cache) |
123 | | - require.EqualValues(t, 1, transport.CallCount()) |
124 | | - |
125 | | - requireAccess(ctx, t, cache) |
126 | | - require.EqualValues(t, 1, transport.CallCount()) |
127 | | -} |
128 | | - |
129 | | -func TestRepoAccessCacheSetTTLReschedulesExistingEntry(t *testing.T) { |
130 | | - ctx := t.Context() |
131 | | - t.Parallel() |
132 | | - |
133 | | - cache, transport := newMockRepoAccessCache(t, 10*time.Millisecond) |
134 | | - |
135 | | - requireAccess(ctx, t, cache) |
| 94 | + _, _, err := cache.GetRepoAccessInfo(ctx, testUser, testOwner, testRepo) |
| 95 | + require.NoError(t, err) |
136 | 96 | require.EqualValues(t, 1, transport.CallCount()) |
137 | 97 |
|
138 | | - cache.SetTTL(5 * time.Millisecond) |
139 | | - |
140 | 98 | time.Sleep(20 * time.Millisecond) |
141 | 99 |
|
142 | | - requireAccess(ctx, t, cache) |
143 | | - require.EqualValues(t, 2, transport.CallCount()) |
144 | | - |
145 | | - requireAccess(ctx, t, cache) |
| 100 | + _, _, err = cache.GetRepoAccessInfo(ctx, testUser, testOwner, testRepo) |
| 101 | + require.NoError(t, err) |
146 | 102 | require.EqualValues(t, 2, transport.CallCount()) |
147 | 103 | } |
148 | | - |
149 | | -func TestGetInstanceReturnsSingleton(t *testing.T) { |
150 | | - // Reset any existing singleton |
151 | | - ResetInstance() |
152 | | - defer ResetInstance() // Clean up after test |
153 | | - |
154 | | - gqlClient := githubv4.NewClient(nil) |
155 | | - |
156 | | - // Get instance twice, should return the same instance |
157 | | - instance1 := GetInstance(gqlClient) |
158 | | - instance2 := GetInstance(gqlClient) |
159 | | - |
160 | | - // Verify they're the same instance (same pointer) |
161 | | - require.Same(t, instance1, instance2, "GetInstance should return the same singleton instance") |
162 | | - |
163 | | - // Verify subsequent calls with different options are ignored |
164 | | - instance3 := GetInstance(gqlClient, WithTTL(1*time.Second)) |
165 | | - require.Same(t, instance1, instance3, "GetInstance should ignore options on subsequent calls") |
166 | | - require.Equal(t, defaultRepoAccessTTL, instance3.ttl, "TTL should remain unchanged after first initialization") |
167 | | -} |
168 | | - |
169 | | -func TestResetInstanceClearsSingleton(t *testing.T) { |
170 | | - // Reset any existing singleton |
171 | | - ResetInstance() |
172 | | - defer ResetInstance() // Clean up after test |
173 | | - |
174 | | - gqlClient := githubv4.NewClient(nil) |
175 | | - |
176 | | - // Get first instance with default TTL |
177 | | - instance1 := GetInstance(gqlClient) |
178 | | - require.Equal(t, defaultRepoAccessTTL, instance1.ttl) |
179 | | - |
180 | | - // Reset the singleton |
181 | | - ResetInstance() |
182 | | - |
183 | | - // Get new instance with custom TTL |
184 | | - customTTL := 10 * time.Second |
185 | | - instance2 := GetInstance(gqlClient, WithTTL(customTTL)) |
186 | | - require.NotSame(t, instance1, instance2, "After reset, GetInstance should return a new instance") |
187 | | - require.Equal(t, customTTL, instance2.ttl, "New instance should have the custom TTL") |
188 | | -} |
189 | | - |
190 | | -func TestNewRepoAccessCacheCreatesIndependentInstances(t *testing.T) { |
191 | | - t.Parallel() |
192 | | - |
193 | | - gqlClient := githubv4.NewClient(nil) |
194 | | - |
195 | | - // NewRepoAccessCache should create independent instances |
196 | | - cache1 := NewRepoAccessCache(gqlClient, WithTTL(1*time.Second)) |
197 | | - cache2 := NewRepoAccessCache(gqlClient, WithTTL(2*time.Second)) |
198 | | - |
199 | | - require.NotSame(t, cache1, cache2, "NewRepoAccessCache should create different instances") |
200 | | - require.Equal(t, 1*time.Second, cache1.ttl) |
201 | | - require.Equal(t, 2*time.Second, cache2.ttl) |
202 | | -} |
0 commit comments