users_test.gno

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