github.com/argoproj/argo-cd/v3@v3.2.1/util/cache/cache_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/alicebob/miniredis/v2"
     8  	"github.com/redis/go-redis/v9"
     9  	"github.com/spf13/cobra"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/argoproj/argo-cd/v3/common"
    14  )
    15  
    16  func TestAddCacheFlagsToCmd(t *testing.T) {
    17  	cache, err := AddCacheFlagsToCmd(&cobra.Command{})()
    18  	require.NoError(t, err)
    19  	assert.Equal(t, 24*time.Hour, cache.client.(*redisCache).expiration)
    20  }
    21  
    22  func NewInMemoryRedis() (*redis.Client, func()) {
    23  	mr, err := miniredis.Run()
    24  	if err != nil {
    25  		panic(err)
    26  	}
    27  	return redis.NewClient(&redis.Options{Addr: mr.Addr()}), mr.Close
    28  }
    29  
    30  func TestCacheClient(t *testing.T) {
    31  	clientRedis, stopRedis := NewInMemoryRedis()
    32  	defer stopRedis()
    33  	redisCache := NewRedisCache(clientRedis, 5*time.Second, RedisCompressionNone)
    34  	clientMemCache := NewInMemoryCache(60 * time.Second)
    35  	twoLevelClient := NewTwoLevelClient(redisCache, 5*time.Second)
    36  	// Run tests for both Redis and InMemoryCache
    37  	for _, client := range []CacheClient{clientMemCache, redisCache, twoLevelClient} {
    38  		cache := NewCache(client)
    39  		t.Run("SetItem", func(t *testing.T) {
    40  			err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false})
    41  			require.NoError(t, err)
    42  			var output string
    43  			err = cache.GetItem("foo", &output)
    44  			require.NoError(t, err)
    45  			assert.Equal(t, "bar", output)
    46  		})
    47  		t.Run("SetCacheItem W/Disable Overwrite", func(t *testing.T) {
    48  			err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false})
    49  			require.NoError(t, err)
    50  			var output string
    51  			err = cache.GetItem("foo", &output)
    52  			require.NoError(t, err)
    53  			assert.Equal(t, "bar", output)
    54  			err = cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false})
    55  			require.NoError(t, err)
    56  			err = cache.GetItem("foo", &output)
    57  			require.NoError(t, err)
    58  			assert.Equal(t, "bar", output, "output should not have changed with DisableOverwrite set to true")
    59  		})
    60  		t.Run("GetItem", func(t *testing.T) {
    61  			var val string
    62  			err := cache.GetItem("foo", &val)
    63  			require.NoError(t, err)
    64  			assert.Equal(t, "bar", val)
    65  		})
    66  		t.Run("DeleteItem", func(t *testing.T) {
    67  			err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 0, Delete: true})
    68  			require.NoError(t, err)
    69  			var val string
    70  			err = cache.GetItem("foo", &val)
    71  			require.Error(t, err)
    72  			assert.Empty(t, val)
    73  		})
    74  		t.Run("Check for nil items", func(t *testing.T) {
    75  			err := cache.SetItem("foo", nil, &CacheActionOpts{Expiration: 0, Delete: true})
    76  			require.ErrorContains(t, err, "cannot set nil item")
    77  			err = cache.GetItem("foo", nil)
    78  			assert.ErrorContains(t, err, "cannot get item")
    79  		})
    80  	}
    81  }
    82  
    83  // Smoke test to ensure key changes aren't done accidentally
    84  func TestGenerateCacheKey(t *testing.T) {
    85  	client := NewInMemoryCache(60 * time.Second)
    86  	cache := NewCache(client)
    87  	testKey := cache.generateFullKey("testkey")
    88  	assert.Equal(t, "testkey|"+common.CacheVersion, testKey)
    89  }