diff --git a/pkg/redis/redisstore.go b/pkg/redis/redisstore.go index 9679e2d..f0a117f 100644 --- a/pkg/redis/redisstore.go +++ b/pkg/redis/redisstore.go @@ -91,14 +91,19 @@ func (rs *Store[Key, Value]) SetExpirable(ctx context.Context, key Key, expires } // Members returns all deserialized set values from redis. +// If the key does not exist, it returns ErrKeyNotFound. func (rs *Store[Key, Value]) Members(ctx context.Context, key Key) ([]Value, error) { data, err := rs.client.SMembers(ctx, rs.keyString(key)).Result() if err != nil { - if err == redis.Nil { - return nil, types.ErrKeyNotFound - } return nil, fmt.Errorf("getting set members: %w", err) } + + // as opposed to other commands, SMembers doesn't return redis.Nil when the key doesn't exist, but an empty set + // this implementation assumes there is no need to differentiate between a non-existing key and an empty set + if len(data) == 0 { + return nil, types.ErrKeyNotFound + } + var values []Value for _, d := range data { v, err := rs.fromRedis(d) diff --git a/pkg/redis/redisstore_test.go b/pkg/redis/redisstore_test.go index 13b20b4..1756c18 100644 --- a/pkg/redis/redisstore_test.go +++ b/pkg/redis/redisstore_test.go @@ -334,7 +334,8 @@ func (m *MockRedis) SMembers(ctx context.Context, key string) *goredis.StringSli } val, ok := m.data[key] if !ok { - cmd.SetErr(goredis.Nil) + // SMembers returns an empty set for non-existing keys + cmd.SetVal([]string{}) } else { values := slices.Collect(maps.Keys(val.data)) cmd.SetVal(values)