package identitycache import ( "sort" "testing" "time" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) func TestBoltBackendWalkIncludesExpiredEntriesUntilPrune(t *testing.T) { ctx := t.Context() now := time.Now().UTC() backend, err := NewBoltDBBackend(t.TempDir()) assert.NilError(t, err) defer backend.Close() boltbk := backend.(*boltBackend) assert.NilError(t, boltbk.Store(ctx, "fresh", Entry{ CachedAt: now.Add(-time.Minute), ExpiresAt: now.Add(time.Hour), }, now)) assert.NilError(t, boltbk.Store(ctx, "expired", Entry{ CachedAt: now.Add(-2 * time.Hour), ExpiresAt: now.Add(-time.Minute), }, now)) var keys []string assert.NilError(t, boltbk.Walk(ctx, now, func(cacheKey string, _ Entry) error { keys = append(keys, cacheKey) return nil })) sort.Strings(keys) assert.Check(t, is.DeepEqual(keys, []string{"expired", "fresh"})) assert.NilError(t, boltbk.PruneExpired(ctx, now)) keys = nil assert.NilError(t, boltbk.Walk(ctx, now, func(cacheKey string, _ Entry) error { keys = append(keys, cacheKey) return nil })) assert.Check(t, is.DeepEqual(keys, []string{"fresh"})) } func TestBoltBackendLoadExpiredReturnsMissWithoutDelete(t *testing.T) { ctx := t.Context() now := time.Now().UTC() backend, err := NewBoltDBBackend(t.TempDir()) assert.NilError(t, err) defer backend.Close() boltbk := backend.(*boltBackend) assert.NilError(t, boltbk.Store(ctx, "expired", Entry{ CachedAt: now.Add(-2 * time.Hour), ExpiresAt: now.Add(-time.Minute), }, now)) _, ok, err := boltbk.Load(ctx, "expired", now) assert.NilError(t, err) assert.Check(t, !ok) seen := false assert.NilError(t, boltbk.Walk(ctx, now, func(cacheKey string, _ Entry) error { if cacheKey == "expired" { seen = true } return nil })) assert.Check(t, seen) }