Files
graphql-monitoring-proxy/cache/redis/redis_test.go
T
lukaszraczylo cff11f2b25 fix(redis): namespace cache keys when no prefix is set
With an empty prefix, Clear deleted every key in the Redis database, including keys of other applications. Cache keys now start with gmp: by default. Existing cache entries become unreachable after the upgrade and expire by TTL.
2026-11-03 00:49:02 +00:00

159 lines
5.2 KiB
Go

package libpack_cache_redis
import (
"testing"
"time"
"github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)
type RedisConfigSuite struct {
suite.Suite
redisConfig *RedisConfig
redis_server *miniredis.Miniredis
}
func (suite *RedisConfigSuite) SetupTest() {
suite.redis_server, _ = miniredis.Run()
var err error
suite.redisConfig, err = New(&RedisClientConfig{
RedisServer: suite.redis_server.Addr(),
RedisPassword: "",
RedisDB: 0,
})
assert.NoError(suite.T(), err)
suite.redisConfig.Delete("testkey")
}
func TestRedisConfigSuite(t *testing.T) {
suite.Run(t, new(RedisConfigSuite))
}
func (suite *RedisConfigSuite) TestSet() {
key := "testkeyset"
value := []byte("testvalue")
suite.redisConfig.Delete(key) // Ensure the key is deleted before the test
// Test writing a new key-value pair
err := suite.redisConfig.Set(key, value, 0)
assert.NoError(suite.T(), err)
storedValue, found, err := suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found)
assert.Equal(suite.T(), value, storedValue)
// Test overwriting an existing key-value pair
newValue := []byte("newvalue")
err = suite.redisConfig.Set(key, newValue, 0)
assert.NoError(suite.T(), err)
storedValue, found, err = suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found)
assert.Equal(suite.T(), newValue, storedValue)
suite.redisConfig.Delete(key) // Clean up after the test
}
func (suite *RedisConfigSuite) TestSetWithExpiry() {
key := "testkey_with_expiry"
value := []byte("testvaluewithexpiry")
expiry := 2 * time.Second
suite.redisConfig.Delete(key) // Ensure the key is deleted before the test
// Test writing a new key-value pair
err := suite.redisConfig.Set(key, value, expiry)
assert.NoError(suite.T(), err)
storedValue, found, err := suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found)
assert.Equal(suite.T(), value, storedValue)
_, found, err = suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found, "Key should exist")
// Test that key expires after the specified time
suite.redis_server.FastForward(3 * time.Second)
_, found, err = suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.False(suite.T(), found, "Key should have expired after 2 seconds")
suite.redisConfig.Delete(key) // Clean up after the test
}
func (suite *RedisConfigSuite) TestGet() {
key := "testkeyget"
value := []byte("testvalue")
err := suite.redisConfig.Set(key, value, 0) // Set the key-value pair
assert.NoError(suite.T(), err)
storedValue, found, err := suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found)
assert.Equal(suite.T(), value, storedValue)
}
func (suite *RedisConfigSuite) TestDeleteKey() {
key := "testkeydelete"
value := []byte("testvalue")
err := suite.redisConfig.Set(key, value, 0) // Set the key-value pair
assert.NoError(suite.T(), err)
err = suite.redisConfig.Delete(key)
assert.NoError(suite.T(), err)
_, found, err := suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.False(suite.T(), found)
}
func (suite *RedisConfigSuite) TestCheckIfKeyExists() {
ttl := time.Duration(10) * time.Second
key := "testkeyifexists"
value := []byte("testvalue")
err := suite.redisConfig.Set(key, value, ttl) // Set the key-value pair
assert.NoError(suite.T(), err)
_, found, err := suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.True(suite.T(), found)
err = suite.redisConfig.Delete(key)
assert.NoError(suite.T(), err)
_, found, err = suite.redisConfig.Get(key)
assert.NoError(suite.T(), err)
assert.False(suite.T(), found)
}
func (suite *RedisConfigSuite) TestGetKeys() {
ttl := time.Duration(10) * time.Second
err := suite.redisConfig.Set("testkey1", []byte("testvalue1"), ttl)
assert.NoError(suite.T(), err)
err = suite.redisConfig.Set("testkey2", []byte("testvalue2"), ttl)
assert.NoError(suite.T(), err)
err = suite.redisConfig.Set("otherkey", []byte("othervalue"), ttl)
assert.NoError(suite.T(), err)
keys, _ := suite.redisConfig.client.Keys(suite.redisConfig.ctx, DefaultKeyPrefix+"testkey*").Result()
expectedKeys := []string{DefaultKeyPrefix + "testkey1", DefaultKeyPrefix + "testkey2"}
assert.ElementsMatch(suite.T(), expectedKeys, keys)
suite.redisConfig.client.Del(suite.redisConfig.ctx, DefaultKeyPrefix+"testkey1", DefaultKeyPrefix+"testkey2", DefaultKeyPrefix+"otherkey")
}
func (suite *RedisConfigSuite) TestGetKeysCount() {
ttl := time.Duration(10) * time.Second
suite.redisConfig.Set("testkey1", []byte("testvalue1"), ttl)
suite.redisConfig.Set("testkey2", []byte("testvalue2"), ttl)
suite.redisConfig.Set("otherkey", []byte("othervalue"), ttl)
count1, err := suite.redisConfig.CountQueriesWithPattern("testkey*")
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), 2, count1)
count2, err := suite.redisConfig.CountQueriesWithPattern("otherkey*")
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), 1, count2)
count3, err := suite.redisConfig.CountQueries()
assert.NoError(suite.T(), err)
assert.Equal(suite.T(), int64(3), count3)
suite.redisConfig.client.Del(suite.redisConfig.ctx, DefaultKeyPrefix+"testkey1", DefaultKeyPrefix+"testkey2", DefaultKeyPrefix+"otherkey")
}