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}