users_test.gno

5.25 Kb ยท 216 lines
  1package users
  2
  3import (
  4	"std"
  5	"strconv"
  6	"testing"
  7
  8	"gno.land/p/demo/uassert"
  9	"gno.land/p/demo/urequire"
 10)
 11
 12func TestResolveName(t *testing.T) {
 13	testing.SetRealm(std.NewCodeRealm(gUsersV1Path))
 14
 15	t.Run("single_name", func(t *testing.T) {
 16		cleanStore(t)
 17
 18		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 19
 20		res, isLatest := ResolveName(alice)
 21		uassert.Equal(t, aliceAddr, res.Addr())
 22		uassert.Equal(t, alice, res.Name())
 23		uassert.True(t, isLatest)
 24	})
 25
 26	t.Run("name+Alias", func(t *testing.T) {
 27		cleanStore(t)
 28
 29		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 30		data, _ := ResolveName(alice)
 31		urequire.NoError(t, data.UpdateName("alice1"))
 32
 33		res, isLatest := ResolveName("alice1")
 34		urequire.NotEqual(t, nil, res)
 35
 36		uassert.Equal(t, aliceAddr, res.Addr())
 37		uassert.Equal(t, "alice1", res.Name())
 38		uassert.True(t, isLatest)
 39	})
 40
 41	t.Run("multiple_aliases", func(t *testing.T) {
 42		cleanStore(t)
 43
 44		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 45
 46		// RegisterUser and check each Alias
 47		var names []string
 48		names = append(names, alice)
 49		for i := 0; i < 5; i++ {
 50			alias := "alice" + strconv.Itoa(i)
 51			names = append(names, alias)
 52
 53			data, _ := ResolveName(alice)
 54			urequire.NoError(t, data.UpdateName(alias))
 55		}
 56
 57		for _, alias := range names {
 58			res, _ := ResolveName(alias)
 59			urequire.NotEqual(t, nil, res)
 60
 61			uassert.Equal(t, aliceAddr, res.Addr())
 62			uassert.Equal(t, "alice4", res.Name())
 63		}
 64	})
 65}
 66
 67func TestResolveAddress(t *testing.T) {
 68	testing.SetRealm(std.NewCodeRealm(gUsersV1Path))
 69
 70	t.Run("single_name", func(t *testing.T) {
 71		cleanStore(t)
 72
 73		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 74
 75		res := ResolveAddress(aliceAddr)
 76
 77		uassert.Equal(t, aliceAddr, res.Addr())
 78		uassert.Equal(t, alice, res.Name())
 79	})
 80
 81	t.Run("name+Alias", func(t *testing.T) {
 82		cleanStore(t)
 83
 84		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 85		data, _ := ResolveName(alice)
 86		urequire.NoError(t, data.UpdateName("alice1"))
 87
 88		res := ResolveAddress(aliceAddr)
 89		urequire.NotEqual(t, nil, res)
 90
 91		uassert.Equal(t, aliceAddr, res.Addr())
 92		uassert.Equal(t, "alice1", res.Name())
 93	})
 94
 95	t.Run("multiple_aliases", func(t *testing.T) {
 96		cleanStore(t)
 97
 98		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
 99
100		// RegisterUser and check each Alias
101		var names []string
102		names = append(names, alice)
103
104		for i := 0; i < 5; i++ {
105			alias := "alice" + strconv.Itoa(i)
106			names = append(names, alias)
107			data, _ := ResolveName(alice)
108			urequire.NoError(t, data.UpdateName(alias))
109		}
110
111		res := ResolveAddress(aliceAddr)
112		uassert.Equal(t, aliceAddr, res.Addr())
113		uassert.Equal(t, "alice4", res.Name())
114	})
115}
116
117func TestROStores(t *testing.T) {
118	testing.SetRealm(std.NewCodeRealm(gUsersV1Path))
119	cleanStore(t)
120
121	urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
122	roNS := GetReadOnlyNameStore()
123	roAS := GetReadonlyAddrStore()
124
125	t.Run("get user data", func(t *testing.T) {
126		// Name store
127		aliceDataRaw, ok := roNS.Get(alice)
128		uassert.True(t, ok)
129
130		roData, ok := aliceDataRaw.(*UserData)
131		uassert.True(t, ok, "Could not cast data from RO tree to UserData")
132
133		// Try to modify data
134		roData.Delete()
135		raw, ok := nameStore.Get(alice)
136		uassert.False(t, raw.(*UserData).deleted)
137
138		// Addr store
139		aliceDataRaw, ok = roAS.Get(aliceAddr.String())
140		uassert.True(t, ok)
141
142		roData, ok = aliceDataRaw.(*UserData)
143		uassert.True(t, ok, "Could not cast data from RO tree to UserData")
144
145		// Try to modify data
146		roData.Delete()
147		raw, ok = nameStore.Get(alice)
148		uassert.False(t, raw.(*UserData).deleted)
149	})
150
151	t.Run("get deleted data", func(t *testing.T) {
152		raw, _ := nameStore.Get(alice)
153		aliceData := raw.(*UserData)
154
155		urequire.NoError(t, aliceData.Delete())
156		urequire.True(t, aliceData.IsDeleted())
157
158		// Should be nil because of makeSafeFn
159		rawRoData, ok := roNS.Get(alice)
160		// uassert.False(t, ok)
161		// XXX: not sure what to do here, as the tree technically has the data so returns ok
162		// However the data is intercepted and something else (nil in this case) is returned.
163		// should we handle this somehow?
164
165		uassert.Equal(t, rawRoData, nil)
166		_, ok = rawRoData.(*UserData) // shouldn't be castable
167		uassert.False(t, ok)
168	})
169}
170
171func TestResolveAny(t *testing.T) {
172	testing.SetRealm(std.NewCodeRealm(gUsersV1Path))
173
174	t.Run("name", func(t *testing.T) {
175		cleanStore(t)
176
177		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
178
179		res, _ := ResolveAny(alice)
180
181		uassert.Equal(t, aliceAddr, res.Addr())
182		uassert.Equal(t, alice, res.Name())
183	})
184
185	t.Run("address", func(t *testing.T) {
186		cleanStore(t)
187
188		urequire.NoError(t, cross(RegisterUser)(alice, aliceAddr))
189
190		res, _ := ResolveAny(aliceAddr.String())
191
192		uassert.Equal(t, aliceAddr, res.Addr())
193		uassert.Equal(t, alice, res.Name())
194	})
195
196	t.Run("not_registered", func(t *testing.T) {
197		cleanStore(t)
198
199		res, _ := ResolveAny(aliceAddr.String())
200
201		uassert.Equal(t, nil, res)
202	})
203}
204
205// TODO Uncomment after gnoweb /u/ page.
206//func TestUserRenderLink(t *testing.T) {
207//	testing.SetOriginCaller(whitelistedCallerAddr)
208//	cleanStore(t)
209//
210//	urequire.NoError(t, RegisterUser(alice, aliceAddr))
211//
212//	data, _ := ResolveName(alice)
213//	uassert.Equal(t, data.RenderLink(""), ufmt.Sprintf("[@%s](/u/%s)", alice, alice))
214//	text := "my link text!"
215//	uassert.Equal(t, data.RenderLink(text), ufmt.Sprintf("[%s](/u/%s)", text, alice))
216//}