feat(infra): implement zero-dependency pure in-memory cache plugin

This commit is contained in:
ryan
2026-08-28 15:11:46 +08:00
parent acad091127
commit 98d2c1cbd0
3 changed files with 249 additions and 0 deletions
@@ -0,0 +1,82 @@
// Copyright 2026 Arctel.net
// SPDX-License-Identifier: Apache-2.0
package cache_memory_test
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/infra/cache_memory"
)
func TestCacheMemoryPlugin(t *testing.T) {
ctx := core.NewContext(context.Background())
p := cache_memory.New(cache_memory.WithCapacity(100))
assert.Equal(t, "cache_memory", p.Name())
assert.Equal(t, "1.0.0", p.Manifest().Version)
require.NoError(t, p.Apply(ctx))
cacheSvc, err := core.Inject[contracts.CacheService](ctx)
require.NoError(t, err)
require.NotNil(t, cacheSvc)
reqCtx := context.Background()
// 1. Get non-existent
var target string
err = cacheSvc.Get(reqCtx, "non_existent", &target)
assert.ErrorIs(t, err, contracts.ErrCacheMiss)
// 2. Set and Get
err = cacheSvc.Set(reqCtx, "user:100", "Alice", 10*time.Minute)
require.NoError(t, err)
var name string
err = cacheSvc.Get(reqCtx, "user:100", &name)
require.NoError(t, err)
assert.Equal(t, "Alice", name)
// 3. GetOrSet
var count int
var loaded int
loader := func() (any, error) {
loaded++
return 42, nil
}
err = cacheSvc.GetOrSet(reqCtx, "counter", &count, 10*time.Minute, loader)
require.NoError(t, err)
assert.Equal(t, 42, count)
assert.Equal(t, 1, loaded)
// Second GetOrSet hits cache
var count2 int
err = cacheSvc.GetOrSet(reqCtx, "counter", &count2, 10*time.Minute, loader)
require.NoError(t, err)
assert.Equal(t, 42, count2)
assert.Equal(t, 1, loaded)
// 4. Delete & Invalidate
require.NoError(t, cacheSvc.Delete(reqCtx, "user:100"))
err = cacheSvc.Get(reqCtx, "user:100", &name)
assert.ErrorIs(t, err, contracts.ErrCacheMiss)
require.NoError(t, cacheSvc.Invalidate(reqCtx, "counter"))
err = cacheSvc.Get(reqCtx, "counter", &count)
assert.ErrorIs(t, err, contracts.ErrCacheMiss)
// 5. Expiration
err = cacheSvc.Set(reqCtx, "temp_key", "val", 50*time.Millisecond)
require.NoError(t, err)
time.Sleep(70 * time.Millisecond)
var tempVal string
err = cacheSvc.Get(reqCtx, "temp_key", &tempVal)
assert.ErrorIs(t, err, contracts.ErrCacheMiss)
}