forked from cosmos/cosmos-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeyset_test.go
100 lines (80 loc) · 2.6 KB
/
keyset_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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)
}