//nolint:perfsprint // Not that concerned about microoptimizations for test code package ezcache_test import ( "fmt" "testing" "time" "codeberg.org/danjones000/ezcache" "github.com/stretchr/testify/assert" ) 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) assert.NoError(t, err) assert.NotNil(t, cache) } func TestNewNilFetcher(t *testing.T) { cache, err := ezcache.New[uint8, string](nil, 1) assert.ErrorIs(t, err, ezcache.ErrInvalidFetcher) assert.Nil(t, cache) } 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) assert.ErrorIs(t, err, ezcache.ErrInvalidExpiry) assert.Nil(t, cache) }) } } 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) assert.NoError(t, err) assert.Equal(t, "4", val) assert.True(t, hit) hit = false val, err = cache.Get(4) assert.NoError(t, err) assert.Equal(t, "4", val) assert.False(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) assert.NoError(t, err) assert.Equal(t, "4", val) assert.True(t, hit) hit = false time.Sleep(2 * time.Nanosecond) val, err = cache.Get(4) assert.NoError(t, err) assert.Equal(t, "4", val) assert.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) assert.ErrorContains(t, err, "Nope for 4") }