store_test.gno
6.18 Kb ยท 205 lines
1package users
2
3import (
4 "std"
5 "testing"
6
7 "gno.land/p/demo/avl"
8 "gno.land/p/demo/testutils"
9 "gno.land/p/demo/uassert"
10 "gno.land/p/demo/urequire"
11)
12
13var (
14 alice = "alice"
15 aliceAddr = testutils.TestAddress(alice)
16 bob = "bob"
17 bobAddr = testutils.TestAddress(bob)
18
19 whitelistedCallerAddr = std.DerivePkgAddr(gusersv1)
20)
21
22func TestRegister(t *testing.T) {
23 testing.SetOriginCaller(whitelistedCallerAddr)
24
25 t.Run("valid_registration", func(t *testing.T) {
26 urequire.NoError(t, RegisterUser(alice, aliceAddr))
27
28 res, isLatest := ResolveName(alice)
29 uassert.Equal(t, aliceAddr, res.Addr())
30 uassert.True(t, isLatest)
31
32 res = ResolveAddress(aliceAddr)
33 uassert.Equal(t, alice, res.Name())
34 })
35
36 t.Run("invalid_inputs", func(t *testing.T) {
37 cleanStore(t)
38
39 uassert.ErrorContains(t, RegisterUser("", aliceAddr), ErrEmptyUsername.Error())
40 uassert.ErrorContains(t, RegisterUser(alice, ""), ErrInvalidAddress.Error())
41 uassert.ErrorContains(t, RegisterUser(alice, "invalidaddress"), ErrInvalidAddress.Error())
42
43 uassert.ErrorContains(t, RegisterUser("username with a space", aliceAddr), ErrInvalidUsername.Error())
44 uassert.ErrorContains(t,
45 RegisterUser("verylongusernameverylongusernameverylongusernameverylongusername1", aliceAddr),
46 ErrInvalidUsername.Error())
47 uassert.ErrorContains(t, RegisterUser("namewith^&()", aliceAddr), ErrInvalidUsername.Error())
48 })
49
50 t.Run("addr_already_registered", func(t *testing.T) {
51 cleanStore(t)
52
53 urequire.NoError(t, RegisterUser(alice, aliceAddr))
54
55 // Try registering again
56 uassert.ErrorContains(t, RegisterUser("othername", aliceAddr), ErrAlreadyHasName.Error())
57 })
58
59 t.Run("name_taken", func(t *testing.T) {
60 cleanStore(t)
61
62 urequire.NoError(t, RegisterUser(alice, aliceAddr))
63
64 // Try registering alice's name with bob's address
65 uassert.ErrorContains(t, RegisterUser(alice, bobAddr), ErrNameTaken.Error())
66 })
67
68 t.Run("user_deleted", func(t *testing.T) {
69 cleanStore(t)
70
71 urequire.NoError(t, RegisterUser(alice, aliceAddr))
72 data := ResolveAddress(aliceAddr)
73 urequire.NoError(t, data.Delete())
74
75 // Try re-registering after deletion
76 uassert.ErrorContains(t, RegisterUser("newname", aliceAddr), ErrDeletedUser.Error())
77 })
78
79 t.Run("address_lookalike", func(t *testing.T) {
80 cleanStore(t)
81
82 // Address as username
83 uassert.ErrorContains(t, RegisterUser("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", aliceAddr), ErrNameLikeAddress.Error())
84 // Beginning of address as username
85 uassert.ErrorContains(t, RegisterUser("g1jg8mtutu9khhfwc4nxmu", aliceAddr), ErrNameLikeAddress.Error())
86 uassert.NoError(t, RegisterUser("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5longerthananaddress", aliceAddr))
87 })
88}
89
90func TestUpdateName(t *testing.T) {
91 testing.SetOriginCaller(whitelistedCallerAddr)
92 t.Run("valid_direct_alias", func(t *testing.T) {
93 cleanStore(t)
94
95 urequire.NoError(t, RegisterUser(alice, aliceAddr))
96 data := ResolveAddress(aliceAddr)
97 uassert.NoError(t, data.UpdateName("alice1"))
98 })
99
100 t.Run("valid_double_alias", func(t *testing.T) {
101 cleanStore(t)
102
103 urequire.NoError(t, RegisterUser(alice, aliceAddr))
104 data := ResolveAddress(aliceAddr)
105 uassert.NoError(t, data.UpdateName("alice2"))
106 uassert.NoError(t, data.UpdateName("alice3"))
107 uassert.Equal(t, ResolveAddress(aliceAddr).username, "alice3")
108 })
109
110 t.Run("name_taken", func(t *testing.T) {
111 cleanStore(t)
112
113 urequire.NoError(t, RegisterUser(alice, aliceAddr))
114
115 data := ResolveAddress(aliceAddr)
116 uassert.Error(t, data.UpdateName(alice), ErrNameTaken.Error())
117 })
118
119 t.Run("alias_before_name", func(t *testing.T) {
120 cleanStore(t)
121 data := ResolveAddress(aliceAddr) // not registered
122
123 uassert.ErrorContains(t, data.UpdateName(alice), ErrUserNotExistOrDeleted.Error())
124 })
125
126 t.Run("alias_after_delete", func(t *testing.T) {
127 cleanStore(t)
128
129 urequire.NoError(t, RegisterUser(alice, aliceAddr))
130 data := ResolveAddress(aliceAddr)
131 urequire.NoError(t, data.Delete())
132
133 data = ResolveAddress(aliceAddr)
134 uassert.ErrorContains(t, data.UpdateName("newalice"), ErrUserNotExistOrDeleted.Error())
135 })
136
137 t.Run("invalid_inputs", func(t *testing.T) {
138 cleanStore(t)
139
140 urequire.NoError(t, RegisterUser(alice, aliceAddr))
141 data := ResolveAddress(aliceAddr)
142
143 uassert.ErrorContains(t, data.UpdateName(""), ErrEmptyUsername.Error())
144 uassert.ErrorContains(t, data.UpdateName("username with a space"), ErrInvalidUsername.Error())
145 uassert.ErrorContains(t,
146 data.UpdateName("verylongusernameverylongusernameverylongusernameverylongusername1"),
147 ErrInvalidUsername.Error())
148 uassert.ErrorContains(t, data.UpdateName("namewith^&()"), ErrInvalidUsername.Error())
149 })
150
151 t.Run("address_lookalike", func(t *testing.T) {
152 cleanStore(t)
153
154 urequire.NoError(t, RegisterUser(alice, aliceAddr))
155 data := ResolveAddress(aliceAddr)
156
157 // Address as username
158 uassert.ErrorContains(t, data.UpdateName("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), ErrNameLikeAddress.Error())
159 // Beginning of address as username
160 uassert.ErrorContains(t, data.UpdateName("g1jg8mtutu9khhfwc4nxmu"), ErrNameLikeAddress.Error())
161 uassert.NoError(t, data.UpdateName("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5longerthananaddress"))
162 })
163}
164
165func TestDelete(t *testing.T) {
166 testing.SetOriginCaller(whitelistedCallerAddr)
167
168 t.Run("non_existent_user", func(t *testing.T) {
169 cleanStore(t)
170
171 data := ResolveAddress(testutils.TestAddress("unregistered"))
172 uassert.ErrorContains(t, data.Delete(), ErrUserNotExistOrDeleted.Error())
173 })
174
175 t.Run("double_delete", func(t *testing.T) {
176 cleanStore(t)
177
178 urequire.NoError(t, RegisterUser(alice, aliceAddr))
179 data := ResolveAddress(aliceAddr)
180 urequire.NoError(t, data.Delete())
181 data = ResolveAddress(aliceAddr)
182 uassert.ErrorContains(t, data.Delete(), ErrUserNotExistOrDeleted.Error())
183 })
184
185 t.Run("valid_delete", func(t *testing.T) {
186 cleanStore(t)
187
188 urequire.NoError(t, RegisterUser(alice, aliceAddr))
189 data := ResolveAddress(aliceAddr)
190 uassert.NoError(t, data.Delete())
191
192 resolved1, _ := ResolveName(alice)
193 uassert.Equal(t, nil, resolved1)
194 uassert.Equal(t, nil, ResolveAddress(aliceAddr))
195 })
196}
197
198// cleanStore should not be needed, as vm store should be reset after each test.
199// Reference: https://github.com/gnolang/gno/issues/1982
200func cleanStore(t *testing.T) {
201 t.Helper()
202
203 nameStore = avl.NewTree()
204 addressStore = avl.NewTree()
205}