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//}