//nolint:perfsprint // Not that concerned about microoptimizations for test code package ezcache_test import ( "fmt" "testing" "time" "codeberg.org/danjones000/ezcache" "github.com/nalgeon/be" ) var fetcher ezcache.Fetcher[uint8, string] = func(key uint8) (string, error) { return fmt.Sprintf("%d", key), nil } func TestNewHappy(t *testing.T) { cache, err := ezcache.New(fetcher, 1) be.Err(t, err, nil) be.True(t, cache != nil) } func TestNewNilFetcher(t *testing.T) { cache, err := ezcache.New[uint8, string](nil, 1) be.Err(t, err, ezcache.ErrInvalidFetcher) be.True(t, cache == nil) } func TestNewBadExpiry(tt *testing.T) { testcases := []struct { name string exp time.Duration }{ {"zero", 0}, {"negative", -5}, } for _, tc := range testcases { tt.Run(tc.name, func(t *testing.T) { cache, err := ezcache.New(fetcher, tc.exp) be.Err(t, err, ezcache.ErrInvalidExpiry) be.True(t, cache == nil) }) } } func TestGetHappy(t *testing.T) { var hit bool cache, _ := ezcache.New(func(key uint8) (string, error) { hit = true; return fetcher(key) }, 5*time.Second) val, err := cache.Get(4) be.Err(t, err, nil) be.Equal(t, val, "4") be.True(t, hit) hit = false val, err = cache.Get(4) be.Err(t, err, nil) be.Equal(t, val, "4") be.True(t, !hit) } func TestGetExpire(t *testing.T) { var hit bool cache, _ := ezcache.New(func(key uint8) (string, error) { hit = true; return fetcher(key) }, 1) val, err := cache.Get(4) be.Err(t, err, nil) be.Equal(t, val, "4") be.True(t, hit) hit = false time.Sleep(2 * time.Nanosecond) val, err = cache.Get(4) be.Err(t, err, nil) be.Equal(t, val, "4") be.True(t, hit) } func TestGetError(t *testing.T) { //nolint:err113 // It's just a test for an error. cache, _ := ezcache.New(func(k uint8) (byte, error) { return 0, fmt.Errorf("Nope for %d", k) }, 1) _, err := cache.Get(4) be.Err(t, err, "Nope for 4") }