mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-03 15:06:36 +08:00
feat(infra): implement zero-dependency pure in-memory cache plugin
This commit is contained in:
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user