cosmos-sdk/collections/keyset_test.go
testinginprod 309ed1a4bc
feat(collections): add alternative value codec (#16773)
Co-authored-by: unknown unknown <unknown@unknown>
2023-07-04 12:40:20 +00:00

101 lines
2.6 KiB
Go

package collections
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestKeySet(t *testing.T) {
sk, ctx := deps()
schema := NewSchemaBuilder(sk)
ks := NewKeySet(schema, NewPrefix("keyset"), "keyset", StringKey)
// set
require.NoError(t, ks.Set(ctx, "A"))
require.NoError(t, ks.Set(ctx, "B"))
require.NoError(t, ks.Set(ctx, "C"))
require.NoError(t, ks.Set(ctx, "CC"))
// exists
exists, err := ks.Has(ctx, "CC")
require.NoError(t, err)
require.True(t, exists)
// remove
err = ks.Remove(ctx, "A")
require.NoError(t, err)
// non exists
exists, err = ks.Has(ctx, "A")
require.NoError(t, err)
require.False(t, exists)
// iter
iter, err := ks.Iterate(ctx, nil)
require.NoError(t, err)
// iter next
iter.Next()
// iter key
key, err := iter.Key()
require.NoError(t, err)
require.Equal(t, "C", key)
// iter keys
keys, err := iter.Keys()
require.NoError(t, err)
require.Equal(t, []string{"C", "CC"}, keys)
// validity
require.False(t, iter.Valid())
}
func Test_noValue(t *testing.T) {
require.Equal(t, noValueValueType, noValueCodec.ValueType())
require.Equal(t, noValueValueType, noValueCodec.Stringify(NoValue{}))
b, err := noValueCodec.Encode(NoValue{})
require.NoError(t, err)
require.Equal(t, []byte{}, b)
nv, err := noValueCodec.Decode(b)
require.NoError(t, err)
require.Equal(t, NoValue{}, nv)
_, err = noValueCodec.Decode([]byte("bad"))
require.ErrorIs(t, err, ErrEncoding)
}
func TestUncheckedKeySet(t *testing.T) {
sk, ctx := deps()
schema := NewSchemaBuilder(sk)
uncheckedKs := NewKeySet(schema, NewPrefix("keyset"), "keyset", StringKey, WithKeySetUncheckedValue())
ks := NewKeySet(schema, NewPrefix("keyset"), "keyset", StringKey)
// we set a NoValue unfriendly value.
require.NoError(t, sk.OpenKVStore(ctx).Set([]byte("keyset1"), []byte("A")))
require.NoError(t, sk.OpenKVStore(ctx).Set([]byte("keyset2"), []byte("B")))
// the standard KeySet errors here, because it doesn't like the fact that the value is []byte("A")
// and not []byte{}.
err := ks.Walk(ctx, nil, func(key string) (stop bool, err error) {
return true, nil
})
require.ErrorIs(t, err, ErrEncoding)
// the unchecked KeySet doesn't care about the value, so it works.
err = uncheckedKs.Walk(ctx, nil, func(key string) (stop bool, err error) {
require.Equal(t, "1", key)
return true, nil
})
require.NoError(t, err)
// now we set it again
require.NoError(t, uncheckedKs.Set(ctx, "1"))
// and we will see that the value which was []byte("A") has been cleared to be []byte{}
raw, err := sk.OpenKVStore(ctx).Get([]byte("keyset1"))
require.NoError(t, err)
require.Equal(t, []byte{}, raw)
}