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